




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第詳解C語言中雙向循環(huán)鏈表的實現(xiàn)目錄實現(xiàn)細(xì)節(jié)輔助理解圖具體實現(xiàn)代碼1、對鏈表進行初始化2、任意位置前的插入3、任意位置的刪除4、頭插和尾刪完整代碼頭文件具體函數(shù)測試
實現(xiàn)細(xì)節(jié)
1、帶一個哨兵位(哨兵節(jié)點,初始節(jié)點,不存儲有效數(shù)據(jù),用來方便后期數(shù)據(jù)的存儲與查找)
2、與單向鏈表不同的是,雙向鏈表中每個數(shù)據(jù)節(jié)點包含兩個指針,分別指向前后兩個節(jié)點
3、雙向鏈表是循環(huán)的,其尾節(jié)點后不是空指針,而是與頭部的哨兵節(jié)點通過指針相連
輔助理解圖
具體實現(xiàn)代碼
1、對鏈表進行初始化
初始化:哨兵位的前后指針均指向哨兵節(jié)點本身
voidListInit(ListNode**pphead)
*pphead=(ListNode*)malloc(sizeof(ListNode));
if(*pphead==NULL)
perror("ListInit");
exit(-1);
(*pphead)-date=-1;
(*pphead)-next=*pphead;
(*pphead)-prev=*pphead;
2、任意位置前的插入
注意:插入位置前后節(jié)點中的前后指針要進行相應(yīng)的更換
voidAny_insert(ListNode*pos,Listtypedate)
ListNode*Prev=pos-prev;
//建立新節(jié)點
ListNode*NewNode=(ListNode*)malloc(sizeof(ListNode));
if(NewNode==NULL)
perror("Any_insert");
exit(-1);
NewNode-date=date;
NewNode-next=pos;
pos-prev=NewNode;
Prev-next=NewNode;
NewNode-prev=Prev;
3、任意位置的刪除
細(xì)節(jié)點:當(dāng)鏈表中沒有數(shù)據(jù)時,就不用刪除,因此需要建立一個函數(shù)進行判斷
boolDetermine(ListNode*pphead)
{//判斷鏈表中有無元素
assert(pphead);
returnpphead==pphead-next;
voidAny_delet(ListNode*pos)
assert(!Determine(pos));
ListNode*Next=pos-next;
ListNode*Prev=pos-prev;
Next-prev=Prev;
Prev-next=Next;
free(pos);
4、頭插和尾刪
此處的插入和刪除,十分方便,即:對上面的任插和任刪進行套用
頭插如下:
voidHead_insert(ListNode*pphead,Listtypedate)
ListNode*NewNode=(ListNode*)malloc(sizeof(ListNode));
if(NewNode==NULL)
perror("Head_insert");
exit(-1);
//單獨實現(xiàn)
//NewNode-date=date;
//NewNode-prev=pphead;
//NewNode-next=pphead-next;
//pphead-next-prev=NewNode;
//pphead-next=NewNode;
//進行任插的復(fù)用
Any_insert(pphead-next,date);
尾刪如下:
voidTail_delet(ListNode*pphead)
assert(pphead);
//單獨實現(xiàn)
//assert(Determine(pphead));
/*ListNode*tail=pphead-prev;
if(tail!=pphead)
ListNode*tailprev=tail-prev;
tailprev-next=pphead;
pphead-prev=tailprev;
free(tail);
//尾刪的復(fù)用
Any_delet(pphead-prev);
完整代碼
頭文件
#pragmaonce
#includestdio.h
#includemalloc.h
#includestdlib.h
#includeassert.h
#includestdbool.h
typedefintListtype;
typedefstructListNode
structListNode*prev;
Listtypedate;
structListNode*next;
}ListNode;
voidListInit(ListNode**pphead);//鏈表初始化
voidListNode_ADD(ListNode*pphead,Listtypedate);//尾插
voidHead_insert(ListNode*pphead,Listtypedate);//頭插
voidListNode_Print(ListNode*pphead);//鏈表打印
voidTail_delet(ListNode*pphead);//尾刪
boolDetermine(ListNode*pphead);//判斷表中有無數(shù)據(jù)
voidAny_insert(ListNode*pos,Listtypedate);//任插
voidAny_delet(ListNode*pos);//任刪
voidList_Destory(ListNode*pos);//鏈表清空
具體函數(shù)
#define_CRT_SECURE_NO_WARNINGS1
#include"List.h"
//鏈表打印
voidListNode_Print(ListNode*pphead)
assert(pphead);
ListNode*phead=pphead;
pphead=pphead-next;
for(;pphead!=phead;pphead=pphead-next)
printf("%d",pphead-date);
printf("\n");
boolDetermine(ListNode*pphead)
{//判斷鏈表中有無元素
assert(pphead);
returnpphead==pphead-next;
//鏈表初始化
voidListInit(ListNode**pphead)
*pphead=(ListNode*)malloc(sizeof(ListNode));
if(*pphead==NULL)
perror("ListInit");
exit(-1);
(*pphead)-date=-1;
(*pphead)-next=*pphead;
(*pphead)-prev=*pphead;
voidListNode_ADD(ListNode*pphead,Listtypedate)
//ListNode*NewNode=(ListNode*)malloc(sizeof(ListNode));
//if(NewNode==NULL)
//perror("ADD_malloc");
//exit(-1);
//NewNode-date=date;
//NewNode-prev=pphead-prev;
//pphead-prev-next=NewNode;
//pphead-prev=NewNode;
//NewNode-next=pphead;
//任插的復(fù)用
Any_insert(pphead,date);
voidHead_insert(ListNode*pphead,Listtypedate)
ListNode*NewNode=(ListNode*)malloc(sizeof(ListNode));
if(NewNode==NULL)
perror("Head_insert");
exit(-1);
//NewNode-date=date;
//NewNode-prev=pphead;
//NewNode-next=pphead-next;
//pphead-next-prev=NewNode;
//pphead-next=NewNode;
//進行任插的復(fù)用
Any_insert(pphead-next,date);
voidTail_delet(ListNode*pphead)
assert(pphead);
//assert(Determine(pphead));
/*ListNode*tail=pphead-prev;
if(tail!=pphead)
ListNode*tailprev=tail-prev;
tailprev-next=pphead;
pphead-prev=tailprev;
free(tail);
//尾刪的復(fù)用
Any_delet(pphead-prev);
//在任意位置前插入
voidAny_insert(ListNode*pos,Listtypedate)
ListNode*Prev=pos-prev;
ListNode*NewNode=(ListNode*)malloc(sizeof(ListNode));
if(NewNode==NULL)
perror("Any_insert");
exit(-1);
NewNode-date=date;
NewNode-next=pos;
pos-prev=NewNode;
Prev-next=NewNode;
NewNode-prev=Prev;
//任意位置刪除
voidAny_delet(ListNode*pos)
assert(!Determine(pos));
ListNode*Next=pos-next;
ListNode*Prev=pos-prev;
Next-prev=Prev;
Prev-next=Next;
free(pos);
//鏈表清空
voidList_Destory(ListNode*pos)
ListNode*head=pos,*Prev=pos-prev;
for(pos=pos-prev;head!=pos;pos=Prev)
Prev=pos-prev;
Any_delet(pos);
printf("\n清空完成\n");
}
測試
#define_CRT_SECURE_NO_WARNINGS1
#include"List.h"
voidListTest(ListNode**pphead)
ListInit(pphead);
Head_insert(*pphead,60);
Head_insert(*pphead,100);
Head_insert(*pphead,60);
Head_insert
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 交通事故責(zé)任認(rèn)定司法鑒定機構(gòu)合伙人合作協(xié)議
- 抖音火花技術(shù)實施與維護服務(wù)合同
- 腫瘤疫苗研發(fā)合作項目保密協(xié)議
- 智能電梯系統(tǒng)智能化改造與維保服務(wù)協(xié)議
- 體育賽事直播網(wǎng)絡(luò)版權(quán)分銷與運營合作協(xié)議
- 知識產(chǎn)權(quán)侵權(quán)賠償及糾紛解決協(xié)議
- 獨家市場開發(fā)補充協(xié)議
- 《梵高藝術(shù)賞析》課件
- 加氣站員工安全與操作規(guī)范培訓(xùn)大綱
- 包粽子活動課
- 2025西安數(shù)字城市科技運營有限公司招聘(9人)筆試參考題庫附帶答案詳解
- 北京2025年生態(tài)環(huán)境部衛(wèi)星環(huán)境應(yīng)用中心上半年招聘筆試歷年參考題庫附帶答案詳解
- 人教版八年級數(shù)學(xué)下冊試題第18章平行四邊形綜合測試卷(含詳解)
- 2025智慧病區(qū)建設(shè)及評價規(guī)范
- 湖南能源集團有限公司招聘筆試題庫2025
- 渣漿泵培訓(xùn)課件
- 智能座艙試題解析及答案
- 2025春季學(xué)期國開電大本科《人文英語3》一平臺在線形考綜合測試(形考任務(wù))試題及答案
- 中等職業(yè)學(xué)校物理教學(xué)大綱
- 靜脈輸血法并發(fā)癥的預(yù)防和處置
- 塔吊交叉作業(yè)安全技術(shù)交底
評論
0/150
提交評論