中職C語言程序設(shè)計模塊十一課件_第1頁
中職C語言程序設(shè)計模塊十一課件_第2頁
中職C語言程序設(shè)計模塊十一課件_第3頁
中職C語言程序設(shè)計模塊十一課件_第4頁
中職C語言程序設(shè)計模塊十一課件_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、(中職)C語言程序設(shè)計模塊十一課件鏈表模塊1111.1鏈表的基本概念及要點11.1.1鏈表的基本概念(1)將若干數(shù)據(jù)項按一定的原則連接起來的表就稱為鏈表。(2)鏈表中的數(shù)據(jù)稱為結(jié)點(或節(jié)點)。任何結(jié)點都由兩部分組成:數(shù)據(jù)域(data)。指針域(next)。(3)鏈表的鏈接原則:前一個結(jié)點指向下一個結(jié)點,即前一個結(jié)點指針域保存下一個結(jié)點地址。只有通過前一個結(jié)點才能找到下一個結(jié)點。頭結(jié)點(也稱頭指針)一般不存放有效數(shù)據(jù),只保存第1個結(jié)點的地址。頭結(jié)點不存放有效數(shù)據(jù),主要是為了方便插入和刪除運算的實現(xiàn)。若頭結(jié)點存放了有效數(shù)據(jù),則其為事實上的第1個結(jié)點。通常把除頭結(jié)點外的其他結(jié)點稱為數(shù)據(jù)結(jié)點,第1數(shù)據(jù)

2、結(jié)點也稱為首結(jié)點。通常只對存放實際數(shù)據(jù)的數(shù)據(jù)結(jié)點進(jìn)行編號(從1開始)。11.1鏈表的基本概念及要點11.1.1鏈表的基本概念(4)頭結(jié)點是鏈表的起始結(jié)點,結(jié)點標(biāo)號為0。11.1鏈表的基本概念及要點11.1.1鏈表的基本概念(5)最末結(jié)點指針域值為“”,表示其指針值為空(NULL)。(6)結(jié)點空間由malloc()函數(shù)動態(tài)獲取并進(jìn)行結(jié)點的創(chuàng)建。(7)頭結(jié)點是關(guān)鍵點,“抓住”了頭結(jié)點,就“抓住”了整個鏈表。鏈表示意圖如圖11-1所示。圖11-1鏈表11.1鏈表的基本概念及要點11.1.2鏈表結(jié)構(gòu)的定義及內(nèi)存空間的申請struct LNodeint data;/*數(shù)據(jù)域*/struct LNode

3、*next;/*指針域*/;struct LNode *p,*t; /*定義了兩個鏈表指針*/p=(struct LNode *)malloc(sizeof(struct LNode);/*申請內(nèi)存空間*/t=(struct LNode *)malloc(sizeof(structLNode);鏈表結(jié)構(gòu)(也稱結(jié)點結(jié)構(gòu))定義示例。示例1:11.1鏈表的基本概念及要點11.1.2鏈表結(jié)構(gòu)的定義及內(nèi)存空間的申請typedef struct LNodeint data;/*數(shù)據(jù)域*/struct LNode *next;/*指針域*/NODE;/*定義了一個鏈表結(jié)構(gòu)類別名NODE*/NODE *p,*

4、t; /*用類別名定義兩個鏈表指針*/p=(NODE *)malloc(sizeof(NODE);/*申請內(nèi)存空間*/t=(NODE *)malloc(sizeof(NODE);示例2:11.1鏈表的基本概念及要點11.1.3鏈表的基本操作要點鏈表的操作主要靠“-”運算符和指針域來實現(xiàn)。設(shè)若有模塊11.1.2的示例1和示例2的鏈表結(jié)構(gòu),可以做以下簡化的理解:(1)左為指針域,右為指向下一個結(jié)點:“t-next=p-next;”意為把p指向的下一個結(jié)點的地址保存到t的指針域。“p=p-next;”意為指針p下移。(2)當(dāng)出現(xiàn)雙重“-”運算符時:“p-next-data=3;”意為把常值3賦給p指

5、向的下一結(jié)點的數(shù)據(jù)域?!皃-next-datadata;”意為p指向的下一結(jié)點的數(shù)據(jù)域值小于t指向結(jié)點的數(shù)據(jù)域值?!皃-next-datat-next-data;”意為p指向的下一結(jié)點的數(shù)據(jù)域值大于t指向的下一結(jié)點的數(shù)據(jù)域值。(3)鏈表操作往往須借助于多個鏈表指針,單一指針是不可能完成復(fù)雜操作的。11.2單鏈表11.2.1單鏈表的建立尾插法所謂尾插法,就是把剛創(chuàng)建的結(jié)點插入前一結(jié)點之后,最后給最末結(jié)點指針域賦空值即可。為了便于讀者學(xué)習(xí)、理解,在后面的學(xué)習(xí)中直接把鏈表指針稱為結(jié)點,事實上是指針指向結(jié)點。11.2單鏈表11.2.1單鏈表的建立尾插法【例11-1】學(xué)生成績鏈表頭結(jié)點為第1個數(shù)據(jù)結(jié)點。

6、#include #include struct LNode/*定義鏈表結(jié)構(gòu)(也可稱為結(jié)點結(jié)構(gòu)體),數(shù)據(jù)域有姓名、班級和成績*/char name8;int class;int score4; /*語數(shù)外加專業(yè)4科成績*/struct LNode *next; /*指針域,指針域存放下一個結(jié)點的存儲位置(指針)*/;/*創(chuàng)建鏈表指針函數(shù),返回鏈表指針,實際上是返回鏈表的頭指針*/struct LNode *create(int n)struct LNode *h,*p,*t; /*鏈表的創(chuàng)建一般來說需3個鏈表指針,一個頭(如h),一個尾(如t),一個動態(tài)指針(如p),用于動態(tài)獲取內(nèi)存空間*/1

7、1.2單鏈表11.2.1單鏈表的建立尾插法char xm8;/*對應(yīng)鏈表結(jié)構(gòu)中的數(shù)據(jù)域姓名成員*/int clas,a4;/*對應(yīng)鏈表結(jié)構(gòu)中的數(shù)據(jù)域班級和成績成員*/int i,j;h=NULL;/*關(guān)鍵句1:頭指針賦空值*/printf(Please input name,class and 4 score:n);for(i=n;i0;-i)p=(struct LNode *)malloc(sizeof(struct LNode); /*分配內(nèi)存空間,建立結(jié)點*/scanf(%s%d,xm,&clas);for(j=0;jname,xm);p-class=clas;for(j=0;jscor

8、ej=aj;11.2單鏈表11.2.1單鏈表的建立尾插法if(h=NULL)/*下面兩句為關(guān)鍵語句2*/h=p;/*理解為:如果頭為空,就把剛創(chuàng)建的結(jié)點轉(zhuǎn)為頭結(jié)點*/t=p;/*理解為:并把剛創(chuàng)建的結(jié)點轉(zhuǎn)為尾結(jié)點??梢姷?個新結(jié)點必須具備雙重身份:既為頭又為尾。這兩句僅執(zhí)行1次,目的就是創(chuàng)建頭結(jié)點*/elset-next=p; /*這兩句為關(guān)鍵語句3:從第2次創(chuàng)建的結(jié)點開始,其地址保存于上一結(jié)點指針域*/t=p;/*新建結(jié)點又轉(zhuǎn)為尾結(jié)點*/t-next=NULL;/*關(guān)鍵語句4:結(jié)點創(chuàng)建完畢,給最后一個結(jié)點指針域賦空*/return h;/*關(guān)鍵語句5:必須返回頭結(jié)點*/11.2單鏈表11.2

9、.1單鏈表的建立尾插法int main()int n,j;struct LNode *q;/*定義一個鏈表指針,用于接收函數(shù)返回來的值*/printf(Input you want to create point:);scanf(%d,&n);q=create(n);/*調(diào)用create()函數(shù),上面函數(shù)返回的是頭指針值*/printf(nametclasstChinesetMathstEnglisetProfessialn);while(q)printf(%st%dt ,q-name,q-class); /*輸出數(shù)據(jù)域*/for(j=0;jscorej);putchar(n);q=q-nex

10、t; /*關(guān)鍵語句6:指針位移指向下一結(jié)點*/printf(n);free(q);11.2單鏈表11.2.1單鏈表的建立尾插法Input you want to create point:3Please input name,class and 4 score:Lucy 3 89 87 85 65Jack 3 69 78 95 64Lily 3 87 68 92 91name class Chinese Maths English ProfessionLucy 3 89 87 85 65Jack 3 69 78 95 64Lily 3 87 68 92 91創(chuàng)建3個結(jié)點,輸入/輸出數(shù)據(jù)如下:1

11、1.2單鏈表11.2.1單鏈表的建立尾插法上述鏈表尾插法創(chuàng)建過程如圖11-2所示。創(chuàng)建上面的學(xué)生鏈表時,若要保持頭結(jié)點數(shù)據(jù)域為空,應(yīng)怎么修改呢?【例11-1】是把整個新建的結(jié)點轉(zhuǎn)為了頭結(jié)點,因而頭結(jié)點成了事實上的第1個數(shù)據(jù)結(jié)點?,F(xiàn)在要保持其為空,就不能這樣操作,應(yīng)該把新建的結(jié)點地址保存在頭結(jié)點的指針域,這樣就避免了整體轉(zhuǎn)換,頭結(jié)點有了新建結(jié)點的地址,而其數(shù)據(jù)域仍然為空。圖11-2【例11-1】鏈表尾插法示意圖11.2單鏈表11.2.1單鏈表的建立尾插法#include #include struct LNodechar name8;int class;int score4;struct LNo

12、de *next;struct LNode *create(int n)struct LNode *h,*p,*t;char xm8;int clas,a4;int i,j;h-next=NULL;/*關(guān)鍵語句1:給頭結(jié)點指針域賦空*/11.2單鏈表11.2.1單鏈表的建立尾插法printf(Please input name,class and 4 score:n);for(i=n;i0;-i)p=(struct LNode *)malloc(sizeof(struct LNode); scanf(%s%d,xm,&clas);for(j=0;jname,xm);p-class=clas;f

13、or(j=0;jscorej=aj;if(h-next=NULL)h-next=p;/*關(guān)鍵語句2:新建結(jié)點地址保存到頭結(jié)點指針域。僅第1次新建時執(zhí)行*/t=p;11.2單鏈表11.2.1單鏈表的建立尾插法elset-next=p; t=p; t-next=NULL;return h;int main()int n,j;struct LNode *q;printf(Input you want to create point:);scanf(%d,&n);q=create(n);q=q-next;/*關(guān)鍵語句3:頭結(jié)點數(shù)據(jù)域為空,因而要從第1個數(shù)據(jù)結(jié)點開始*/11.2單鏈表11.2.1單鏈表的

14、建立尾插法printf(nametclasstChinesetMathstEnglisetProfessialn);while(q)printf(%st%dt ,q-name,q-class);for(j=0;jscorej);putchar(n);q=q-next;printf(n);11.2單鏈表11.2.1單鏈表的建立尾插法頭結(jié)點為空的尾插法創(chuàng)建過程如圖11-3所示。圖11-3頭結(jié)點為空的尾插法創(chuàng)建過程11.2單鏈表11.2.2單鏈表的建立頭插法所謂頭插法,就是把新建結(jié)點依次插入前一結(jié)點之前,則原頭結(jié)點變?yōu)樽钅┙Y(jié)點,最后建立的結(jié)點變?yōu)榈?結(jié)點。這個過程剛好與尾插法是相反的。頭插法的結(jié)點排

15、列按照堆的從低到高的生長方向,輸出時將按從高到低的地址輸出,即輸入時的反序輸出。11.2單鏈表11.2.2單鏈表的建立頭插法【例11-2】編寫一個鏈表,讀入一行字符,每個字符存入一個結(jié)點,按輸入的順序建立一個鏈表的結(jié)點序列,然后按相反的順序輸出,并釋放全部結(jié)點。該題用頭插法即可實現(xiàn):#include #include struct Nodechar ch;struct Node *next;struct Node *h=NULL; /*關(guān)鍵語句1: 頭已賦空,將作為最末結(jié)點*/struct Node *create()char c;struct Node *p;while(c=getchar(

16、)!=n)p=(struct Node*)malloc(sizeof(struct Node);p-ch=c;11.2單鏈表11.2.2單鏈表的建立頭插法p-next=h; /*關(guān)鍵語句2:頭保存到新建結(jié)點指針域*/h=p;/*關(guān)鍵語句3:新建結(jié)點轉(zhuǎn)為新的頭*/return h;int main()struct Node *q,*t;q=create();printf(The result is:n);while(q)printf(%c ,q-ch);free(q);/如輸入 abcde,則輸出e d c b aq=q-next;11.2單鏈表11.2.2單鏈表的建立頭插法頭插法創(chuàng)建鏈表示意圖

17、如圖11-4所示。圖11-4頭插法創(chuàng)建鏈表示意圖11.2單鏈表11.2.3單鏈表結(jié)點逆置所謂單鏈表結(jié)點逆置,指的是把結(jié)點倒轉(zhuǎn),頭變尾,尾變頭。例如,輸入“2 4 1”,輸出“1 4 2”。#include #include typedef struct LNode int data;struct LNode *next;Node;/*鏈表結(jié)構(gòu)類別名,定義類別名,可以省不少事*/ Node *h;/*尾插法鏈表建立(創(chuàng)建步驟同前,略)*/Node *create(int n)11.2單鏈表11.2.3單鏈表結(jié)點逆置 /*-創(chuàng)建鏈表逆置函數(shù)-*/Node *reverse(Node *h)/*在以

18、h為頭結(jié)點的鏈表中實現(xiàn)逆序*/Node *p,*t;p=h;/*關(guān)鍵語句1:先安排p在頭結(jié)點位置*/t=p-next;/*關(guān)鍵語句2:再把p指向的下一結(jié)點用t來表示*/p-next=NULL;/*關(guān)鍵語句3:把p(此時尚未進(jìn)入循環(huán),實際就是頭結(jié)點)的指針域賦空,斷掉其與后面結(jié)點的連接。事實上,它將變?yōu)樽詈笠粋€結(jié)點*/while(t)/*開始循環(huán)*/p=t;/*關(guān)鍵語句4:先把t轉(zhuǎn)換為p*/t=t-next;/*關(guān)鍵語句5:t再變?yōu)橄乱唤Y(jié)點*/p-next=h;/*關(guān)鍵語句6:把頭結(jié)點的地址(如100)保存到p的指針域*/h=p;/*關(guān)鍵語句7: 再把p轉(zhuǎn)為新的頭結(jié)點*/return h;/*返

19、回頭結(jié)點,此時的h已不是原鏈表的頭結(jié)點了*/11.2單鏈表11.2.3單鏈表結(jié)點逆置int main()int n;Node *q;printf(Input you want to create point:); scanf(%d,&n);q=create(n);q=reverse(q);/*結(jié)點逆置*/printf(The result is:);while(q)printf(%d ,q-data);q=q-next; 輸入/輸出示例:Input you want to create point:5Input number:1 5 6 2 4The result is:4 2 6 5 111

20、.2單鏈表11.2.3單鏈表結(jié)點逆置單鏈表逆置實現(xiàn)原理如圖11-5所示。圖11-5單鏈表逆置實現(xiàn)原理11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除1.單鏈表結(jié)點查詢【例11-3】結(jié)點查詢實例。在一個頭為空的單鏈表中查詢某個數(shù)值。找到便輸出該結(jié)點的位置和查找的值,找不到便提示“Can not find your need!”。#include #include typedef struct LNodeint data;struct LNode *next;NODE;NODE *h;/*建立頭為空的鏈表*/NODE *create(int n)NODE *p,*t;int a,i;h=(NO

21、DE *)malloc(sizeof(NODE);11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除h-next=NULL;printf(Input every data:);for(i=n;i0;-i)p=(NODE *)malloc(sizeof(NODE);scanf(%d,&a);p-data=a;if(h-next=NULL)h-next=p; t=p; elset-next=p; t=p; t-next=NULL;return h;11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除/*-結(jié)點查詢函數(shù)的實現(xiàn),返回地址,為指針函數(shù)-*/void *search(NODE *h,in

22、t score )/*在以h為頭的鏈表中查找值等于score的結(jié)點*/NODE *p;int i=0;/*頭為空,標(biāo)號為0*/p=h;/*借助指針p*/while(p!=NULL&p-data!=score)/*關(guān)鍵語句1:循環(huán)條件*/p=p-next; /*關(guān)鍵語句2:指針下移。如果有匹配的值,p將剛好到達(dá)這個結(jié)點*/i+;11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除if(p-data!=score)printf(Can not find you need!n);elseprintf(Result is:NO.%djd-%d,i,p-data);putchar(n);int main

23、()int n,score;NODE *q;printf(Input you want to create point:);scanf(%d,&n);q=create(n);printf(nInput you want to find score:);scanf(%d,&score);search(h,score);輸入/輸出如下:Input you want to create point:3Input every data:478 524 586Input you want to find score:524Result is:NO.2jd-52411.2單鏈表11.2.4單鏈表結(jié)點查詢、

24、插入和刪除2.單鏈表結(jié)點插入【例11-4】在一個頭為第1數(shù)據(jù)結(jié)點的單鏈表中的指定位置插入一個新的結(jié)點。#include #include #include typedef struct LNodechar name10;int class;int data;struct LNode *next;NODE;NODE *h;11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除/*-鏈表創(chuàng)建函數(shù)略-*/ NODE *create(int n)/*-插入一個結(jié)點的實現(xiàn)-*/int insert(NODE *h,int i)/*在以h為頭的鏈表中,在第i處插入一個結(jié)點*/int j; NODE *p,*

25、t;p=(NODE *)malloc(sizeof(NODE); printf(Please input name,class,data:);scanf(%s%d%d,p-name,&p-clas,&p-data); /*給新結(jié)點數(shù)據(jù)域輸入數(shù)據(jù)*/if(i1)return 0;t=h;/*關(guān)鍵語句1*/j=1;11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除while(t!=NULL&ji-1)/*關(guān)鍵語句2:注意這里條件的變化jnext;j+;if(t=NULL)return 0;if(i=1)/*關(guān)鍵語句3:如果要插在頭結(jié)點前*/p-next=t;h=p;else/*關(guān)鍵語句4:其他情

26、況的統(tǒng)一插入法*/p-next=t-next;t-next=p;printf(The new order is:n);printf(NametClasstScoren);11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除t=h;/*關(guān)鍵語句5:因為頭是首結(jié)點,故需從頭開始*/while(t)printf(%st%dt%dn,t-name,t-class,t-data);t=t-next;return 1;int main()int n,i,c;NODE *q;printf(Input you want to create point:);scanf(%d,&n);q=create(n);pr

27、intf(Input you want to insert place:);scanf(%d,&i);c=insert(h,i);printf( return %d-Insert successful!n,c);else11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除printf( return %d-Insert fail!n,c);插入示例如下:Input you want to create point:3Input name,class and score:Jack 3 547Input name,class and score:Lucy 3 654Input name,class

28、 and score:Lily 3 624Input you want to insert place:2Please input name,class,data:David 3 586The new order is:NameClassScoreJack3547David3586Lucy3654Lily3624return 1 -Insert successful!11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除結(jié)點插入示意圖如圖11-6所示。圖11-6結(jié)點插入示意圖11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除3.單鏈表的結(jié)點刪除【例11-5】在一個頭為第1數(shù)據(jù)結(jié)點的鏈表中刪除指

29、定位置的結(jié)點。#include #include #include typedef struct LNodechar name10;int class;int data;struct LNode *next; NODE;NODE *h;/*-鏈表創(chuàng)建函數(shù)略-*/ NODE *create(int n)11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除/*-刪除一個結(jié)點的實現(xiàn)-*/int delnode(NODE *h,int i)NODE *p,*t;int j;if(i1)return 0;t=h;j=1;while(t!=NULL&jnext;j+;11.2單鏈表11.2.4單鏈表結(jié)點查

30、詢、插入和刪除if(t=NULL)return 0;if(i=1) h=h-next;elsep=t-next;t-next=p-next;printf(The new order is:n);printf(NametClasstScoren);t=h;while(t)printf(%st%dt%dn,t-name,t-class,t-data);t=t-next;free(p);return 1;11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除ain()int n,i,c;NODE *q;printf(Input you want to create point:);scanf(%d,&

31、n);q=create(n);printf(Input you want to delete jd:);scanf(%d,&i);c=delnode(h,i);if(c=1) printf( return %d-Delete successful!n,c);else printf( return %d-Delete fail!n,c);11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除刪除示例如下:Input you want to create point:3Input name,class and score:Jack 2 56Input name,class and score:Luc

32、y 2 65Input name,class and score:Lily 3 67Input you want to delete jd:3The new order is:NameClassScoreJack 2 56Lucy 2 65return 1-Delete succesful!11.2單鏈表11.2.4單鏈表結(jié)點查詢、插入和刪除結(jié)點刪除示意圖如圖11-7所示。圖11-7結(jié)點刪除示意圖11.2單鏈表11.2.5單鏈表的排序【例11-6】用尾插法建立一個簡單的鏈表,并將鏈表中的數(shù)據(jù)按升序輸出到顯示器上。程序的思路是:遍歷鏈表,找到最小結(jié)點;把找到的結(jié)點放入有序鏈表;把找到的結(jié)點從原鏈

33、表中刪除。循環(huán)執(zhí)行這三個步驟直到工作完成。#include #include typedef struct LNode int data;struct LNode *next;Node; Node *h;/*-創(chuàng)建鏈表-*/Node *create(int n)Node *p,*t; int a,i;11.2單鏈表11.2.5單鏈表的排序h=NULL;printf(Input number:);for(i=n;i0;-i)p=(Node *)malloc(sizeof(Node); scanf(%d,&a);p-data=a;if(h=NULL)h=p;t=p;elset-next=p; t=

34、p; t-next=NULL;return h;/*-創(chuàng)建排序函數(shù)-*/Node *line(Node *h)/*在以h為頭結(jié)點的鏈表中排序*/11.2單鏈表11.2.5單鏈表的排序Node *top;/*排序后有順序鏈表的表頭指針*/Node *p_tail;/*排序后有順序鏈表的表尾指針*/Node *pmin_before;/*保留數(shù)值最小的結(jié)點的前驅(qū)結(jié)點的指針*/Node *pmin;/*用于存儲最小結(jié)點*/Node *p;/*當(dāng)前比較的結(jié)點*/top=NULL;/*新表頭指針賦空值*/while(h!=NULL)/*在while里要循環(huán)完成三個步驟*/*第一個步驟,遍歷,找到最小結(jié)點

35、*/for(p=h,pmin=h;p-next!=NULL;p=p-next)/*關(guān)鍵語句1:循環(huán)遍歷原鏈表*/if(p-next-datadata)/*如果p指向的下一個結(jié)點的數(shù)據(jù)域小于當(dāng)前數(shù)據(jù)域值*/pmin_before=p; /*關(guān)鍵語句2:數(shù)值最小的結(jié)點的前一結(jié)點p保存到pmin_before*/pmin=p-next;/*關(guān)鍵語句3:數(shù)值最小的結(jié)點保存到pmin*/ 11.2單鏈表11.2.5單鏈表的排序/*第二步驟,把找到值放入有序鏈表中,其過程與新建鏈表一致*/if(top=NULL)top=pmin;p_tail=pmin;elsep_tail-next=pmin;p_tai

36、l=pmin;/*第三步驟:根據(jù)判斷安排該結(jié)點離開原鏈表*/if(pmin=h)/*關(guān)鍵語句4:如果找到的最小結(jié)點就是第一個結(jié)點*/h=h-next;/*刪除第一個結(jié)點:第二個結(jié)點代替第一個結(jié)點*/elsepmin_before-next=pmin-next; /*關(guān)鍵語句5:最小結(jié)點后面的那個結(jié)點(跳過最小結(jié)點)直接保存到最小結(jié)點之前的那個結(jié)點*/*while外循環(huán)結(jié)束處*/if(top!=NULL)11.2單鏈表11.2.5單鏈表的排序p_tail-next=NULL;/*得到有序鏈表top(頭指針),給最后一個結(jié)點的next域賦空*/h=top;/*把新鏈表頭指針轉(zhuǎn)換為h*/return

37、 h;int main()int n;Node *q; printf(Input you want to create point:);scanf(%d,&n);q=create(n);printf(Output old order:n);while(q)printf(%d,q-data);q=q-next;printf(n);q=line(h);11.2單鏈表11.2.5單鏈表的排序printf(Output new order:n);while(q)printf(%d,q-data);q=q-next; printf(n); 輸入/輸出示例如下:Input you want to crea

38、te point:5Input number:9 1 4 7 3Output old order:91473Output new order:1347911.2單鏈表11.2.5單鏈表的排序鏈表排序三步法圖示如圖11-8所示。圖11-8鏈表排序三步法圖示11.3雙 向 鏈 表雙向鏈表的建立單向鏈表只能單向下指,只有一個方向,雙向鏈表則不然,雙向鏈表具有三部分:(1)前驅(qū)指針域:該指針域存放前一結(jié)點的地址。(2)數(shù)據(jù)域。(3)后繼指針域:存放下一結(jié)點的地址。相對于單向鏈表,雙向鏈表多了一個指針域:前驅(qū)指針域,如圖11-所示。圖11-9雙向鏈表11.4循 環(huán) 鏈 表循環(huán)鏈表與單鏈表的操作方法僅有細(xì)

39、微的差別。(1)在創(chuàng)建鏈表時,最后一個結(jié)點的指針域保存的是頭結(jié)點地址(不再是空值)。(2)若頭不為空,輸出時先輸出首結(jié)點;若頭為空,正常輸出。(3)循環(huán)遍歷鏈表結(jié)點時的判斷值不再以NULL為條件,而是以不等于鏈表的頭指針為條件。循環(huán)鏈表圖示如圖11-10所示。圖11-10循環(huán)鏈表圖示11.4循 環(huán) 鏈 表【例11-7】循環(huán)鏈表的創(chuàng)建與輸出(頭為第1數(shù)據(jù)結(jié)點)。#include #include typedef struct LNodeint data;struct LNode *next; Node;Node *h;Node *create(int n)Node *p,*t;int a;int

40、 i;h=NULL;printf(Input number:);for(i=n;i0;-i)p=(Node *)malloc(sizeof(Node);11.4循 環(huán) 鏈 表scanf(%d,&a);p-data=a;if(h=NULL)h=p;t=p;elset-next=p; t=p;t-next=h; /*關(guān)鍵語句1:創(chuàng)建鏈表時末結(jié)點指針域保存頭的地址*/return h;int main()int n;Node *q;printf(Input you want to create point:);scanf(%d,&n);q=create(n);11.4循 環(huán) 鏈 表h=q;print

41、f(The result is:);printf(%d ,q-data); /*關(guān)鍵語句2:頭為第一數(shù)據(jù)結(jié)點,先輸頭*/q=q-next; /*關(guān)鍵語句3:指針移到第2結(jié)點位置*/while(q!=h)/*關(guān)鍵語句4*/printf(%d ,q-data);q=q-next;(1)結(jié)構(gòu)體數(shù)組各成員在內(nèi)存中是連續(xù)存儲的,即其地址是連續(xù)的,因而方便查詢,但是不方便插入和移動。(2)鏈表各結(jié)點是離散存儲的,方便移動和插入,但不方便查詢。11.5鏈表和結(jié)構(gòu)體數(shù)組的區(qū)別11.5鏈表和結(jié)構(gòu)體數(shù)組的區(qū)別【例11-8】結(jié)構(gòu)體中的指針成員。struct nodeint n;struct node *next;x=10,x+1,20,x

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論