日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构——双向链表的实现

發布時間:2024/1/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构——双向链表的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

雙向鏈表主要為了解決單鏈表找前驅的問題。除了插入、刪除操作之外,其他操作與單鏈表都相同。因此這里只是比較簡單的寫了雙向鏈表的插入和刪除操作。畫出結點結構圖的話,思路會很清晰,線性表這塊還算是比較簡單的能夠實現。

1 /* 2 在單鏈表中,求后繼的方法NextElem執行的時間為O(1),求前驅的方法PriorElem執行的時間為O(n), 3 引入雙向鏈表就是為了克服單鏈表這種單向性的缺點。 4 */ 5 6 #include<stdio.h> 7 #include<stdlib.h> 8 9 //定義存儲類型 10 typedef int ElemType; 11 12 //雙向鏈表的存儲結構 13 typedef struct DuLNode{ 14 ElemType data; 15 DuLNode *next; 16 DuLNode *prior; 17 }DuLNode, *DuLinkList; 18 19 //聲明,指針函數 20 void(*visit)(DuLNode *node); 21 22 //聲明,輔助函數 23 void visitData(DuLNode *node); 24 25 //對雙向鏈表的基本操作 26 bool InitDuLinkList(DuLinkList &L); // 初始化一個空表 27 DuLinkList GetLNode(DuLinkList L, int i); //返回第i個結點 28 void ListTraverse(DuLinkList L, void(visit(DuLNode *node))); //遍歷雙向鏈表 29 void ListInsert(DuLinkList &L, int i, ElemType e); //在第i個結點之前插入,數據域是e的結點 30 void AppendLast(DuLinkList &L, ElemType e); //在最后一個結點之后插入,數據域是e的結點 31 void ListDelete(DuLinkList &L, int i, DuLinkList &rNode); //刪除第i個結點并返回 32 33 //測試模塊 34 int main(){ 35 36 DuLinkList L; 37 InitDuLinkList(L); 38 for (int i = 1; i <= 6; i++) 39 AppendLast(L, i); 40 ListTraverse(L, visitData); 41 printf("\n"); 42 43 printf("第一個元素的后繼是:%d\n", GetLNode(L, 1)->next->data); 44 printf("第一個元素的前驅是:%d\n", GetLNode(L, 1)->prior->data); 45 printf("最后一個元素的前驅是:%d\n", GetLNode(L, 6)->prior->data); 46 printf("\n"); 47 48 ListInsert(L, 1, 7); 49 ListTraverse(L, visitData); 50 printf("第一個元素的后繼是:%d\n", GetLNode(L, 1)->next->data); 51 printf("第一個元素的前驅是:%d\n\n", GetLNode(L, 1)->prior->data); 52 53 DuLNode *rNode; 54 ListDelete(L, 7, rNode); 55 ListTraverse(L, visitData); 56 printf("最后一個元素的前驅是:%d\n", GetLNode(L, 6)->prior->data); 57 ListDelete(L, 1, rNode); 58 ListTraverse(L, visitData); 59 printf("第一個元素的后繼是:%d\n", GetLNode(L, 1)->next->data); 60 printf("第一個元素的前驅是:%d\n\n", GetLNode(L, 1)->prior->data); 61 62 system("pause"); 63 return 0; 64 } 65 66 //各函數定義模塊 67 void visitData(DuLNode *node){ 68 printf("%4d", node->data); 69 } 70 71 bool InitDuLinkList(DuLinkList &L){ // 初始化一個空表 72 L = (DuLinkList)malloc(sizeof(DuLNode)); 73 if (!L) 74 return false; 75 L->prior = NULL; 76 L->next = NULL; 77 return true; 78 } 79 80 DuLinkList GetLNode(DuLinkList L, int i){ //返回第i個結點的值 81 int j = 1; 82 DuLNode *p = L->next; 83 84 //找第i個結點 85 while (p && j != i){ 86 p = p->next; 87 j++; 88 } 89 90 if (j > i || !p){ 91 printf("\n不存在該結點!\n"); 92 return L; 93 } 94 95 return p; 96 } 97 98 void ListTraverse(DuLinkList L, void(visit(DuLNode *node))){ //遍歷單鏈表 99 DuLNode *p = L->next; 100 while (p){ 101 visit(p); 102 p = p->next; 103 } 104 printf("\n"); 105 } 106 107 void ListInsert(DuLinkList &L, int i, ElemType e){ //在第i個結點之前插入,數據域是e的結點 108 DuLNode *p = GetLNode(L, i); 109 if (!p){ 110 printf("沒找到該元素,不能進行插入!\n"); 111 return; 112 } 113 114 DuLNode *s = (DuLinkList)malloc(sizeof(DuLNode)); 115 if (!s) 116 return; 117 s->data = e; 118 s->next = p; 119 p->prior->next = s; 120 s->prior = p->prior; 121 p->prior = s; 122 } 123 124 void AppendLast(DuLinkList &L, ElemType e){ //在最后一個結點之后插入,數據域是e的結點 125 //找到最后一個結點 126 DuLNode *p = L; 127 while (p->next){ 128 p = p->next; 129 } 130 //新建一個結點 131 DuLNode *newNode = (DuLinkList)malloc(sizeof(DuLNode)); 132 if (!newNode) 133 return; 134 newNode->data = e; 135 //插入 136 newNode->next = p->next; 137 p->next = newNode; 138 newNode->prior = p; 139 } 140 141 void ListDelete(DuLinkList &L, int i, DuLinkList &rNode){ //刪除第i個結點并返回 142 DuLNode *p = GetLNode(L, i); 143 if (!p){ 144 printf("沒找到該元素,不能進行刪除!\n"); 145 return; 146 } 147 148 p->prior->next = p->next; 149 if (p->next){ 150 p->next->prior = p->prior; 151 p->next = NULL; 152 p->prior = NULL; 153 } 154 155 rNode = p; 156 free(p); 157 }

?

轉載于:https://www.cnblogs.com/yangxiaohe/p/6280208.html

總結

以上是生活随笔為你收集整理的数据结构——双向链表的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。