C++演算法之線性結構處理的程式碼

post200發表於2021-09-09


把內容過程中比較好的一些內容段做個珍藏,下邊內容是關於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型別的記憶體分配形式,每次分配和釋放的時候都檢查記憶體是否越界、是否沒有成對執行,注意需要新增對應的判斷函式

©著作權歸作者所有:來自51CTO部落格作者redsunn的原創作品,如需轉載,請註明出處,否則將追究法律責任


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2249/viewspace-2819695/,如需轉載,請註明出處,否則將追究法律責任。

相關文章