日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

發(fā)布時(shí)間:2024/2/28 75 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)系列文章 第三章 循環(huán)鏈表、雙向鏈表


文章目錄

  • 線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
  • 前言
  • 一、循環(huán)鏈表
    • (一)定義
    • (二)尾指針
  • 二、雙向鏈表
    • (一)定義
    • (二)代碼
  • 總結(jié)


前言

提示:本系列文章均使用Visual Studio 2019編程,編程語言為c語言。

一、循環(huán)鏈表

(一)定義

將單鏈表的終端結(jié)點(diǎn)的指針端由空指針改為指向頭結(jié)點(diǎn),這樣就讓整個(gè)單鏈表形成一個(gè)循環(huán),這時(shí)頭尾相連的單鏈表就稱為單循環(huán)鏈表,即循環(huán)鏈表,下圖的head,即為頭指針。


將循環(huán)鏈表和單鏈表相比較,其實(shí)就在循環(huán)的判斷條件上差別,單鏈表判斷是否為空(p!=null 或 p->null!=null),循環(huán)鏈表是否等于頭結(jié)點(diǎn)(p!=head 或 p->next!=head)。

(二)尾指針

事實(shí)上我們不用頭指針,而改用指向終端結(jié)點(diǎn)的尾指針來表示循環(huán)鏈表,這樣就使查找開始結(jié)點(diǎn)和終端結(jié)點(diǎn)就很方便。

我們通過一張圖,進(jìn)一步了解其尾指針的作用:

二、雙向鏈表

(一)定義

在單鏈表結(jié)構(gòu)中,結(jié)點(diǎn)只有一個(gè)指向后繼的指針域next,若要查找某個(gè)結(jié)點(diǎn)只能順著單鏈表尋找它的后繼結(jié)點(diǎn),為了能夠高效地查找一個(gè)結(jié)點(diǎn),我們只需從頭指針出發(fā)查找其前驅(qū),即我們?cè)黾右粋€(gè)指向其直接前驅(qū)的指針域prior,這樣我們就構(gòu)成了一個(gè)雙向鏈表。其中第一個(gè)結(jié)點(diǎn)的前趨結(jié)點(diǎn)為NULL,最后一個(gè)結(jié)點(diǎn)的后繼結(jié)點(diǎn)也為NULL。

指針域(prior)數(shù)據(jù)域指針域(next)

即,數(shù)據(jù)域?yàn)閐ata數(shù)據(jù),存儲(chǔ)一個(gè)數(shù)據(jù)元素的信息;prior指針域?yàn)榍膀?qū)指針域,用于存儲(chǔ)其直接前驅(qū)存儲(chǔ)地址的信息;next指針域?yàn)楹罄^指針域,用于存儲(chǔ)其后繼存儲(chǔ)地址的信息。

(二)代碼

  • 雙向單鏈表的建立
    分別定義數(shù)據(jù)域,前驅(qū)指針域以及后繼指針域。
  • typedef char DataType; typedef struct dunode {DataType data; //數(shù)據(jù)域struct dunode *prior; //前驅(qū)指針域struct dunode *next; //后繼指針域 }DuLinkList;
  • 雙向單鏈表的插入
    若要將新結(jié)點(diǎn)s(x為其值)插入到雙向鏈表中兩個(gè)結(jié)點(diǎn)o、p之間,即在p結(jié)點(diǎn)之前插入結(jié)點(diǎn)s,首先我們應(yīng)該將要插入的新結(jié)點(diǎn)s的前驅(qū)指針域指向結(jié)點(diǎn)p的前一個(gè)結(jié)點(diǎn)o,將結(jié)點(diǎn)o的后繼指針域指向要插入的新結(jié)點(diǎn)s,然后將結(jié)點(diǎn)s的后繼指針域指向p結(jié)點(diǎn),并將結(jié)點(diǎn)p的前驅(qū)指針域指向結(jié)點(diǎn)s。
  • void InsertList(InsertElem *p,DataType x) {InsertElem *s;s=(InsertElem *)malloc(sizeof(InsertElem)); //生成新結(jié)點(diǎn)ss->data=x;s->prior=p->prior; //也可寫成s->prior=op->prior->next=s; //也可寫成o->next=ss->next=p;p->prior=s; //也可寫成o=s }
  • 雙向鏈表的刪除
    若要?jiǎng)h除表中的結(jié)點(diǎn)p,我們首先應(yīng)該將結(jié)點(diǎn)p的前一個(gè)結(jié)點(diǎn)的后繼指針域指向結(jié)點(diǎn)p的后繼指針域,將結(jié)點(diǎn)p后一個(gè)結(jié)點(diǎn)的前驅(qū)指針域指向結(jié)點(diǎn)p的后繼指針域,然后釋放結(jié)點(diǎn)p的空間。
  • void DeleteElem(DeleteList *p,DataType *x) {*x=p->data;p->prior->next=p->next;p->next->prior=p->prior;free(p); }

    總結(jié)

    以上就是本次的筆記內(nèi)容,本文介紹了循環(huán)鏈表、雙向鏈表的各項(xiàng)操作,筆記若有錯(cuò)誤,還望指出!!!


    附:在下一文章會(huì)介紹棧的各項(xiàng)操作,持續(xù)更新ing……

    總結(jié)

    以上是生活随笔為你收集整理的《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。