單陣列實現雙向鍊錶和記憶體管理 資源池

2021-07-07 04:19:56 字數 1263 閱讀 5822

單陣列實現雙向鍊錶,鍊錶分為 已使用部分和 空閒部分,通過兩個變數記錄頭結點來標示。申請記憶體時從空閒部分把對應結點移入已使用部分,釋放時相反。申請記憶體時是從free空間裡面順序提取,所以該部分只需要使用到單向鍊錶的功能就行,釋放時,位置不定,需要使用到雙向鍊錶的功能。

#include #include int free_index;

int work_index;

#define getkey(l, k, val) ( (val) = (l)[( (k) - 1 ) * 3 + 1] )

#define getprev(l, k, val) ( (val) = (l)[( (k) - 1 ) * 3] )

#define getnext(l, k, val) ( (val) = (l)[( (k) - 1 ) * 3 + 2] )

#define setkey(l, k, val) ((l)[( (k) - 1 ) * 3 + 1] = (val) )

#define setprev(l, k, val) ((l)[( (k) - 1 ) * 3] = (val) )

#define setnext(l, k, val) ((l)[( (k) - 1 ) * 3 + 2] = (val) )

#define clear(l, k) memset( (l) + ((k) - 1 ) * 3, 0 , 3 * sizeof(*(l)) )

void init_d(int * l, int len)

}int alloc_d(int *l)

return thenode;

}void free_d(int * l, int k)

getnext(l, k, thenext);

getprev(l, k, theprev);

if (theprev != 0)

if (thenext != 0)

if (k == work_index)

clear(l, k);

setnext(l, k, free_index);

free_index = k;

}void insert_d(int *l, int k)

if (work_index != 0)

setnext(l, k, work_index);

setprev(l, k, 0);

work_index = k;

}考慮到只實現資源池的話insert_d的功能可以合併到alloc_d裡面

php陣列實現 雜湊 雙向鍊錶

陣列是phper最常用的資料型別,同時php容易上手也得益於其強大的陣列,但是陣列在php中是如何實現的呢?首先,我們還是先了解下相關的資料結構,為下面的內容打好基礎 雜湊表 雜湊表,顧名思義,即將不同的關鍵字對映到不同單元的一種資料結構。而將不同關鍵字對映到不同單元的方法就叫做雜湊函式 理想情況下...

用c 實現單向鍊錶和雙向鍊錶

鍊錶是一種非常基礎的資料結構,本身也比較靈活,突破了陣列在一開始就要確定長度的限制,能夠做到隨時使用隨時分配記憶體。同時還有新增,刪除,查詢等功能。總的來說,鍊錶是由幾個模組構成的。一,單向鍊錶 鍊錶基本元素 struct node 建立節點 node current nullptr node he...

C 類實現順序表和雙向鍊錶

1.include 2.include 3.using namespace std 4.5.typedef int datatype 6.7.class seqlist 8.15.16.seqlist size t n,datatype value 17.24.25.seqlist const se...