一步一步寫演算法(之線性結構的處理)

來源:互聯網
上載者:User

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】

    我們知道,在記憶體中的空間都是連續的。也就是說,0x00000001下面的地址必然是0x00000002。所以,空間上是不會出現地址的突變的。那什麼資料結構類型是連續內部空間呢,其實就是數組,當然也可以是堆。數組有很多優勢,它可以在一段連續空間內儲存相同類型的資料,並且對這些資料進行管理。所以從這個意義上說,掌握了數組才能說明你資料結構入門了。

    那麼,在實際開發中,我們對線性結構應該注意些什麼呢?我個人的觀點:

    (1)數組的資源是有限的,必須確定資源的範圍

    (2)數組中資源的申請和釋放必須一一對應,否則很容易造成資源泄漏的現象

    (3)數組中的注意事項同樣應用於堆分配的連續記憶體資源空間中

    下面是自己設計的一個int分配的小程式,大家可以一起嘗試一下:

    a)設計記憶體節點的資料形式

typedef struct _DATA_NODE{int* pData;char* pFlag;int num;}DATA_NODE;#define STATUS int#define TRUE 1#define FALSE 0

   
b)建立記憶體節點

DATA_NODE* malloc_node(int number){DATA_NODE* pDataNode = NULL;if(0 == number)return NULL;pDataNode = (DATA_NODE*) malloc(sizeof(DATA_NODE));assert(NULL != pDataNode);memset(pDataNode, 0, sizeof(DATA_NODE));pDataNode->pData = (int*)malloc(sizeof(int) * number);if(NULL == pDataNode->pData){free(pDataNode);return NULL;}pDataNode->pFlag = (char*) malloc( (number + 7) >> 3);if(NULL == pDataNode->pFlag){free(pDataNode->pData);free(pDataNode);return NULL;}memset(pDataNode->pData, 0, sizeof(int) * number);memset(pDataNode->pFlag, 0, (number + 7) >> 3);pDataNode->num = number;return pDataNode;}

   
c) 刪除記憶體節點

STATUS free_node(const DATA_NODE* pDataNode){if(NULL == pDataNode)return FALSE;assert(NULL != pDataNode ->pData);assert(NULL != pDataNode-> pFlag);assert(0 != pDataNode);free(pDataNode->pFlag);free(pDataNode->pData);free((void*)pDataNode);return TRUE;}

    d)判斷當前是否還有記憶體可以分配

int check_if_data_exist(const DATA_NODE* pDataNode){int number = pDataNode->num;char* pFlag = pDataNode->pFlag;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* alloca_data(const DATA_NODE* pDataNode){int* pData = NULL;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)回收記憶體空間

STATUS free_data(const DATA_NODE* pDataNode, const int* pData){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_free_space(const DATA_NODE* pDataNode){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類型的記憶體配置形式,每次分配和釋放的時候都檢查記憶體是否越界、是否沒有成對運行,注意需要添加對應的判斷函數

【預告: 下面一篇部落格介紹隊列線性表】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.