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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

第九课:循环链表与双向链表

發布時間:2025/3/19 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第九课:循环链表与双向链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

第九課 本課主題: 循環鏈表與雙向鏈表 教學目的: 掌握循環鏈表的概念,掌握雙向鏈表的的表示與實現 教學重點: 雙向鏈表的表示與實現 教學難點: 雙向鏈表的存儲表示 授課內容: 一、復習線性鏈表的存儲結構 二、循環鏈表的存儲結構 循環鏈表是加一種形式的鏈式存儲結構。它的特點是表中最后一個結點的指針域指向頭結點。 循環鏈表的操作和線性鏈表基本一致,差別僅在于算法中的循環條件不是p或p->next是否為空,而是它們是否等于頭指針。 三、雙向鏈表的存儲結構 提問:單向鏈表的缺點是什么? 提示:如何尋找結點的直接前趨。 雙向鏈表可以克服單鏈表的單向性的缺點。 在雙向鏈表的結點中有兩個指針域,其一指向直接后繼,另一指向直接前趨。 1、線性表的雙向鏈表存儲結構 typedef struct DulNode{ struct DulNode *prior; ElemType data; struct DulNode *next; }DulNode,*DuLinkList; 對指向雙向鏈表任一結點的指針d,有下面的關系: d->next->priou=d->priou->next=d 即:當前結點后繼的前趨是自身,當前結點前趨的后繼也是自身。 2、雙向鏈表的刪除操作
Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e){ if(!(p=GetElemP_DuL(L,i))) return ERROR; e=p->data; p->prior->next=p->next; p->next->prior=p->pror; free(p); return OK; }//ListDelete_DuL
3、雙向鏈表的插入操作
Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e){ if(!(p=GetElemP_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; s->prior=p->prior; p->prior->next=s; s->next=p; p->prior=s; return OK; }//ListInsert_DuL
四、一個完整的帶頭結點的線性邊表類型定義:
typedef struct LNode{ ElemType data; struct LNode *next; }*Link,*Position; typedef struct{ Link head,tail; int len; }LinkList; Status MakeNode(Link &p,ElemType e); //分配由p指向的值為e的結點,并返回OK;若分配失敗,則返回ERROR void FreeNode(Link &p); //釋放p所指結點 Status InitLinst(LinkList &L); //構造一個空的線性鏈表L Status DestroyLinst(LinkList &L); //銷毀線性鏈表L,L不再存在 Status ClearList(LinkList &L); //將線性鏈表L重置為空表,并釋放原鏈表的結點空間 Status InsFirst(Link h,Link s); //已知h指向線性鏈表的頭結點,將s所指結點插入在第一個結點之前 Status DelFirst(Link h,Link &q); //已知h指向線性鏈表的頭結點,刪除鏈表中的第一個結點并以q返回 Status Append(LinkList &L,Link s); //將指針s所指(彼此以指針相鏈)的一串結點鏈接在線性鏈表L的最后一個結點 //之后,并改變鏈表L的尾指針指向新的尾結點 Status Remove(LinkList &L,Link &q); //刪除線性鏈表L中的尾結點并以q返回,改變鏈表L的尾指針指向新的尾結點 Status InsBefore(LinkList &L,Link &p,Link s); //已知p指向線性鏈表L中的一個結點,將s所指結點插入在p所指結點之前, //并修改指針p指向新插入的結點 Status InsAfter(LinkList &L,Link &p,Link s); //已知p指向線性鏈表L中的一個結點,將s所指結點插入在p所指結點之后, //并修改指針p指向新插入的結點 Status SetCurElem(Link &p,ElemType e); //已知p指向線性鏈表中的一個結點,用e更新p所指結點中數據元素的值 ElemType GetCurElem(Link p); //已知p指向線性鏈表中的一個結點,返回p所指結點中數據元素的值 Status ListEmpty(LinkList L); //若線性鏈表L為空表,則返回TRUE,否則返回FALSE int ListLength(LinkList L); //返回線性鏈表L中的元素個數 Position GetHead(LinkList L); //返回線性鏈表L中頭結點的位置 Position GetLast(LinkList L); //返回線性鏈表L中最后一個結點的位置 Position PriorPos(LinkList L,Link p); //已知p指向線性鏈表L中的一個結點,返回p所指結點的直接前趨的值 //若無前趨,返回NULL Position NextPos(LinkList L,Link p); //已知p指向線性鏈表L中的一個結點,返回p所指結點的直接后繼的值 //若無后繼,返回NULL Status LocatePos(LinkList L,int i,Link &p); //返回p指示線性鏈表L中第i個結點的位置并返回OK,i值不合法時返回ERROR Position LocateElem(LinkList L,ElemType e,
Status(*compare)(ElemType,ElemType)); //返回線性鏈表L中第1個與e滿足函數compare()判定關系的元素的位置, //若下存在這樣的元素,則返回NULL Status ListTraverse(LinkList L,Status(*visit)()); //依次對L的每個元素調用函數visit()。一旦visit()失敗,則操作失敗。
五、總結本課內容 循環鏈表的存儲結構 雙向鏈表的存儲結構 本文出自 51CTO.COM技術博客

轉載于:https://blog.51cto.com/1539867/396246

總結

以上是生活随笔為你收集整理的第九课:循环链表与双向链表的全部內容,希望文章能夠幫你解決所遇到的問題。

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