如何用尾插法建立雙鏈表
其實本來是想完成汪隊給的鏈表快排的作業,但是我寫完建立雙鏈表以后就12點了龜龜,明天還要早起QAQ,我菜死了
一,為啥要有雙鏈表
先說單鏈表吧
單鏈表長這樣
他的一個結點結構就是
【元素域 | next指針域】
每次后插法進行單鏈表的建立時,上一個的結點里的指針域都會指向下一個結點,比如上圖的第一個結點(e1元素所在結點,藍色陰影結點為頭結點)的指針域就指向了下一個結點
以此類推
我們就可以得到一個由指針鏈接的鏈表,這就叫單鏈表
我們可以看到,如果我有某元素所在結點的指針域是可以很輕松在這個元素所在結點的左右進行結點的插入的
但是!!!如果我想在這個元素的前一個元素進行前插的話,我必須又要將這個表從頭開始遍歷一遍,這就大大浪費了時間(就是在開車在單行線不能掉頭)
所以我們引入了雙鏈表
二,雙鏈表的建立
雙鏈表長下面這樣
他的一個節點結構就是
【prior指針域 | 元素域 | next指針域】
雙鏈表就比上面的單鏈表多了一個“prior指針域”,prior是指向前一個結點的針,next和上面的單鏈表一樣都是指向后面的一個結點指針
回到上面的問題
如果我們還要進行在某個元素的前一個元素進行前插的話,用雙鏈表就會快很多
因為我們不再需要去從頭開始遍歷整個表,雙鏈表的每個結點都存着的上一個結點的地址
我們只需要將指針前移就能完成(單行線變雙行線虛線!隨時可以掉頭回去)
下面就是如何建立雙鏈表的步驟
1.雙鏈表的結點類型定義
1 typedef struct DNode{ 2 int data; 3 struct DNode *prior, *next; 4 }DNode, *DLinkList;
定義了一個元素域(我這里用的int類型,可更換),兩個指針域*prior和*next,分別用來指向該結點的前一個結點和后一個結點
2.雙鏈表的建立
1 DLinkList DList_Create(DLinkList &D) 2 { 3 int num; 4 scanf("%d",&num); 5 D = (DNode*)malloc(sizeof(DNode)); //定義頭結點 6 DNode *s,*p = D;//s為待插入結點的指針 7 p->next = NULL; 8 while(num != -1)//輸入-1時停止 9 { 10 s = (DNode*)malloc(sizeof(DNode));//為待插入的s申請空間 11 s->data = num; 12 s->next = p->next;//s的next復制上一個結點p的next域 13 p->next = s;//上一個結點p的next指向s 14 s->prior = p;//s的prior指向前一個結點p 15 p = p->next;//p指針后移一位 16 scanf("%d",&num);//下個元素的值 17 } 18 return D; 19 }
while里的步驟如下
s = (DNode*)malloc(sizeof(DNode));//為待插入的s申請空間
s->next = p->next;//s的next復制上一個結點p的next域
p->next = s;//上一個結點p的next指向s
s->prior = p;//s的prior指向前一個結點p
p = p->next;//p指針后移一位
現在1.22了再不睡我就要猝死了,鏈表快排要不明天抄作業叭
嘿嘿