數(shù)據(jù)結(jié)構(gòu) 課件 第2章 線性表(2鏈表)_第1頁
數(shù)據(jù)結(jié)構(gòu) 課件 第2章 線性表(2鏈表)_第2頁
數(shù)據(jù)結(jié)構(gòu) 課件 第2章 線性表(2鏈表)_第3頁
數(shù)據(jù)結(jié)構(gòu) 課件 第2章 線性表(2鏈表)_第4頁
數(shù)據(jù)結(jié)構(gòu) 課件 第2章 線性表(2鏈表)_第5頁
已閱讀5頁,還剩50頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

線性表中每個(gè)元素有唯一的前驅(qū)元素和后繼元素。2.3.1

單鏈表的定義1.鏈表概述1/552.3線性表的鏈?zhǔn)奖硎久總€(gè)物理結(jié)點(diǎn)增加一個(gè)指向后繼結(jié)點(diǎn)的指針域

單鏈表。每個(gè)物理結(jié)點(diǎn)增加一個(gè)指向后繼結(jié)點(diǎn)的指針域和一個(gè)指向前驅(qū)結(jié)點(diǎn)的指針域

雙鏈表。2/55學(xué)號(hào)姓名性別班號(hào)1張斌男99018劉麗女990234李英女990120陳華男990212王奇男990126董強(qiáng)男99025王萍女9901設(shè)計(jì)鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)時(shí),每個(gè)邏輯元素用一個(gè)結(jié)點(diǎn)單獨(dú)存儲(chǔ),為了表示邏輯關(guān)系,增加指針域。線性表(a0,a1,…,ai,…,an-1

)映射邏輯結(jié)構(gòu)存儲(chǔ)結(jié)構(gòu)帶頭結(jié)點(diǎn)單鏈表示意圖a1a2an∧…L3/55typedefstructLNode//聲明單鏈表結(jié)點(diǎn)類型{inflistdata;

structLNode*next;//指向后繼結(jié)點(diǎn)}LinkNode;typedefstructinf{ intnum; charname[8];

charsex[4];

intglassno;}inflist;線性表(a0,a1,…,ai,…,an-1

)映射邏輯結(jié)構(gòu)存儲(chǔ)結(jié)構(gòu)帶頭結(jié)點(diǎn)雙鏈表示意圖a1an∧…La24/55順序表:需要平均移動(dòng)半個(gè)表的元素。鏈表:只需修改相關(guān)結(jié)點(diǎn)的指針域即可,這樣既方便又省時(shí)。插入或刪除操作5/55鏈表和順序表的比較順序表:具有隨機(jī)存取特性。鏈表:不具有隨機(jī)存取特性。6/55隨機(jī)存取特性(查找序號(hào)i的元素的時(shí)間為O(1))一般地,存儲(chǔ)密度越大,存儲(chǔ)空間的利用率就越高。顯然,順序表的存儲(chǔ)密度為1(100%),而鏈表的存儲(chǔ)密度小于1。存儲(chǔ)密度=結(jié)點(diǎn)數(shù)據(jù)本身占用的空間結(jié)點(diǎn)占用的空間總量a18個(gè)字節(jié)4個(gè)字節(jié)存儲(chǔ)密度=8/12=67%例如7/55存儲(chǔ)密度是指結(jié)點(diǎn)數(shù)據(jù)本身所占的存儲(chǔ)量和整個(gè)結(jié)點(diǎn)結(jié)構(gòu)中所占的存儲(chǔ)量之比,即:順序表:存儲(chǔ)密度高。鏈表:存儲(chǔ)密度相對(duì)較低。8/55存儲(chǔ)密度單鏈表中結(jié)點(diǎn)類型LinkNode的聲明如下:

typedefstructLNode

//聲明單鏈表結(jié)點(diǎn)類型{intdata;

structLNode*next;//指向后繼結(jié)點(diǎn)}

LinkNode;a9/552.3.2單鏈表上基本操作的實(shí)現(xiàn)a1a2an∧…第一個(gè)結(jié)點(diǎn)的操作和表中其他結(jié)點(diǎn)的操作相一致,無需進(jìn)行特殊處理。無論鏈表是否為空,都有一個(gè)頭結(jié)點(diǎn),因此空表和非空表的處理也就統(tǒng)一了。單鏈表增加一個(gè)頭結(jié)點(diǎn)的優(yōu)點(diǎn):帶頭結(jié)點(diǎn)單鏈表頭結(jié)點(diǎn)首結(jié)點(diǎn)尾結(jié)點(diǎn)10/55當(dāng)訪問過一個(gè)結(jié)點(diǎn)后,只能接著訪問它的后繼結(jié)點(diǎn),而無法訪問它的前驅(qū)結(jié)點(diǎn)。ab…p…p是指針,*p是p指向的結(jié)點(diǎn),為了簡(jiǎn)單,稱p指向的結(jié)點(diǎn)為p結(jié)點(diǎn)11/55單鏈表的特點(diǎn)插入操作:將值為x的新結(jié)點(diǎn)s插入到p結(jié)點(diǎn)之后。特點(diǎn):只需修改相關(guān)結(jié)點(diǎn)的指針域,不需要移動(dòng)結(jié)點(diǎn)。(1)插入結(jié)點(diǎn)操作12/551、插入結(jié)點(diǎn)和刪除結(jié)點(diǎn)操作abx…p…s

s->next=p->next

p->next=s插入操作語句描述如下:

s->next=p->next;

p->next=s;單鏈表插入結(jié)點(diǎn)演示p結(jié)點(diǎn)next的修改盡可能放在后面執(zhí)行13/55刪除操作:刪除p結(jié)點(diǎn)之后的一個(gè)結(jié)點(diǎn)。特點(diǎn):只需修改相關(guān)結(jié)點(diǎn)的指針域,不需要移動(dòng)結(jié)點(diǎn)。14/55(2)刪除結(jié)點(diǎn)操作abx…p…p->next=p->next->next刪除操作語句描述如下:

p->next=p->next->next;

free(p->next);為了釋放被刪除結(jié)點(diǎn),操作語句描述如下:

q=p->next;p->next=q->next;free(q);15/55單鏈表刪除結(jié)點(diǎn)演示16/55structstudent*createlist(){structstudent*head;structstudent*q;//指向當(dāng)前鏈表的最后一個(gè)結(jié)點(diǎn)structstudent*p;//新建結(jié)點(diǎn)intdata;head=(structstudent*)malloc(sizeof(structstudent));head->next=NULL;q=head;scanf("%d",&data);while(data!=9999){p=(structstudent*)malloc(sizeof(structstudent));//新建結(jié)點(diǎn)p->data=data;

p->next=q->next;q->next=p;//插入結(jié)點(diǎn)q=q->next;//保證q的邏輯完整性,q指向前鏈表的最后一個(gè)結(jié)點(diǎn)scanf("%d",&data);}returnhead;}整體建立單鏈表先考慮如何整體建立單鏈表。

a[0..n-1]帶頭結(jié)點(diǎn)的單鏈表L整體創(chuàng)建建立單鏈表的常用方法有兩種。17/552、整體建立單鏈表從一個(gè)空表開始,創(chuàng)建一個(gè)頭結(jié)點(diǎn)。依次讀取字符數(shù)組a中的元素,生成新結(jié)點(diǎn)將新結(jié)點(diǎn)插入到當(dāng)前鏈表的表頭上,直到結(jié)束為止。注意:鏈表的結(jié)點(diǎn)順序與邏輯次序相反。18/55(1)頭插法建表voidList_Head(LNode*&L)//頭插法{ LNode*s;intx; L=(LNode*)malloc(sizeof(LNode)); L->next=NULL; scanf("%d",&x); while(x!=9999){ s=(LNode*)malloc(sizeof(LNode)); s->data=x; s->next=L->next; L->next=s; scanf("%d",&x); }}19/55頭插法建表算法如下:注意:鏈表的結(jié)點(diǎn)順序與邏輯次序相同。從一個(gè)空表開始,創(chuàng)建一個(gè)頭結(jié)點(diǎn)。依次讀取字符數(shù)組a中的元素,生成新結(jié)點(diǎn)將新結(jié)點(diǎn)插入到當(dāng)前鏈表的表尾上,直到結(jié)束為止。增加一個(gè)尾指針r,使其始終指向當(dāng)前鏈表的尾結(jié)點(diǎn)20/55(2)尾插法建表voidList_Tail(LNode*&L)//尾插法

{ intx; L=(LNode*)malloc(sizeof(LNode)); LNode*s,*r=L; scanf("%d",&x); while(x!=9999){ s=(LNode*)malloc(sizeof(LNode)); s->data=x; r->next=s; r=s; scanf("%d",&x); } r->next=NULL;}21/55尾插法建表算法如下:(1)初始化線性表InitList(&L)

該運(yùn)算建立一個(gè)空的單鏈表,即創(chuàng)建一個(gè)頭結(jié)點(diǎn)。voidInitList(LinkNode*&L)

{L=(LinkNode*)malloc(sizeof(LinkNode));

//創(chuàng)建頭結(jié)點(diǎn)

L->next=NULL;}∧L22/553、線性表基本運(yùn)算在單鏈表上的實(shí)現(xiàn)

(2)銷毀線性表DestroyList(&L)

釋放單鏈表L占用的內(nèi)存空間。即逐一釋放全部結(jié)點(diǎn)的空間。

voidDestroyList(LinkNode*&L){

LinkNode*pre=L,*p=L->next;

//pre指向p的前驅(qū)結(jié)點(diǎn)

初始時(shí)L∧…prep23/55while(p!=NULL) //掃描單鏈表L

{free(pre); //釋放pre結(jié)點(diǎn)

pre=p; //pre、p同步后移一個(gè)結(jié)點(diǎn)

p=pre->next;

}

free(pre); //循環(huán)結(jié)束時(shí),p為NULL,pre指向尾結(jié)點(diǎn),釋放它}循環(huán)結(jié)束時(shí)L∧prep=NULL…24/55

(3)判斷線性表是否為空表ListEmpty(L)

若單鏈表L沒有數(shù)據(jù)結(jié)點(diǎn),則返回真,否則返回假。

boolListEmpty(LinkNode*L){

return(L->next==NULL);}∧L空表的情況25/55(4)求線性表的長(zhǎng)度ListLength(L)

返回單鏈表L中數(shù)據(jù)結(jié)點(diǎn)的個(gè)數(shù)。

intListLength(LinkNode*L){

intn=0;

LinkNode*p=L; //p指向頭結(jié)點(diǎn),n置為0(即頭結(jié)點(diǎn)的序號(hào)為0)

初始時(shí)L∧…pn=026/55while(p->next!=NULL)

{ n++; p=p->next;

}

return(n); //循環(huán)結(jié)束,p指向尾結(jié)點(diǎn),其序號(hào)n為結(jié)點(diǎn)個(gè)數(shù)}循環(huán)結(jié)束時(shí)L∧pn為結(jié)點(diǎn)個(gè)數(shù)…27/55

(5)輸出線性表DispList(L)

逐一掃描單鏈表L的每個(gè)數(shù)據(jù)結(jié)點(diǎn),并顯示各結(jié)點(diǎn)的data域值。

voidDispList(LinkNode*L){LinkNode*p=L->next; //p指向開始結(jié)點(diǎn)

while(p!=NULL) //p不為NULL,輸出p結(jié)點(diǎn)的data域

{printf("%d",p->data);

p=p->next; //p移向下一個(gè)結(jié)點(diǎn)

}

printf("\n");}L∧p…28/55

(6)求線性表L中位置i的數(shù)據(jù)元素GetElem(L,i,&e)

在單鏈表L中從頭開始找到第i個(gè)結(jié)點(diǎn),若存在第i個(gè)數(shù)據(jù)結(jié)點(diǎn),則將其data域值賦給變量e。29/55boolGetElem(LinkNode*L,inti,ElemType&e){intj=0;

LinkNode*p=L; //p指向頭結(jié)點(diǎn),j置為0(即頭結(jié)點(diǎn)的序號(hào)為0)

while(j<i&&p!=NULL)

{ j++; p=p->next;

}找第i個(gè)結(jié)點(diǎn)p循環(huán)結(jié)束時(shí)Lean∧…i…p30/55if(p==NULL) //不存在第i個(gè)數(shù)據(jù)結(jié)點(diǎn),返回false

returnfalse;

else

//存在第i個(gè)數(shù)據(jù)結(jié)點(diǎn),返回true

{e=p->data;

returntrue;

}}Lean∧…i…p算法的時(shí)間復(fù)雜度為O(n)

不具有隨機(jī)存取特性31/55(7)按元素值查找LocateElem(L,e)

在單鏈表L中從頭開始找第一個(gè)值域與e相等的結(jié)點(diǎn),若存在這樣的結(jié)點(diǎn),則返回位置,否則返回0。intLocateElem(LinkNode*L,ElemTypee){inti=1;

LinkNode*p=L->next; //p指向開始結(jié)點(diǎn),i置為1

while(p!=NULL&&p->data!=e)

{p=p->next; //查找data值為e的結(jié)點(diǎn),其序號(hào)為ii++;

}

循環(huán)結(jié)束時(shí)Le∧…i…p32/55Le∧…i…if(p==NULL)

//不存在元素值為e的結(jié)點(diǎn),返回0return(0);

else

//存在元素值為e的結(jié)點(diǎn),返回其邏輯序號(hào)i

return(i);}33/55

(8)插入數(shù)據(jù)元素ListInsert(&L,i,e)

先在單鏈表L中找到第i-1個(gè)結(jié)點(diǎn)p,若存在這樣的結(jié)點(diǎn),將值為e的結(jié)點(diǎn)結(jié)點(diǎn)s插入到其后。boolListInsert(LinkNode*&L,inti,ElemTypee){intj=0;

LinkNode*p=L,*s; //p指向頭結(jié)點(diǎn),j置為0

while(j<i-1&&p!=NULL)

{ j++; p=p->next;

}查找第i-1個(gè)結(jié)點(diǎn)L∧…i-1…p34/55if(p==NULL) //未找到第i-1個(gè)結(jié)點(diǎn),返回falsereturnfalse;

else

//找到第i-1個(gè)結(jié)點(diǎn)p,插入新結(jié)點(diǎn)并返回true

{ s=(LinkNode*)malloc(sizeof(LinkNode)); s->data=e; //創(chuàng)建新結(jié)點(diǎn)s,其data域置為e s->next=p->next; //將s插入到p之后

p->next=s; returntrue;

}}插入L∧…i-1…pes35/55(9)刪除數(shù)據(jù)元素ListDelete(&L,i,&e)

先在單鏈表L中找到第i-1個(gè)結(jié)點(diǎn)p,若存在這樣的結(jié)點(diǎn),且也存在后繼結(jié)點(diǎn),則刪除該后繼結(jié)點(diǎn)。

boolListDelete(LinkNode*&L,inti,ElemType&e){intj=0;

LinkNode*p=L,*q; //p指向頭結(jié)點(diǎn),j置為0

while(j<i-1&&p!=NULL) //查找第i-1個(gè)結(jié)點(diǎn)

{ j++; p=p->next;

}查找第i-1個(gè)結(jié)點(diǎn)L∧…i-1…p36/55if(p==NULL) //未找到第i-1個(gè)結(jié)點(diǎn),返回false returnfalse;

else

//找到第i-1個(gè)結(jié)點(diǎn)p

{q=p->next; //q指向第i個(gè)結(jié)點(diǎn)

if(q==NULL) //若不存在第i個(gè)結(jié)點(diǎn),返回false

returnfalse;

e=q->data;

p->next=q->next; //從單鏈表中刪除q結(jié)點(diǎn)

free(q); //釋放q結(jié)點(diǎn)

returntrue; //返回true表示成功刪除第i個(gè)結(jié)點(diǎn)

}}刪除第i個(gè)結(jié)點(diǎn)L∧…i-1…p37/55例2.3以單鏈表作為存儲(chǔ)結(jié)構(gòu),設(shè)計(jì)和實(shí)現(xiàn)某班某門課程成績(jī)管理的完整程序。程序要求完成如下功能:(1)創(chuàng)建成績(jī)鏈表,學(xué)生數(shù)據(jù)包含學(xué)生的學(xué)號(hào)、姓名和成績(jī)。(2)可以在指定學(xué)號(hào)學(xué)生前插入學(xué)生成績(jī)數(shù)據(jù)。(3)可以刪除指定學(xué)號(hào)的學(xué)生數(shù)據(jù)。(4)可以計(jì)算學(xué)生的總數(shù)。(5)可以按學(xué)號(hào)和姓名查找學(xué)生。(6)可以顯示所有學(xué)生的成績(jī)。(7)可以把學(xué)生成績(jī)按從高到低的順序排列。38/554、單鏈表的應(yīng)用示例#include<string.h>#include<malloc.h>#include<stdlib.h>#include<stdio.h>

typedefstructStudent/*學(xué)生類型定義*/{intscore;/*成績(jī)*/charsno[5],sname[8];/*學(xué)號(hào),姓名*/}Student;

typedefstructNode/*結(jié)點(diǎn)類型定義*/{StudentstudentInfo;/*學(xué)生信息*/structNode*next;/*指向后繼元素的指針域*/}LinkList;

voiddisplay(LinkList*p)/*在屏幕上顯示一個(gè)學(xué)生的成績(jī)信息*/{printf("\n\n\nno\t\tname\t\tscore:");printf("\n%s",p->studentInfo.sno);/*打印學(xué)號(hào)*/printf("\t\t");printf("%s",p->studentInfo.sname);/*打印姓名*/printf("\t\t");printf("%-4d\n",p->studentInfo.score);/*打印成績(jī)*/}39/55voiddisplayAll(LinkList*L)/*在屏幕上顯示所有學(xué)生的成績(jī)信息*/{LinkList*p;p=L->next;printf("\n\n\nno\t\tname\t\tscore:");while(p){printf("\n%s",p->studentInfo.sno);/*打印學(xué)號(hào)*/printf("\t\t");printf("%s",p->studentInfo.sname);/*打印姓名*/printf("\t\t");printf("%-4d\n",p->studentInfo.score);/*打印成績(jī)*/p=p->next;}}

40/55LinkList*inputdata()/*輸入學(xué)生信息*/{LinkList*s=NULL;/*s是指向新建結(jié)點(diǎn)的指針*/charsno[5];/*存儲(chǔ)學(xué)號(hào)的數(shù)組*/printf("\n");printf("sno:");scanf("%s",sno);/*輸入學(xué)號(hào)*/if(sno[0]=='#')/*#結(jié)束輸入*/returns;s=(LinkList*)malloc(sizeof(LinkList));strcpy(s->studentInfo.sno,sno);if(strlen(sno)>4)/*如果sno字符個(gè)數(shù)大于等于5,因?yàn)樽址疀]有'\0'結(jié)束標(biāo)志,

在讀數(shù)據(jù)時(shí)將把姓名字符一起讀到sno數(shù)組,因此做了如下處理*/s->studentInfo.sno[4]='\0';printf("name:");scanf("%s",s->studentInfo.sname);/*輸入姓名*/printf("score:");scanf("%d",&s->studentInfo.score);/*輸入成績(jī)*/returns;}41/55LinkList*createTailList()/*以尾插法建立帶頭結(jié)點(diǎn)的學(xué)生信息單鏈表*/{LinkList*L,*s,*r;/*L頭指針,r尾指針,s是指向新建結(jié)點(diǎn)的指針*/L=(LinkList*)malloc(sizeof(LinkList));/*建立頭結(jié)點(diǎn),申請(qǐng)結(jié)點(diǎn)存儲(chǔ)空間*/r=L;/*尾指針指向頭結(jié)點(diǎn)*/printf("請(qǐng)輸入學(xué)生成績(jī),當(dāng)學(xué)號(hào)no為#時(shí)結(jié)束:\n");while(1)/*逐個(gè)輸入學(xué)生的成績(jī)*/{s=inputdata();if(!s)break;/*s為空時(shí)結(jié)束輸入*/r->next=s;/*把新結(jié)點(diǎn)插入到尾指針后*/r=s;/*r指向新的尾結(jié)點(diǎn)*/}r->next=NULL;/*尾指針的指針域?yàn)榭?/displayAll(L);/*顯示所有學(xué)生信息*/returnL;}

42/55voidlocateElemByno(LinkList*L,charch[5])/*按學(xué)號(hào)查找學(xué)生的算法*/{LinkList*p=L->next;/*從第一個(gè)結(jié)點(diǎn)開始查找*/while(p&&(strcmp(p->studentInfo.sno,ch)!=0))/*p不空且輸入學(xué)號(hào)與鏈表中學(xué)號(hào)不等*/p=p->next;if(!p){printf("\n\n\tDon'tfindthestudent!\n");}else{display(p);/*顯示查找到的學(xué)生信息*/}}

voidlocateElemByname(LinkList*L,charsname[8])/*按姓名查找學(xué)生的算法*/{LinkList*p=L->next;/*從第一個(gè)結(jié)點(diǎn)開始查找*/while(p&&(strcmp(p->studentInfo.sname,sname)!=0))p=p->next;if(!p){printf("\n\n\tDon'tfindthestudent!\n");}else{display(p);/*顯示查找到的學(xué)生信息*/}}

43/55intlengthList(LinkList*L)/*求學(xué)生總?cè)藬?shù)的算法*/{LinkList*p=L->next;/*p指向第一個(gè)結(jié)點(diǎn)*/intj=0;while(p){p=p->next;j++;}/*p所指的是第j個(gè)結(jié)點(diǎn)*/returnj;}

voidinsertElem(LinkList*L,charch[5])/*在指定學(xué)號(hào)前插入學(xué)生*/{LinkList*p,*s;p=L;/*從頭結(jié)點(diǎn)開始查找學(xué)號(hào)為ch的結(jié)點(diǎn)的前趨結(jié)點(diǎn)p*/while((p->next)&&(strcmp(p->next->studentInfo.sno,ch)!=0))p=p->next;s=inputdata();/*輸入欲插入學(xué)生信息*/s->next=p->next;p->next=s;}

44/55voiddeleteElem(LinkList*L,charch[5])/*刪除給定學(xué)號(hào)的學(xué)生信息的算法*/{LinkList*p,*q;p=L;while((p->next)&&(strcmp(p->next->studentInfo.sno,ch)!=0)){p=p->next;/*從頭結(jié)點(diǎn)開始查找學(xué)號(hào)為ch的結(jié)點(diǎn)的前趨結(jié)點(diǎn)p*/}if(!p->next)/*已經(jīng)掃描到表尾也沒找到*/{printf("\n\n\tDon'tfindthestudent!\n");}else{q=p->next;/*q指向?qū)W號(hào)為ch的結(jié)點(diǎn)*/printf("\n\ndeletedstudent'sinformation:");display(q);p->next=q->next;/*改變指針*/free(q);/*釋放q占用空間*/printf("\n\nallstudent'sinformation:");displayAll(L);}}

45/55voidinsertSort(LinkList*L)/*用直接插入排序思想把學(xué)生的成績(jī)按從高到低排序,結(jié)果保存在新有序鏈表中,原鏈表不變*/{LinkList*L1,*p;/*L1有序鏈表的表頭,p插入位置前結(jié)點(diǎn)*/LinkList*q,*s;/*q欲插入L1中的結(jié)點(diǎn)*/intlen;len=lengthList(L);L1=(LinkList*)malloc(sizeof(LinkList));/*建立頭結(jié)點(diǎn),申請(qǐng)結(jié)點(diǎn)存儲(chǔ)空間*/if(L->next)/*鏈表L非空*/{/*生成有序鏈表的第一個(gè)結(jié)點(diǎn)*/s=(LinkList*)malloc(sizeof(LinkList));/*建立結(jié)點(diǎn)*/strcpy(s->studentInfo.sno,L->next->studentInfo.sno);strcpy(s->studentInfo.sname,L->next->studentInfo.sname);s->studentInfo.score=L->next->studentInfo.score;s->next=NULL;L1->next=s;/*只有原單鏈表的第一個(gè)結(jié)點(diǎn)的有序鏈表L1*/q=L->next->next;/*原單鏈表的第二個(gè)結(jié)點(diǎn),q即要插入有序鏈表L1中的結(jié)點(diǎn)*/}else{printf("\nthestudentlinklistisempty\n");return;}//下頁續(xù)46/55while(q)/*鏈表L中有結(jié)點(diǎn)*/{p=L1;/*從鏈表L1的第一個(gè)結(jié)點(diǎn)開始比較*/while((p->next)&&(p->next->studentInfo.score>=q->studentInfo.score))p=p->next;/*查找插入位置前結(jié)點(diǎn)*//*生成欲插入有序鏈表中的結(jié)點(diǎn)*/s=(LinkList*)malloc(sizeof(LinkList));/*建立新結(jié)點(diǎn)*/strcpy(s->studentInfo.sno,q->studentInfo.sno);strcpy(s->studentInfo.sname,q->studentInfo.sname);s->studentInfo.score=q->studentInfo.score;if(!p->next)/*p是有序鏈表的最后一個(gè)結(jié)點(diǎn)*/{s->next=NULL;p->next=s;}else{s->next=p->next;p->next=s;}q=q->next;/*下一個(gè)欲插入有序鏈表的結(jié)點(diǎn)*/}/*while(!q)*/displayAll(L1);/*顯示生成的有序鏈表*/}

47/55intmain(){printf("=============================================\n\n");printf("帶頭結(jié)點(diǎn)的學(xué)生成績(jī)管理程序\n\n");printf("=============================================\n\n");LinkList*L;charch[5],sname[8];intb=1;while(b){inta;printf("\n\n");printf("<1>創(chuàng)建(帶頭尾插)<2>指定學(xué)號(hào)前插入<3>按學(xué)號(hào)刪除\n");printf("<4>計(jì)算學(xué)生總數(shù)<5>按學(xué)號(hào)查找<6>按姓名查找\n");printf("<7>顯示所有學(xué)生<8>成績(jī)排序<9>退出\n");printf("\n請(qǐng)輸入功能選項(xiàng):");scanf("%d",&a);switch(a){case1:L=createTailList();break;case2:printf("\n輸入欲在哪個(gè)學(xué)號(hào)前插入數(shù)據(jù):");scanf("%s",ch);insertE

溫馨提示

  • 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論