帶頭雙向迴圈連結串列
阿新 • • 發佈:2019-01-13
#pragma once #include<stdlib.h> #include<stdio.h> #include<assert.h> typedef int DataType; typedef struct DNode { DataType data; struct DNode *next; struct DNode *prev; }DNode; DNode *CreateDNode(int data) { DNode *node = (DNode*)malloc(sizeof(DNode)); node->data = data; node->prev = node->next = NULL; return node; } void DNodeInit(DNode **ppHead) { assert(ppHead != NULL); DNode *node = CreateDNode(0); node->next = node; node->prev = node; *ppHead = node; } void DNodePushFront(DNode *head,DataType data) { DNode *node = CreateDNode(0); node->prev = head; node->next = head->next; head->next->prev = node; head->next = node; } void DNodePushBack(DNode *head,DataType data) { DNode *node = CreateDNode(0); node->prev = head->prev; node->next; node = head->prev->next; head->prev = node; } void DListInsert(DNode *head, DataType data) { DNode *node = CreateDNode(data); node->prev = head->prev; node->next = head; head->prev->next = node; head->prev = node; } void DListPopFront(DNode *head) { assert(head->next != head); DNode *first = head->next; DNode *second = head->next->next; head->next = second; second->prev = head; head->next = head; } void DListPopBack(DNode *head) { assert(head->next != head); DNode *node; node->prev->next = head; head->prev = node->prev; free(node); } void DListErase(DNode *head, DNode *pos) { assert(head->next != head); pos->prev->next = pos->next; pos->next->prev = pos->prev; free(pos); } void DListClear(DNode *head) { DNode *next; for (DNode *cur = head->next; cur != head; cur = next) { next = cur->next; free(cur); } head->prev = head->next = head; } void DNodePrintf(DNode *head) { for (DNode *cur = head->next; cur != head; cur = cur->next) { printf("%d", cur->data); } printf("\n"); } void Test() { DNode *List; DNodeInit(&List); DNodePushBack(List, 1); DNodePushBack(List, 2); DNodePushBack(List, 3); DNodePushBack(List, 4); DNodePushBack(List, 5); DNodePrintf(List); }
雙向帶頭迴圈連結串列時間複雜度O(1),因為是迴圈首位相接,不管是頭,尾相加節點都可以直接確定位置,並不需要遍歷(除去clear,和列印連結串列必須要遍歷連結串列)。
我們在增刪查改雙向帶頭連結串列時候,需要注意的是該表head,最後節點
的指向,以及將原有指向關係換成新的指向關係。注意增刪改查,對
連結串列指向關係改變的影響這個是關鍵,也是需要注意的。**以及我們
需要注意在clear不能刪除頭節點,在節點修改時候,我們需要保證頭
節點安全,不能破環這個,匿名如果簡單實現迴圈帶頭雙鏈表為題會
簡單很多的。