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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2.3线性表的链式存储和运算—双向链表

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2.3线性表的链式存储和运算—双向链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以上討論的單鏈表的結點中只有一個指向其后繼結點的指針域next,因此若已知某結點的指針為p,其后繼結點的指針則為p->next ,而找其前驅則只能從該鏈表的頭指針開始,順著各結點的next 域進行,也就是說找后繼的時間性能是O(1),找前驅的時間性能是O(n),如果也希望找前驅的時間性能達到O(1),則只能付出空間的代價:每個結點再加一個指向前驅的指針域,結點的結構為如圖2.18 所示,用這種結點組成的鏈表稱為雙向鏈表。

雙向鏈表結點的定義如下:

1 typedef struct dlnode 2 { 3 datatype data; 4 struct dlnode *prior,*next; 5 }DLNode,*DLinkList;

和單鏈表類似,雙向鏈表通常也是用頭指針標識,也可以帶頭結點和做成循環結構,圖2.19 是帶頭結點的雙向循環鏈表示意圖。顯然通過某結點的指針p 即可以直接得到它的后繼結點的指針p->next,也可以直接得到它的前驅結點的的指針p->prior。這樣在有些操作中需要找前驅時,則無需再用循環。從下面的插入刪除運算中可以看到這一點。



設p 指向雙向循環鏈表中的某一結點,即p 中是該結點的指針,則p->prior->next 表示的是*p 結點之前驅結點的后繼結點的指針,即與p 相等;類似,p->next->prior 表示的是*p 結點之后繼結點的前驅結點的指針,也與p 相等,所以有以下等式:

p->prior->next = p = p->next->prior

雙向鏈表中結點的插入:設p 指向雙向鏈表中某結點,s 指向待插入的值為x 的新結點,將*s 插入到*p 的前面,插入時需要更改兩個指針變量。插入操作時,順序很重要,千萬不能寫反了。插入示意圖如圖2.20 所示。

操作如下:

1 s->prior=p->prior; //把p->prior賦值給s的前驅,如圖① 2 p->prior->next=s; //把s賦值給p->prior的后繼,如圖② 3 s->next=p; //把p賦值給s的后繼,如圖③ 4 p->prior=s; //把s賦值給p的前驅,如圖④

指針操作的順序不是唯一的,但也不是任意的,操作①必須要放到操作④的前面完成,否則*p的前驅結點的指針就丟掉了。讀者把每條指針操作的涵義搞清楚,就不難理解了。

雙向鏈表中結點的刪除:
設p 指向雙向鏈表中某結點,刪除*p。
操作示意圖如圖2.21 所示。操作如下:

1 p->prior->next=p->next; //把p->next賦值給p->prior的后繼,如圖中① 2 p->next->prior=p->prior; //把p->prior賦值給p->next的前驅,如圖中② 3 free(p); //釋放結點

轉載于:https://www.cnblogs.com/chunlanse2014/articles/4438110.html

總結

以上是生活随笔為你收集整理的2.3线性表的链式存储和运算—双向链表的全部內容,希望文章能夠幫你解決所遇到的問題。

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