版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、VC+程序設(shè)計(jì)程序設(shè)計(jì)7.2 鏈表與鏈表的基本操作版本號(hào):V2007.03-07.06 鏈表是一種動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配的結(jié)構(gòu)。最簡(jiǎn)單的鏈表稱為單向鏈表,如圖所示: 1249A1356B1475C1021DNULLHead 1249 1356 1475 1021特點(diǎn):1。頭指針變量head, 它存放一個(gè)地址,用于指向一個(gè)元素。鏈表中的一個(gè)元素稱為結(jié)點(diǎn)。2。每個(gè)結(jié)點(diǎn)至少應(yīng)包含兩個(gè)部分:一為用戶需要的實(shí)際數(shù)據(jù),二為下一個(gè)結(jié)點(diǎn)的地址。 3?!氨砦病?的地址部分放一個(gè)“Null”(表示“空地址”)。表示鏈表的最后一個(gè)元素,該元素不再指向其它元素。 簡(jiǎn)單鏈表簡(jiǎn)單鏈表 鏈表中各元素在內(nèi)存中一般是不連續(xù)的。要找
2、某一元素,必須先找到上一個(gè)元素,根據(jù)它提供的下一個(gè)元素的地址才能找到下一個(gè)元素??梢?,如果不提供頭指針,則整個(gè)鏈表都無法訪問。 由于鏈表的每個(gè)結(jié)點(diǎn)中都必須包含一個(gè)指向下一結(jié)點(diǎn)的指針變量和一個(gè)結(jié)點(diǎn)數(shù)據(jù),因此可以用前面介紹的結(jié)構(gòu)體類型的變量實(shí)現(xiàn)。 在定義一個(gè)結(jié)構(gòu)體類型時(shí),包含若干成員,而其中成員之一必須是一個(gè)指針變量,該指針變量用于指向下一個(gè)具有相同結(jié)構(gòu)體類型的變量-“結(jié)點(diǎn)”。 struct studentint num;int score;student *next; 建立鏈表一般包括以下幾個(gè)步驟:1、建立鏈表頭 head2、使用動(dòng)態(tài)內(nèi)存分配技術(shù),在內(nèi)存中動(dòng)態(tài)建立鏈表中的各個(gè)結(jié)點(diǎn),并使鏈表頭he
3、ad指針next指向第一結(jié)點(diǎn),同時(shí),每個(gè)結(jié)點(diǎn)的next指針逐一指向下一結(jié)點(diǎn)。3、使鏈尾結(jié)點(diǎn)的指針next指向空結(jié)點(diǎn)NULL。 例:寫一函數(shù)建立一個(gè)有3名學(xué)生數(shù)據(jù)(學(xué)號(hào)、成績(jī))的單向鏈表(以輸入num為0表示結(jié)束輸入)。struct studentint num;int score;student *next;student *head, *p1, *p2;1104189.5next1104390next1104785NULLnumscorenext$7.1 $7.1 建立鏈表建立鏈表headp1p21104189nextn=1if(p1-num!=0)head=p1=p2=new studen
4、t;headp1p21104189nextn=2p1 = new studentif(p1-num!=0)P2-next=p1;1104390nextp1headp1p21104189next1104390nextp2=p1headp1p21104189next1104390next1104785nextn=3p1=new student;headp1p21104189next1104390next1104785nextn=3if(p1-num!=0)p2-next=p1p2=p1headp1p21104189.5next1104390next1104785NULLn=4p1=new stud
5、ent;if(p1-num = 0)p2-next=NULL;return(head);00/建立鏈表的C+語言函數(shù)如下:student *creat( void )student *head,*p1,*p2; number=0; /結(jié)點(diǎn)記數(shù)器,全局變量head=NULL p1=p2=new student;/產(chǎn)生第一個(gè)結(jié)點(diǎn) coutp1-num;coutp1-score; while(p1-num!=0) number+; /結(jié)點(diǎn)記數(shù)器if(number=1) head=p1;else p2-next=p1;p2=p1;p1=new student; /產(chǎn)生下一個(gè)結(jié)點(diǎn) coutp1-num;
6、coutp1-score; p2-next=NULL;/鏈表尾delete p1; return(head); 要輸出鏈表,首先要知道鏈表頭的地址,然后用一個(gè)指針指向第一個(gè)結(jié)點(diǎn),輸出該結(jié)點(diǎn)的數(shù)據(jù)成員p-num和p-score,再使p指向下一結(jié)點(diǎn),再輸出,直到鏈表的尾結(jié)點(diǎn)p-next=NULL。程序如下:void print(student *head) struct student *p=head; coutn Now,There are number records: n; if(head !=NULL) do coutnumtscorenext; while(p!=NULL);輸出鏈表輸出
7、鏈表 從一個(gè)鏈表中刪去一個(gè)結(jié)點(diǎn),并不一定是真正從內(nèi)存中把它抹掉,而是把它從鏈表中分離開來,即改變鏈接關(guān)系。 headp11104189next1104390next1104785NULL初始 p1=head; 對(duì)鏈表的刪除操作對(duì)鏈表的刪除操作headp1p21104189next1104390next1104785NULL如果不是要?jiǎng)h除的結(jié)點(diǎn)if(p1-num!=num) p2=p1; p1=p1-next;如果找到某一結(jié)點(diǎn)是要?jiǎng)h除的結(jié)點(diǎn),還要區(qū)分兩種情況:要?jiǎng)h除的是第一個(gè)結(jié)點(diǎn);要?jiǎng)h除的不是第一個(gè)結(jié)點(diǎn);此處還要考慮空表的情況。headp1110418911043901104785NULL如果刪
8、除的是第一個(gè)結(jié)點(diǎn)if(p1=head)head=p1-next;headp1p21104189next1104390next1104785NULL如果刪除的不是第一個(gè)結(jié)點(diǎn)else p2-next = p1-next;student *del(student *head, long num) student *p1,*p2; if(head = NULL) coutnum & p1-next!=NULL) p2=p1; p1=p1-next; if(num=p1-num) /找到要?jiǎng)h除的結(jié)點(diǎn)找到要?jiǎng)h除的結(jié)點(diǎn) if(p1=head) /是第一個(gè)結(jié)點(diǎn)是第一個(gè)結(jié)點(diǎn) head = p1-next
9、; delete p1; else p2-next = p1-next; delete p1; /不是第一個(gè)結(jié)點(diǎn)不是第一個(gè)結(jié)點(diǎn) cout刪除刪除: numn; number=number-1;/結(jié)點(diǎn)記數(shù)器減一結(jié)點(diǎn)記數(shù)器減一 else /沒有要?jiǎng)h除的結(jié)點(diǎn)沒有要?jiǎng)h除的結(jié)點(diǎn)coutnumnext;delete p1;headp11104189next1104390next1104785NULL初始 p1=head;釋放鏈表的結(jié)點(diǎn)空間headp1110418911043901104785NULL初始 p1=p2=head; p0=&stud;89102p2p0設(shè)已有的鏈表中各結(jié)點(diǎn)的成員是按學(xué)號(hào)
10、由小到大順序排列的。 對(duì)鏈表的插入操作對(duì)鏈表的插入操作headp1110418911043901104785NULLif(p0-num p1-num) & ( p1-next!=NULL) p2=p1; p1=p1-next; /查找要插入結(jié)點(diǎn)的位置查找要插入結(jié)點(diǎn)的位置89102p2p0headp11104189next1104390next1104785NULL找到插入位置后,區(qū)分下列情況:1.插入的是頭結(jié)點(diǎn);2.插入的是鏈表尾;3.插入的是中間位置;11042nextp2p03. 插入的是中間位置;if(p0-num num) p2-next=p0; p0-next=p1;head
11、p11104189.511043901104785NULLif(p1=head) head=p0; p0-next=p1;11042p01.插入的是頭結(jié)點(diǎn);headp11104189.511043901104785&(p0-num p1-num)if(p1-next = NULL) p1-next=p0; p0-next =NULL;11042NULLp02.插入的是鏈表尾;student *insert(student *head, student *stud) student *p0,*p1,*p2; p1=head; p0=stud; if(head=Null)/原為空鏈表原為空
12、鏈表 head=p0; p0-next=Null; else while(p0-num p1-num)&(p1-next != Null) /查找插入位置查找插入位置p2=p1; p1=p1-next; ;/插入結(jié)點(diǎn)的函數(shù)插入結(jié)點(diǎn)的函數(shù)insert如下:如下:if(p0-num num)/找到插入位置找到插入位置 if(p1=head)/插入的是頭結(jié)點(diǎn)插入的是頭結(jié)點(diǎn) head=p0; p0-next=p1; else p2-next=p0; p0-next=p1;/插入的是中間位置插入的是中間位置 else if(p1-next = Null) /沒有找到插入位置并且已經(jīng)到鏈尾沒有找到
13、插入位置并且已經(jīng)到鏈尾 p1-next=p0; p0-next=Null; number=number+1; return(head);#include#define Null 0int num;struct studentint num;int score;student *next;void main( void )student *head;int num;head=creat( );print(head);coutnum;head=del(head,num);print(head);student stud;cout輸入要插入的節(jié)點(diǎn):輸入要插入的節(jié)點(diǎn):; coutstud.num;co
14、utstud.score;head=insert(head,&stud);print(head);單鏈表類型模板單鏈表類型模板【例例7.4_h】單鏈表的結(jié)點(diǎn)采用類,凡與結(jié)點(diǎn)數(shù)據(jù)和指針操作有關(guān)單鏈表的結(jié)點(diǎn)采用類,凡與結(jié)點(diǎn)數(shù)據(jù)和指針操作有關(guān)函數(shù)作為成員函數(shù)。包括:清空鏈表、查找數(shù)據(jù)、計(jì)算表長(zhǎng)、打印函數(shù)作為成員函數(shù)。包括:清空鏈表、查找數(shù)據(jù)、計(jì)算表長(zhǎng)、打印數(shù)據(jù)、向前生成鏈表、向后生成鏈表、按升序生成鏈表等。數(shù)據(jù)、向前生成鏈表、向后生成鏈表、按升序生成鏈表等。templateclass List;templateclass Node T info; /數(shù)據(jù)域數(shù)據(jù)域 Node *link; /指
15、針域指針域public: Node(); /生成頭結(jié)點(diǎn)的構(gòu)造函數(shù)生成頭結(jié)點(diǎn)的構(gòu)造函數(shù) Node(const T & data); /生成一般結(jié)點(diǎn)的構(gòu)造函數(shù)生成一般結(jié)點(diǎn)的構(gòu)造函數(shù) void InsertAfter(Node* p); /在當(dāng)前結(jié)點(diǎn)后插入一個(gè)結(jié)點(diǎn)在當(dāng)前結(jié)點(diǎn)后插入一個(gè)結(jié)點(diǎn) Node* RemoveAfter(); /刪除當(dāng)前結(jié)點(diǎn)的后繼結(jié)點(diǎn)刪除當(dāng)前結(jié)點(diǎn)的后繼結(jié)點(diǎn) friend class List; /以以List為友元類,為友元類,List可直接訪問可直接訪問Node的私有函數(shù)的私有函數(shù);template Node:Node()link=NULL;template Node:
16、Node(const T & data)info=data;link=NULL;templatevoid Node:InsertAfter(Node* p)p-link=link;link=p;結(jié)點(diǎn)類成員函數(shù)結(jié)點(diǎn)類成員函數(shù):infolinkinfolinkinfolinkp(1)(2)當(dāng)前結(jié)點(diǎn)待插入結(jié)點(diǎn)templateNode* Node:RemoveAfter()Node* tempP=link;if(link=NULL) tempP=NULL; /已在鏈尾已在鏈尾,后面無結(jié)點(diǎn)后面無結(jié)點(diǎn)else link=tempP-link;return tempP;infolinkinfolin
17、kinfolink當(dāng)前結(jié)點(diǎn)tempPlink=tempP-linktemplateclass List Node *head,*tail; /鏈表頭指針和尾指針鏈表頭指針和尾指針public: List(); /構(gòu)造函數(shù),生成頭結(jié)點(diǎn)構(gòu)造函數(shù),生成頭結(jié)點(diǎn)(空鏈表空鏈表) List(); /析構(gòu)函數(shù)析構(gòu)函數(shù) void MakeEmpty(); /清空一個(gè)鏈表,只余表頭結(jié)點(diǎn)清空一個(gè)鏈表,只余表頭結(jié)點(diǎn) Node* Find(T data); /搜索數(shù)據(jù)域與搜索數(shù)據(jù)域與data相同的結(jié)點(diǎn),返回該結(jié)點(diǎn)的地址相同的結(jié)點(diǎn),返回該結(jié)點(diǎn)的地址 int Length(); /計(jì)算單鏈表長(zhǎng)度計(jì)算單鏈表長(zhǎng)度 void
18、PrintList(); /打印鏈表的數(shù)據(jù)域打印鏈表的數(shù)據(jù)域 void InsertFront(Node* p); /可用來向前生成鏈表可用來向前生成鏈表 void InsertRear(Node* p); /可用來向后生成鏈表可用來向后生成鏈表 void InsertOrder(Node *p); /按升序生成鏈表按升序生成鏈表 Node*CreatNode(T data); /創(chuàng)建一個(gè)結(jié)點(diǎn)創(chuàng)建一個(gè)結(jié)點(diǎn)(孤立結(jié)點(diǎn)孤立結(jié)點(diǎn)) Node*DeleteNode(Node* p); /刪除指定結(jié)點(diǎn)刪除指定結(jié)點(diǎn);再定義鏈表類,操作包括建立有序鏈表、搜索遍歷、再定義鏈表類,操作包括建立有序鏈表、搜索遍歷
19、、插入、刪除、取數(shù)據(jù)等插入、刪除、取數(shù)據(jù)等:鏈表類成員函數(shù):鏈表類成員函數(shù):templateList:List( ) head=tail=new Node( ); templateList:List( ) MakeEmpty( ); delete head; templatevoid List:MakeEmpty( ) Node *tempP; while(head-link!=NULL) tempP=head-link; head-link=tempP-link; /把頭結(jié)點(diǎn)后的第一個(gè)結(jié)點(diǎn)從鏈中脫離 delete tempP; /刪除(釋放)脫離下來的結(jié)點(diǎn) tail=head; /表頭指針與
20、表尾指針均指向表頭結(jié)點(diǎn),表示空鏈template Node* List:Find(T data) Node *tempP=head-link; while(tempP!=NULL&tempP-info!=data) tempP=tempP-link; return tempP; /搜索成功返回該結(jié)點(diǎn)地址,不成功返回NULLtemplateint List:Length( ) Node* tempP=head-link; int count=0; while(tempP!=NULL) tempP=tempP-link; count+; return count;templatevoid
21、List:PrintList( ) Node* tempP=head-link; while(tempP!=NULL) coutinfolink; coutendl;templatevoid List:InsertFront(Node *p) p-link=head-link; head-link=p; if(tail=head) tail=p;templatevoid List:InsertRear(Node *p) p-link=tail-link; tail-link=p; tail=p;templateNode* List:CreatNode(T data) Node*tempP=new Node(data); return tempP;templatevoid List:InsertOrder(Node *p) Node *tempP=head-li
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)保險(xiǎn)與谷物種植考核試卷
- 區(qū)塊鏈在版權(quán)交易與內(nèi)容分發(fā)中的應(yīng)用考核試卷
- 印刷廠安全與衛(wèi)生管理考核試卷
- 包裝設(shè)備的工業(yè)機(jī)器人集成考核試卷
- 康復(fù)醫(yī)學(xué)科適宜技術(shù)
- 保險(xiǎn)經(jīng)紀(jì)人職業(yè)法律風(fēng)險(xiǎn)與防范考核試卷
- 康養(yǎng)度假區(qū)規(guī)劃
- 奶牛養(yǎng)殖的智能化管理與效率提升考核試卷
- 解三角形-2020-2024年高考數(shù)學(xué)試題分類匯編(原卷版)
- 檢驗(yàn)科生物安全能力考核試題
- 全國(guó)城市一覽表-excel
- 國(guó)際金融課后習(xí)題答案(吳志明第五版)第1-9章
- 《WPS演示制作與設(shè)計(jì)》計(jì)算機(jī)應(yīng)用基礎(chǔ)高職專科一等獎(jiǎng)(含課件制作試題及答案)
- 大英縣“互聯(lián)網(wǎng)+智慧教育”建設(shè)項(xiàng)目 ?招標(biāo)文件(采購)
- GB/T 7533-1993有機(jī)化工產(chǎn)品結(jié)晶點(diǎn)的測(cè)定方法
- GB/T 6728-2017結(jié)構(gòu)用冷彎空心型鋼
- 紅色喜慶新年快樂企業(yè)年會(huì)PPT
- 智慧港口信息化平臺(tái)建設(shè)方案
- 水土保持工程學(xué)課程設(shè)計(jì)
- 《牛常見病防治技術(shù)》課件
- 腰椎骨折的圍手術(shù)期護(hù)理詳解演示文稿
評(píng)論
0/150
提交評(píng)論