第九课:循环链表与双向链表
生活随笔
收集整理的這篇文章主要介紹了
第九课:循环链表与双向链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
第九課 本課主題: 循環鏈表與雙向鏈表 教學目的: 掌握循環鏈表的概念,掌握雙向鏈表的的表示與實現 教學重點: 雙向鏈表的表示與實現 教學難點: 雙向鏈表的存儲表示 授課內容: 一、復習線性鏈表的存儲結構 二、循環鏈表的存儲結構 循環鏈表是加一種形式的鏈式存儲結構。它的特點是表中最后一個結點的指針域指向頭結點。 循環鏈表的操作和線性鏈表基本一致,差別僅在于算法中的循環條件不是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 |
| 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()失敗,則操作失敗。 |
轉載于:https://blog.51cto.com/1539867/396246
總結
以上是生活随笔為你收集整理的第九课:循环链表与双向链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 课程三、电子商务物流解决方案
- 下一篇: 【转贴】Lua 5.0 参考手册