Java數據結構與算法學習之雙向鏈表
雙向鏈表的儲存結構示意圖
雙向鏈表的初始化結構
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; }
到此這篇關於Java數據結構與算法學習之雙向鏈表的文章就介紹到這瞭,更多相關Java數據結構 雙向鏈表內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!