版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)結(jié)點中都有兩個指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個結(jié)點開始,都可以很方便地訪問它的前驅(qū)結(jié)點和后繼結(jié)點。一般我們都構(gòu)造雙向循環(huán)鏈表。一、循環(huán)鏈表循環(huán)鏈表是與單鏈表一樣,是一種鏈?zhǔn)降拇鎯Y(jié)構(gòu),所不同的是,循環(huán)鏈表的最后一個結(jié)點的指針是指向該循環(huán)鏈表的第一個結(jié)點或者表頭結(jié)點,從而構(gòu)成一個環(huán)形的鏈。循環(huán)鏈表的運算與單鏈表的運算基本一致。所不同的有以下幾點:1、在建立一個循環(huán)鏈表時,必須使其最后一個結(jié)點的指針指向表頭結(jié)點,而不是象單鏈表那樣置為NULL。此種情況還使用于在最后一個結(jié)點后插入一個新的結(jié)點。2、在判斷是否到表尾時,是判斷該結(jié)點鏈域的值是否是表頭結(jié)點,當(dāng)鏈域值等于表頭指針時,說明已到表尾。而非象單鏈表那樣判斷鏈域值是否為NULL。二、雙向鏈表雙向鏈表其實是單鏈表的改進(jìn)。當(dāng)我們對單鏈表進(jìn)行操作時,有時你要對某個結(jié)點的直接前驅(qū)進(jìn)行操作時,又必須從表頭開始查找。這是由單鏈表結(jié)點的結(jié)構(gòu)所限制的。因為單鏈表每個結(jié)點只有一個存儲直接后繼結(jié)點地址的鏈域,那么能不能定義一個既有存儲直接后繼結(jié)點地址的鏈域,又有存儲直接前驅(qū)結(jié)點地址的鏈域的這樣一個雙鏈域結(jié)點結(jié)構(gòu)呢?這就是雙向鏈表。在雙向鏈表中,結(jié)點除含有數(shù)據(jù)域外,還有兩個鏈域,一個存儲直接后繼結(jié)點地址,一般稱之為右鏈域;一個存儲直接前驅(qū)結(jié)點地址,一般稱之為左鏈域。在c語言中雙向鏈表結(jié)點類型可以定義為:typedefstructnode{intdata;/*數(shù)據(jù)域*/structnode*llink,*rlink;/*鏈域,*llink是左鏈域指針,*rlink是右鏈域指針*/}JD;當(dāng)然,也可以把一個雙向鏈表構(gòu)建成一個雙向循環(huán)鏈表。雙向鏈表與單向鏈表一樣,也有三種基本運算:查找、插入和刪除。雙向鏈表的基本運算:1、查找假若我們要在一個帶表頭的雙向循環(huán)鏈表中查找數(shù)據(jù)域為一特定值的某個結(jié)點時,我們同樣從表頭結(jié)點往后依次比較各結(jié)點數(shù)據(jù)域的值,若正是該特定值,則返回指向結(jié)點的指針,否則繼續(xù)往后查,直到表尾。下例就是應(yīng)用雙向循環(huán)鏈表查找算法的一個程序。
searchpoint二search(head,studname);printfC你所要查找的人的姓名是:%s",*&searchpoint->name);}/*線性表的雙向鏈表存儲結(jié)構(gòu)*/typedefstructDuLNode{ElemTypedata;structDuLNode*prior,*next;}DuLNode,*DuLinkList;/*帶頭結(jié)點的雙向循環(huán)鏈表的基本操作(14個)*/voidInitList(DuLinkList*L){/*產(chǎn)生空的雙向循環(huán)鏈表L*/*L=(DuLinkList)malloc(sizeof(DuLNode));(*L)->next=(*L)->prior=*L;elseexit(OVERFLOW);}voidDestroyList(DuLinkList*L){/*操作結(jié)果:銷毀雙向循環(huán)鏈表L*/DuLinkListq,p=(*L)->next;/*p指向第一個結(jié)點*/while(p!=*L)/*p沒到表頭*/{q=p->next;free(p);p=q;
*L=NULL;voidClearList(DuLinkListL)/*不改變L*/{/*初始條件:L已存在。操作結(jié)果:將L重置為空表*/DuLinkListq,p=L->next;/*p指向第一個結(jié)點*/while(p!=L)/*p沒到表頭*/1q=“free(p);P=q;L->next二L->prior二L;/*頭結(jié)點的兩個指針域均指向自身*/}StatusListEmpty(DuLinkListL){/*初始條件:線性表L已存在。操作結(jié)果:若L為空表,則返回TRUE,否則返回FALSE*/訐(L->next==L&&L->prior==L)returnTRUE;elsereturnFALSE;}intListLength(DuLinkListL){/*初始條件:L已存在。操作結(jié)果:返回L中數(shù)據(jù)元素個數(shù)*/inti=0;DuLinkListp=L->next;/*p指向第一個結(jié)點*/while(p!二L)/*p沒到表頭*/{i++;p=p->next;}returni;}StatusGetElem(DuLinkListL,inti,ElemType*e){/*當(dāng)?shù)趇個元素存在時,其值賦給e并返回OK,否則返回ERROR*/intj=1;/*j為計數(shù)器*/DuLinkListp=L->next;/*p指向第一個結(jié)點*/while(p!=L&&jnext;j++;}if(p二二L||j>i)/*第i個元素不存在*/returnERROR;*e=p->data;/*取第i個元素*/returnOK;}intLocateElem(DuLinkListL,ElemTypee,Status(*compare)(ElemType,ElemType)){/*初始條件:L已存在,compare。是數(shù)據(jù)元素判定函數(shù)*//*操作結(jié)果:返回L中第1個與e滿足關(guān)系compare。的數(shù)據(jù)元素的位序。*//* 若這樣的數(shù)據(jù)元素不存在,則返回值為0*/inti=0;DuLinkListp=L->next;/*p指向第1個元素*/while(p!二L){i++;訐(compare(p->data,e))/*找到這樣的數(shù)據(jù)元素*/returni;p=p->next;}return0;}StatusPriorElem(DuLinkListL,ElemTypecur_e,ElemType*pre_e){/*操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是第一個,則用pre_e返回它的前驅(qū),*//* 否則操作失敗,pre_e無定義*/DuLinkListp=L->next->next;/*p指向第2個元素*while(p!=L)/*p沒到表頭*/訐(p->data==cur_e){*pre_e=p->prior->data;returnTRUE;}p=p->next;}returnFALSE;
StatusNextElem(DuLinkListL,ElemTypecur_e,ElemType*next_e){/*操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是最后一個,則用next_e返回它的后繼,*//* 否則操作失敗,next_e無定義*/DuLinkListp=L->next->next;/*p指向第2個元素*/while(p!=L)/*p沒到表頭*/{訐(p->prior->data二二cur_e){*next_e=p->data;returnTRUE;}p=p->next;returnFALSE;DuLinkListGetElemP(DuLinkListL,inti)/*另加*/{/*在雙向鏈表L中返回第i個元素的地址。i為0,返回頭結(jié)點的地址。若第i個元素不存在,*//*返回NULL*/intj;DuLinkListp=L;/*p指向頭結(jié)點*/if(i<0||i>ListLength(L))/*i值不合法*/returnNULL;for(j=1;j<二i;j++)p=p->next;returnp;StatusListlnsert(DuLinkListL,inti,ElemTypee){/*在帶頭結(jié)點的雙鏈循環(huán)線性表L中第i個位置之前插入元素e,i的合法值為1<i<表長+1*//*改進(jìn)算法2.18,否則無法在第表長+1個結(jié)點之前插入元素*/DuLinkListp,s;if(i<1||i>ListLength(L)+1)/*i值不合法*/returnERROR;p=GetElemP(L,i-1);/*在L中確定第i個元素前驅(qū)的位置指針p*/if(!p)/*p二NULL,即第i個元素的前驅(qū)不存在(設(shè)頭結(jié)點為第1個元素的前驅(qū))*/returnERROR;s=(DuLinkList)malloc(sizeof(DuLNode));if(!s)
returnOVERFLOW;s->data=e;s->prior二p;/*在第i-1個元素之后插入*/s->next二p->next;p->next->prior=s;p->next=s;returnOK;}StatusListDelete(DuLinkListL,inti,ElemType*e){/*刪除帶頭結(jié)點的雙鏈循環(huán)線性表L的第i個元素,i的合法值為1<i<表長*/DuLinkListp;if(i<1)/*i值不合法*/returnERROR;p二GetElemP(L,i);/*在L中確定第i個元素的位置指針p*/if(!p)/*p二NULL,即第i個元素不存在*/returnERROR;*e=p->data;p->prior->next二p->next;p->next->prior二p->prior;free(p);returnOK;}voidListTraverse(DuLinkListL,void(*visit)(ElemType)){/*由雙鏈循環(huán)線性表L的頭結(jié)點出發(fā),正序?qū)γ總€數(shù)據(jù)元素調(diào)用函數(shù)visit()*/DuLinkListp二L->next;/*p指向頭結(jié)點*/while(p!二L){visit(p->data
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度電子合同法律效力認(rèn)定及證據(jù)保全操作規(guī)程3篇
- 二零二五年度汽車銷售與售后服務(wù)咨詢合同2篇
- 二零二五年鋼筋制作與安裝勞動合同規(guī)范3篇
- 二零二五版企業(yè)品牌形象策劃執(zhí)行合同3篇
- 二零二五年度工傷事故賠償協(xié)議及后續(xù)心理咨詢服務(wù)合同6篇
- 二零二五年度電梯產(chǎn)品研發(fā)與創(chuàng)新基金投資合同3篇
- 二零二五年度蜜蜂養(yǎng)殖環(huán)境監(jiān)測與改善合同2篇
- 小麥種子繁育生產(chǎn)合同(2篇)
- 二零二五年電子商務(wù)SET協(xié)議安全技術(shù)實施合同3篇
- 二零二五年智能工廠生產(chǎn)過程監(jiān)控合同樣本3篇
- 2024年采購代發(fā)貨合作協(xié)議范本
- 2024年業(yè)績換取股權(quán)的協(xié)議書模板
- 顳下頜關(guān)節(jié)疾?。谇活M面外科學(xué)課件)
- 工業(yè)自動化設(shè)備維護(hù)保養(yǎng)指南
- 2024人教新版七年級上冊英語單詞英譯漢默寫表
- 《向心力》參考課件4
- 2024至2030年中國膨潤土行業(yè)投資戰(zhàn)略分析及發(fā)展前景研究報告
- 2024年深圳中考數(shù)學(xué)真題及答案
- 土方轉(zhuǎn)運合同協(xié)議書
- Module 3 Unit 1 Point to the door(教學(xué)設(shè)計)-2024-2025學(xué)年外研版(三起)英語三年級上冊
- 智能交通信號燈安裝合同樣本
評論
0/150
提交評論