




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第詳解C語言中雙向循環(huán)鏈表的實現(xiàn)目錄實現(xiàn)細節(jié)輔助理解圖具體實現(xiàn)代碼1、對鏈表進行初始化2、任意位置前的插入3、任意位置的刪除4、頭插和尾刪完整代碼頭文件具體函數(shù)測試
實現(xiàn)細節(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、任意位置的刪除
細節(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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 班組長自我總結(jié)模版
- 全鋁家居合同范例
- 醫(yī)療信息化背景下的電子健康記錄培訓(xùn)教育
- 年度個人思想總結(jié)模版
- 醫(yī)療大數(shù)據(jù)分析在藥物研發(fā)中的價值
- 供應(yīng)部采購合同范例
- 醫(yī)療設(shè)備租賃服務(wù)的供應(yīng)鏈優(yōu)化
- 上海商場綠植租賃合同范例
- 業(yè)主別墅出售合同范例
- 一年級上冊語文《四季》教學(xué)設(shè)計
- 新能源汽車維修技術(shù)論文
- 2025年正式的勞動合同模板
- 2025年國家統(tǒng)一法律職業(yè)資格考試真題(帶答案)
- 生物安全管理體系文件
- 2025年高考數(shù)學(xué)復(fù)習(xí)(新高考專用)第04講三角函數(shù)與解三角形(2022-2024高考真題)特訓(xùn)(學(xué)生版+解析)
- 《智能媒體傳播》課程教學(xué)大綱
- 七年級數(shù)學(xué)下冊 第3章 單元綜合測試卷(北師陜西版 2025年春)
- 小學(xué)班主任的教育管理策略與實踐
- 2024年公司網(wǎng)絡(luò)安全管理制度
- 生成式人工智能的教育應(yīng)用與展望-以ChatGPT 系統(tǒng)為例
- 中醫(yī)臨床診脈教學(xué)
評論
0/150
提交評論