

雙向鏈表的儲存結構示意圖
雙向鏈表的初始化結構
1.雙向鏈表的結點
代碼實作
//雙向鏈表的結點,包含一個資料域,兩個指標域 typedef struct DoublyNode { ElementType date; //資料域 struct DoublyNode* prev; //指向前綴結點 struct DoublyNode* next; //指向后綴結點 }DoublyNode;2.雙向鏈表的頭結點
//雙向鏈表 typedef struct DoublyLinkList { int length; DoublyNode* next; };3.總代碼
//雙向鏈表的結點,包含一個資料域,兩個指標域 typedef struct DoublyNode { ElementType date; //資料域 struct DoublyNode* prev; //指向前綴結點 struct DoublyNode* next; //指向后綴結點 }DoublyNode; //雙向鏈表 typedef struct DoublyLinkList { int length; DoublyNode* next; };
雙向鏈表中的指定檔案插入元素
1,插入的為第一個位置
代碼實作
2.其他位置插入
代碼實作
總代碼
void InsertDoublyLinkList(DoublyLinkList* dlist, int pos, ElementType element) { //創建空節點 DoublyNode* node = (DoublyLinkList*)malloc(sizeof(DoublyLinkList)); node->date = element; node->prev = NULL; node->next = NULL; //在第一個位置插入結點 if (pos == 1) { node->next = dlist->next; dlist->next = node; node->next->prev = node; dlist->length++; return; } DoublyLinkList* currNode = dlist->next; for (int i = 1; currNode && i < pos - 1; i++) { currNode = currNode->next; } if (currNode) { node->prev = currNode; if (currNode->next) { //如果前置結點非空->因為空就表示沒有后繼結點了 //將插入位置的前置結點改為指向新結點 currNode->next->prev = node; } node->next = currNode->next; currNode->next = node; dlist->length++; } }

雙向鏈表的洗掉
1.洗掉第一個元素
代碼實作
2.洗掉其他位置元素
代碼實作
總代碼
void DeleteDoublyLinkList(DoublyLinkList* dlist, int pos) { if (pos == 1) { DoublyLinkList* node = dlist->next; if (node) { dlist->next; if (node->next) { //如果喲有第二個結點,那么設定第二個結點的前置結點為NULL node->next->prev = NULL; } free(node); dlist->length--; } return; } DoublyLinkList* node = dlist->next; for (int i = 1; i < pos; i++) { node = node->next; } if (node) { if (node->next) { node->next->prev = node->prve; } node->prev->next = node->next; free(node); dlist->length--; } return; }


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/395111.html
標籤:java














