雙向鏈表中的每一個元素都由3部分組成:除了數據成員、next指針外,每個元素還包含一個指向其前驅元素的指針,稱為prev指針。雙向鏈表的組成是這樣的:將一些元素鏈接在一起,使得每個元素的next指針都指向其後繼的元素,而每個元素的prev指針都指向其前驅元素。 ...
雙向鏈表介紹
雙向鏈表中的每一個元素都由3部分組成:除了數據成員、next指針外,每個元素還包含一個指向其前驅元素的指針,稱為prev指針。雙向鏈表的組成是這樣的:將一些元素鏈接在一起,使得每個元素的next指針都指向其後繼的元素,而每個元素的prev指針都指向其前驅元素。
為了標識鏈表的頭和尾,將第一個元素的prev指針和最後一個元素的next指針設置為NULL。
要反向遍歷整個雙向鏈表,使用prev指針以從尾到頭的順序連續訪問各個元素。當我們知道某個元素存儲在鏈表在的某處時,我們可以選擇按何種方式訪問到它,這會非常有幫助。例如,雙向鏈表的一種靈活性在於它提供了一種比單鏈表更直觀的方式移除一個元素。
雙向鏈表介面定義
dlist_init |
void dlist_init(DList *list, void(*destroy)(void *data)); |
返回值:無 |
描述:初始化由list所指向的雙向鏈表。該函數必須在雙向鏈表做其他任何操作之前調用。當調用dlist_destroy時,這裡傳入的destroy參數提供了一種釋放動態分配空間的方法。它的工作方式如同單鏈表中的list_destroy。對於雙向鏈表,如果其中包含不需要手動釋放空間的數據,destroy參數應該設置為NULL。 |
複雜度:O(n) |
dlist_destroy |
void dlist_destroy(DList *list); |
返回值:無 |
描述:銷毀由參數list所指定的雙向鏈表。調用該函數後不允許再執行其他操作,除非用戶再次調用dlist_init。dlist_destroy將移除鏈表中的所有元素,如果傳給dlist_init的參數destroy不為NULL,則調用destroy所指定的函數,對鏈表中每個移除的元素數據施行資源回收操作。 |
複雜度:O(n),這裡n代表雙向鏈表中的元素個數。 |
dlist_ins_next |
int dlist_ins_next(DList *list, DLIstElmt *element,const void *data) |
返回值:如果插入成功則返回1,否則返回-1。 |
描述:將元素插入由list指定的雙向鏈表的element元素之後
。當插入空鏈表中時,element可能指向任何位置,為了避免混淆,element此時應該設置為NULL。新的元素包含一個指向data的指針,因此只要該元素仍在鏈表中,data所引用的記憶體空間就應該保持合法。
由調用者負責管理data所引用的存儲空間。 |
複雜度:O(1) |
dlist_ins_prev |
int dlist_ins_prev(DList *list, DLIstElmt *element,const void *data) |
返回值:無 |
描述:將元素插入由list指定的雙向鏈表的element元素之前
。當插入空鏈表中時,element可能指向任何位置,為了避免混淆,element此時應該設置為NULL。新的元素包含一個指向data的指針,因此只要該元素仍在鏈表中,data所引用的記憶體空間就應該保持合法。
由調用者負責管理data所引用的存儲空間。 |
複雜度:O(1) |
dlist_remove |
int dlist_remove(DList *list, DLIstElmt *element,const void *data) |
返回值:如果移除成功則返回0,否則返回-1。 |
描述:從由list指定的雙向鏈表中移除由element所指定的元素。函數返回後,參數data將指向已移除元素中存儲的數據域。由調用者負責管理data所引用的存儲空間。 |
複雜度:O(1) |
dlist_size |
intdlist_size(DList *list) |
返回值:鏈表中的元素個數 。 |
描述:這是一個巨集,用來計算由list所指定的雙向鏈表中的元素個數。 |
複雜度:O(1) |
dlist_head |
DListElmt *dlist_head(const DList *list) |
返回值:返回鏈表的頭元素。 |
描述:這是一個巨集,用來返回由list所指定的雙向鏈表中的頭元素。 |
複雜度:O(1) |
dlist_tail |
DListElmt *dlist_tail(const DList *list) |
返回值:返回鏈表的尾元素。 |
描述:這是一個巨集,用來返回由list所指定的雙向鏈表中的尾元素。 |
複雜度:O(1) |
dlist_is_head |
int *dlist_is_head(const DListElmt *element) |
返回值:如果由參數element所指定的元素是鏈表頭元素則返回1;否則返回0。 |
描述:這是一個巨集,用來判斷由參數element所指定的元素是否為鏈表頭元素。 |
複雜度:O(1) |
dlist_is_tail |
int *dlist_is_tail(const DListElmt *element) |
返回值:如果由參數element所指定的元素是鏈表尾元素則返回0;否則返回-1。 |
描述:這是一個巨集,用來判斷由參數element所指定的元素是否為鏈表尾元素。 |
複雜度:O(1) |
dlist_data |
int *dlist_data(const DListElmt *element) |
返回值:返回由element所指定的鏈表元素的數據域。 |
描述:這是一個巨集,用來返回由element所指定的雙向鏈表元素的數據域。 |
複雜度:O(1) |
dlist_next |
DListElmt *dlist_next(const DListElmt *element) |
返回值:返回由element所指定的元素的下一個元素。 |
描述:這是一個巨集,用來返回由element所指定的鏈表元素的後繼元素。 |
複雜度:O(1) |
dlist_prev |
DListElmt *dlist_prev(const DListElmt *element) |
返回值:返回由element所指定的元素的前驅元素。 |
描述:這是一個巨集,用來返回由element所指定的鏈表元素的前驅元素。 |
複雜度:O(1) |