C++算法之線性結構處理的代碼

把內容過程中比較好的一些內容段做個珍藏,下邊內容是關於C++算法之線性結構處理的內容。


typedef struct _DATA_NODE  
{  
    int num;  
}DATA_NODE;  

#define STATUS int  
#define TRUE 1  
#define FALSE 0  

b)創建內存節點


{  
    if(0 == number)  
        return NULL;  

    assert(NULL != pDataNode);  
    memset(pDataNode, 0, sizeof(DATA_NODE));  

    if(NULL == pDataNode->pData){  
        free(pDataNode);  
        return NULL;  
    }  

    if(NULL == pDataNode->pFlag){  
        free(pDataNode->pData);  
        free(pDataNode);  
        return NULL;  
    }  

    memset(pDataNode->pFlag, 0, (number + 7) >> 3);  
    pDataNode->num = number;  
    return pDataNode;  
}  

c)刪除內存節點

{  
    if(NULL == pDataNode)  
        return FALSE;  

    assert(NULL != pDataNode ->pData);  
    assert(NULL != pDataNode-> pFlag);  
    assert(0 != pDataNode);  

    free(pDataNode->pFlag);  
    free(pDataNode->pData);  
    return TRUE;  
}  

d)判斷當前是否還有內存可以分配

{  
    int number = pDataNode->num;  
    unsigned char flag = 0;  
    int loop = 1;  

    while(loop <= number){  
        flag = pFlag[(loop + 7) >> 3 - 1] & (0x1 << ((loop + 7) % 8));  
        if(0 != flag){  
            return loop;  
        }  

        loop ++;  
    }  

    return -1;  
}  

e)分配內存空間

{  
    int pos;  
    if(NULL == pDataNode)  
        return NULL;  

    if(-1 == (pos = check_if_data_exist(pDataNode)))  
        return NULL;  

    pDataNode->pFlag[(pos + 7) >> 3 - 1] |= 0x1 << ((pos + 7)% 8);  
    return pDataNode->pData + (pos - 1);  
}  

f)回收內存空間

{  
    int pos = 0;  
    if(NULL == pDataNode || NULL == pData)  
        return FALSE;  

    if(pData < pDataNode->pData || pData > (pDataNode->pData + pDataNode->num))  
        return FALSE;  

    pos = (pData - pDataNode->pData) >> 3;  
    pDataNode->pFlag[(pos + 7) -1]  &= ~(0x1 << ((pos + 7) % 8));  
    return TRUE;  
}  

g)統計當前已經分配了多少DWORD空間


{  
    int count = 0;  
    int loop = 1;  
    char flag = 0;  
    if(NULL == pDataNode)  
        return 0;  

    for(; loop <= pDataNode->num; loop++)  
    {  
        flag = pDataNode->pFlag[(loop + 7) >> 3 - 1] & (0x1 << ((loop + 7) % 8));  
        if(0 == flag){  
            count ++;  
        }  
    }  

    return count;  
}  

上面的代碼只是一個示範,大家可以在這個基礎之上加以改進,比如說:(1)修改成可以自由分配很多內存,注意需要同時修改flag的結構類型(2)修改成先到先得的內存分配類型(3)修改成最合適空間的內存分配類型(4)修改成debug類型的內存分配形式,每次分配和釋放的時候都檢查內存是否越界、是否沒有成對運行,注意需要添加對應的判斷函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章