C語言方式實現雙向鍊錶

2021-08-25 19:33:56 字數 3014 閱讀 5890

太久不看資料結構都忘記了,所以現在複習下雙向鍊錶,**如下:

list.h

/*雙向鍊錶*/

#ifndef _list_h

#define _list_h

#include #include /*節點*/

typedef struct listnode

list_node;

/*鍊錶*/

typedef struct list

list;

/*初始化空鍊錶*/

void list_init(list* list);

/*釋放剩餘節點並恢復初始狀態*/

void list_deinit(list* list);

/*判斷是否為空*/

bool list_empty(list* list);

/*追加*/

/*前插*/

bool list_insert(list* list,size_t pos,int data);

/*隨機訪問,即可讀,又可寫,所以返回為指標*/

int* list_at(list* list,size_t pos);

/*刪除*/

bool list_erase(list* list,size_t pos);

/*刪除所有的匹配資料*/

void list_remove(list* list,int data);

/*清空*/

void list_clear(list* list);

/*大小*/

size_t list_size(list* list);

/*開始正向迭代*/

int* list_begin(list* list);

/*向後正向迭代*/

int* list_next(list* list);

/*向前正向迭代*/

int* list_prev(list* list);

/*獲取正向迭代的值*/

int* list_current(list* list);

/*判斷正向迭代是否終止*/

bool list_end(list* list);

/*開始反向迭代*/

void list_rbegin(list* list);

/*向後反向迭代*/

int* list_rnext(list* list);

/*向前反向迭代*/

int* list_rprev(list* list);

/*獲取反向迭代的值*/

int* list_rcurrent(list* list);

/*判斷反向迭代是否終止*/

bool list_rend(list* list);

#endif

list.c

#include #include "list.h"

/*建立節點*/

static list_node* create_node(int data,list_node* prev,list_node* next)

/*銷毀節點,返回值後節點位址,引數輸出前節點位址*/

static list_node* destroy_node(list_node* node,list_node** prev)

/*初始化空鍊錶*/

void list_init(list* list)

/*釋放剩餘節點並恢復初始狀態*/

void list_deinit(list* list)

/*判斷是否為空*/

bool list_empty(list* list)

/*追加*/

/*前插*/

bool list_insert(list* list,size_t pos,int data)

return false;

}/*隨機訪問,即可讀,又可寫,所以返回為指標*/

int* list_at(list* list,size_t pos)

/*刪除*/

bool list_erase(list* list,size_t pos)

} return false;

}/*刪除所有的匹配資料*/

void list_remove(list* list,int data) }}

/*清空*/

void list_clear(list* list)

/*大小*/

size_t list_size(list* list)

/*開始正向迭代*/

int* list_begin(list* list)

/*向後正向迭代*/

int* list_next(list* list)

/*向前正向迭代*/

int* list_prev(list* list)

/*獲取正向迭代的值*/

int* list_current(list* list)

/*判斷正向迭代是否終止*/

bool list_end(list* list)

/*開始反向迭代*/

void list_rbegin(list* list)

/*向後反向迭代*/

int* list_rnext(list* list)

/*向前反向迭代*/

int* list_rprev(list* list)

/*獲取反向迭代的值*/

int* list_rcurrent(list* list)

/*判斷反向迭代是否終止*/

bool list_rend(list* list)

list_test.c

#include #include "list.h"

/*測試用例*/

void print(list* list)

void square(list* list)

void test1(void)

int main(void)

雙向鍊錶C語言實現

ifndef stdlist h define stdlist h typedef struct tagstdnode stdnode,lpstdnode typedef struct tagstdlist stdlist,lpstdlist 鍊錶資料結構 struct tagstdnode 鍊錶節...

c語言實現雙向鍊錶

單向鍊錶有一定的缺陷,其中乙個就是只能一條路走到黑,只能前進不能後退,但雙向鍊錶就解決了這一問題 include include typedef struct node node,linklist void create list tail linklist l 頭插法建立 void create ...

C語言實現雙向鍊錶

1.定義兩個結構體,乙個表示鍊錶的乙個單元,另乙個表示鍊錶的頭結點 2.鍊錶的初始化 必須讓頭結點的next和prev指向自己 清除 不刪除頭結點 銷毀 刪除頭結點 3.增操作 每次增加需要開闢乙個單元,所以直接建立乙個函式用來建立單元 頭插 尾插 pos結點之前插 4.刪操作 分為三種 刪除pos...