




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、/*c1 、h (程序名) */ #include #include #include/* malloc() 等*/ #include/*INT_MAX 等*/ #includevstdio、h/* EOF(=AZ或 F6),NULL */ #include/* atoi() */ #include/* eof() */ #include/* floor(),ceil(),abs() */ #include/* exit() */ /* 函數(shù)結(jié)果狀態(tài)代碼 */ #defineTRUE 1 #defineFALSE 0 #defineOK 1 #defineERROR 0 #defineINFE
2、ASIBLE -1 /* #define OVERFLOW -2因?yàn)樵?math、h 中已定義 OVERFLOW!值為 3,故去 掉此行 */typedef intStatus;/* Status 就是函數(shù)得類型 ,其值就是函數(shù)結(jié)果狀態(tài)代 碼,女口 OK等*/typedef intBoolean;/* Boolean 就是布爾類型,其值就是TRUE或 FALSE */ /* algo2-1、 c 實(shí)現(xiàn)算法 2、 1 !程序*/ #includec1、h typedef intElemType; #includec2-1、h /*c2-1 、 h 線性表得動(dòng)態(tài)分配順序存儲(chǔ)結(jié)構(gòu) */ #defin
3、 eLIST_INIT_SIZE10線性表存儲(chǔ)空間得初始分配量 * #defineLISTINCREMENT 2線/*性表存儲(chǔ)空間得分配增量 */ typedefstruct ElemType*elem;/*存儲(chǔ)空間基址* intlength;/* 當(dāng)前 xx*/ intlistsize;/*當(dāng)前分配得存儲(chǔ)容量(以sizeof(ElemType為單位)*/ SqList; #includebo2-1 、c /* bo2-1 、c 順序表示得線性表 (存儲(chǔ)結(jié)構(gòu)由 c2-1、h 定義)得基本操作 (12個(gè)) */ StatusInitList(SqList*L)/*算法 2、3 */ /*操作結(jié)果
4、:構(gòu)造一個(gè)空得順序線性表 */ (*L)、 elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType); if(!(*L) 、 elem) exit(OVERFLOW);/存儲(chǔ)分配失敗*/ (*L)、length=0;/* 空表長度為 0 */ (*L)、listsize二LIST_INIT_SIZE初始存儲(chǔ)容量 */ retur nOK; StatusDestroyList(SqList*L) /*初始條件:順序線性表L已存在。操作結(jié)果:銷毀順序線性表L */ free(*L)、 elem); (*L)、 elem=NULL; (*L)、 l
5、ength=0; (*L)、 listsize=0; returnOK; StatusClearList(SqList*L) /*初始條件:順序線性表L已存在。操作結(jié)果:將L重置為空表*/ (*L)、 length=0; returnOK; StatusListEmpty(SqListL) /*初始條件:順序線性表L已存在。操作結(jié)果:若L為空表,則返回 TRUE否貝返回FALSE */ if(L、 length=0) returnTRUE; else returnFALSE; int ListLength(SqListL) /*初始條件:順序線性表L已存在。操作結(jié)果:返回L中數(shù)據(jù)元素個(gè)數(shù)*/
6、return L 、 length; Status GetElem(SqListL,inti,ElemType*e) /*初始條件:順序線性表 L已存在,1 i ListLength(L) */ /* 操作結(jié)果:用 e 返回 L 中第 i 個(gè)數(shù)據(jù)元素得值 */ if(iL 、length) exit(ERROR); *e=*(L 、elem+i-1); returnOK; int LocateElem(SqListL,ElemTypee,Status(*compare)(ElemType,ElemType) /*初始條件:順序線性表L已存在,compare。就是數(shù)據(jù)元素判定函數(shù)(滿足 為 1,
7、否則為 0) */ /*操作結(jié)果:返回L中第1個(gè)與e滿足關(guān)系compare()得數(shù)據(jù)元素得位序。 */* 若這樣得數(shù)據(jù)元素不存在,則返回值為 0。算法 2、6 */ ElemType*p; inti=1;/* i 得初值為第 1 個(gè)元素得位序 */ 3 / 124 p=L、elem;/* p 得初值為第 1 個(gè)元素得存儲(chǔ)位置 */ while(i=L、length if(i=L、length) returni; else return0; Status PriorElem(SqListL,ElemTypecur_e,ElemType*pre_e) /*初始條件:順序線性表L已存在*/ /* 操
8、作結(jié)果:若 cur_e 就是 L 得數(shù)據(jù)元素,且不就是第一個(gè),則用 pre_e 返 回它得前驅(qū), */ /* 否則操作失敗, pre_e 無定義 */ inti=2; ElemType*p=L、elem+1; while(iL、length) returnINFEASIBLE; else *pre_e=*-p; returnOK; Status NextElem(SqListL,ElemTypecur_e,ElemType*next_e) /*初始條件:順序線性表L已存在*/ next_e /*操作結(jié)果:若cur_e就是L得數(shù)據(jù)元素,且不就是最后一個(gè),則用 返回它得后繼, */ /* 否則操作
9、失敗, next_e 無定義 */ inti=1; ElemType*p=L、elem; while(iL、length p+; if(i=L、length) returnINFEASIBLE; else *next_e=*+p; returnOK; StatusListlnsert(SqList*L,inti,ElemTypee)/算法 2、4 */ /*初始條件:順序線性表 L已存在,1 i ListLength(L)+1 */ /*操作結(jié)果:在L中第i個(gè)位置之前插入新得數(shù)據(jù)元素e, L得長度加1 */ ElemType*newbase,*q,*p; if(i(*L) 、 length+1
10、)/* i 值不合法*/ returnERROR; if(*L)、length=(*L)、listsize)/*當(dāng)前存儲(chǔ)空間已滿,增加分配*/ newbase=(ElemType*)realloc(*L)、 elem,(*L) listsize+LlSTlNCREMENT)*sizeof(ElemType); if(!newbase) exit(OVERFLOW);/存儲(chǔ)分配失敗*/ (*L)、elem二newbase;/* 新基址 */ (*L)、listsize+二LISTINCREMENT增加存儲(chǔ)容量 */ q=(*L)、 elem+i-1;/* q 為插入位置 */ for(p=(*L
11、) 、elem+(*L)、 length-1;p=q;-p)/* 插入位置及之后得元素右移 */ *(p+1)=*p; *q=e;/* 插入 e */ +(*L)、length;/* 表長增 1 */ 、returnOK; StatusListDelete(SqList*L,inti,ElemType*e)/*算法 2、5 */ /*初始條件:順序線性表 L已存在,1 i ListLength(L) */ /* 操作結(jié)果:刪除 L 得第 i 個(gè)數(shù)據(jù)元素,并用 e 返回其值, L 得長度減 1 */ ElemType*p,*q; if(i(*L) 、 length)/* i 值不合法 */ re
12、turnERROR; p=(*L)、 elem+i-1;/* p 為被刪除元素得位置 */ *e=*p;/* 被刪除元素得值賦給 e */ q=(*L)、 elem+(*L)、 length-1;/* 表尾元素得位置 */ for(+p;pv二q;+p)/*被刪除元素之后得元素左移*/ *(p-1)=*p; (*L)、 length-;/* 表長減 1 */ returnOK; StatusListTraverse(SqListL,void(*vi)(ElemType*) /*初始條件:順序線性表L已存在*/ /*操作結(jié)果:依次對L得每個(gè)數(shù)據(jù)元素調(diào)用函數(shù) vi()。一旦vi()失敗,則操 作失
13、敗*/*vi()得形參加 inti; p=L、elem; for(i=1;i=L、length;i+) vi(p+); printf(n); returnOK; Statusequal(ElemTypec1,ElemTypec2) /*判斷就是否相等得函數(shù),Union()用到*/ if(c1=c2) returnTRUE; else returnFALSE; void Un io n(SqList*La,SqListLb)/算法 2、1 */ /*將所有在線性表Lb中但不在La中得數(shù)據(jù)元素插入到La中*/ ElemTypee; intLa_len,Lb_len; inti; La_len=Li
14、stLength(*La);/*求線性表得長度 */ Lb_len=ListLength(Lb); for(i=1;iLbM皿 EH)*/ 宀 GefE-em(LaAQOai)八 Gem-em(Lbjdbj)八 if(aAHbj) Lisf-nsert(LC+Ka 三 + e-se 宀 Lisf-nsert(LC+Kbj)八 + whi-e(AHLal-en)/*L?LEH)*LbH)*/ 宀 亠2 _24 Gem-em(La+QOaix Lisf-nsert(LC+Ka 三 whi-e0AHLbl-en)/*LbH)bn*LaH)*/ 宀 Gem-em(Lbj+QObj)八 Lisf-nse
15、rt(LC+Kbj)八 void pinf(E-emType*c) pinff(=%d=*c)八 void maino 宀 SqLis 產(chǎn) p InitList(/* 創(chuàng)建空表 Lb */ for(j=1;jv=7;j+)/*在表Lb中插入7個(gè)元素*/ ListInsert( printf(Lb= );/* 輸出表 Lb得內(nèi)容 */ ListTraverse(Lb,print); MergeList(La,Lb, printf(Lc= );/* 輸出表 Lc得內(nèi)容*/ ListTraverse(Lc,print); /* algo2-3、c 實(shí)現(xiàn)算法 2、7得程序*/ #includec1 、
16、h typedef intElemType; #includec2-1 、h #includebo2-1 、c void MergeList(SqListLa,SqListLb,SqList*Lc)算法 2、7 */ /*已知順序線性表La與Lb得元素按值非遞減排列。*/ /*歸并La與Lb得到新得順序線性表Lc,Lc得元素也按值非遞減排列*/ ElemType*pa,*pa_last,*pb,*pb_last,*pc; pa=La、 elem; pb=Lb、 elem; (*Lc)、listsize=(*Lc) length二La、length+Lb、length;/* 不用 InitLis
17、t()創(chuàng)建空表 Lc */pc=(*Lc)、 elem=(ElemType*)malloc(*Lc)、 listsize*sizeof(ElemType); if(!(*Lc)、elem)/* 存儲(chǔ)分配失敗 */ exit(OVERFLOW); pa_last=La、 elem+La、 length-1; pb_last=Lb、 elem+Lb、 length-1; while(pa=pa_last else *pc+=*pb+; while(pa=pa_last)/* 表 La非空且表 Lb 空*/ *pc+=*pa+;/*插入La得剩余元素*/ while(pb=pb_last)/* 表
18、Lb非空且表 La 空*/ *pc+=*pb+;/*插入Lb得剩余元素*/ void print(ElemType*c) printf(%d ,*c); void main() SqListLa,Lb,Lc; intj; InitList(/* 創(chuàng)建空表 La */ for(j=1;jv=5;j+)/*在表La中插入5個(gè)元素*/ ListInsert( printf(La= );/* 輸出表 La得內(nèi)容 */ ListTraverse(La,print); InitList(/* 創(chuàng)建空表 Lb */ for(j=1;j=5;j+)/*在表Lb中插入5個(gè)元素*/ ListInsert( pri
19、ntf(Lb= );/* 輸出表 Lb得內(nèi)容 */ ListTraverse(Lb,print); MergeList(La,Lb, printf(Lc= );/* 輸出表 Lc得內(nèi)容*/ ListTraverse(Lc,print); /* algo2-4、c 修改算法 2、7 得第一個(gè)循環(huán)語句中得條件語句為開關(guān)語句, 且當(dāng)*/* *pa=*pb時(shí),只將兩者中之一插入 Lc。此操作得結(jié)果與算法2、1相同 */ #includec1、h typedef intElemType; #includec2-1、h #includebo2-1、c intcomp(ElemTypec1,ElemType
20、c2) inti; if(c1 -engfh 丄 whi-e(paAHPal-asQSQOpbAHPbl-asf)/*LaLbMH)*/ swifch(comp(*papb)/* 乓Q*M2, 70*/ 宀 caseppb+ case;pc+H*pa+ break case ;pc+H*pb+ whi-e(paAHPal-asf)/*LaH)bn*LbH)*/ *pc+H*pa+ whi-e(pbAHPbl-asf)/*LbH)bn*LaH)*/ *pc+H*pb+ (*LC),-engfhHPC(*LC),e-emrs乓Q *_ void prinfmemTypeo 宀 亠8 /亠24 pr
21、intf(%d ,*c); void main() SqListLa,Lb,Lc; intj; InitList(/* 創(chuàng)建空表 La */ for(j=1;jv=5;j+)/*在表La中插入5個(gè)元素*/ ListInsert( printf(La= );/* 輸出表 La得內(nèi)容 */ ListTraverse(La,print); InitList(/* 創(chuàng)建空表 Lb */ for(j=1;jnext二NULL;/*指針域?yàn)榭?*/ returnOK; StatusDestroyList(LinkList*L) /*初始條件:線性表L已存在。操作結(jié)果:銷毀線性表L */ LinkList
22、q; while(*L) q=(*L)-next; free(*L); *L=q; returnOK; StatusClearList(LinkList L)/不改變 L */ /*初始條件:線性表L已存在。操作結(jié)果:將L重置為空表*/ LinkList p,q; p=L-next;/* p 指向第一個(gè)結(jié)點(diǎn) */ while(p)/* 沒到表尾 */ q=p-next; free(p); p=q; L-next二NULL;/*頭結(jié)點(diǎn)指針域?yàn)榭?/ returnOK; StatusListEmpty(LinkList L) /*初始條件:線性表L已存在。操作結(jié)果:若L為空表,則返回TRUE否 則
23、返回 FALSE */ if(L- next)/* 非空 */ returnFALSE; else returnTRUE; int ListLength(LinkList L) /*初始條件:線性表L已存在。操作結(jié)果:返回L中數(shù)據(jù)元素個(gè)數(shù)*/ inti=0; LinkList p=L-next;/* p 指向第一個(gè)結(jié)點(diǎn) */ while(p)/* 沒到表尾 */ i+; p=p-next; returni; Status GetElem(LinkList L,inti,ElemType*e)/算法 2、8 */ 21 / 124 /*L 為帶頭結(jié)點(diǎn)得單鏈表得頭指針。當(dāng)?shù)?i 個(gè)元素存在時(shí) ,其
24、值賦給 e 并返 回OK,否則返回ERROR */ intj=1;/* j 為計(jì)數(shù)器 */ LinkList p=L-next;/* p 指向第一個(gè)結(jié)點(diǎn) */ while(p j+; if(!p|ji)/* 第 i 個(gè)元素不存在 */ returnERROR; *e=p-data;/* 取第 i 個(gè)元素 */ returnOK; int LocateElem(LinkList L,ElemTypee,Status(*compare)(ElemType,ElemType)/* 初始條件:線性表L已存在,compare()就是數(shù)據(jù)元素判定函數(shù)(滿足為1,否則為0) */*操作結(jié)果:返回L中第1個(gè)與
25、e滿足關(guān)系compare()得數(shù)據(jù)元素得位序。*/* 若這樣得數(shù)據(jù)元素不存在 ,則返回值為 0 */ inti=0; LinkList p=L-next; while(p) if(compare(p-data,e)/* 找到這樣得數(shù)據(jù)元素 */ returni; p=p-next; return0; Status PriorElem(LinkList L,ElemTypecur_e,ElemType*pre_e) /*初始條件:線性表L已存在*/ /*操作結(jié)果若cur_e就是L得數(shù)據(jù)元素,且不就是第一個(gè),則用pre_e返回它 得前驅(qū),*返回0K;否則操作失敗,pre_e無定義,返回INFEAS
26、IBLE */ LinkList q,p=L-next;/* p 指向第一個(gè)結(jié)點(diǎn) */ while(p-next)/* p 所指結(jié)點(diǎn)有后繼 */ q=p-next;/* q 為 p 得后繼 */ if(q-data=cur_e) *pre_e=p-data; returnOK; p=q;/* p 向后移*/ returnINFEASIBLE; Status NextElem(LinkList L,ElemTypecur_e,ElemType*next_e) /*初始條件:線性表L已存在*/ /* 操作結(jié)果:若 cur_e 就是 L 得數(shù)據(jù)元素,且不就是最后一個(gè),則用 next_e 返回它得后繼
27、, */ /*返回0K;否則操作失敗,next_e無定義,返回INFEASIBLE */LinkList p=L-next;/* p 指向第一個(gè)結(jié)點(diǎn) */ while(p-next)/* p 所指結(jié)點(diǎn)有后繼 */ if(p-data=cur_e) *next_e=p-next-data; returnOK; p=p-next; returnINFEASIBLE; StatusListInsert(LinkList L,inti,ElemTypee)/算法 2、9。不改變 L */ /* 在帶頭結(jié)點(diǎn)得單鏈線性表 L 中第 i 個(gè)位置之前插入元素 e */ intj=0; LinkList p=L
28、,s; while(p j+; if(!p|ji-1)/* i 小于 1 或者大于表長 */ returnERROR; s=(LinkList)malloc(sizeof(structLNode);/性成新結(jié)點(diǎn) */ s-data二e;/*插入 L 中 */ s-next=p-next; p-next=s; returnOK; StatusListDelete(LinkList L,inti,ElemType*e)/算法 2、10。不改變 L */ /*在帶頭結(jié)點(diǎn)得單鏈線性表L中,刪除第i個(gè)元素,并由e返回其值*/ intj=0; LinkList p=L,q; while(p-next j+
29、; if(!p-next|ji-1)/* 刪除位置不合理 */ returnERROR; q=p-next;/* 刪除并釋放結(jié)點(diǎn) */ p-next=q-next; *e=q-data; free(q); returnOK; StatusListTraverse(LinkList L,void(*vi)(ElemType) /* vi得形參類型為ElemType,與bo2-1、c中相應(yīng)函數(shù)得形參類型 ElemType while(p) vi(p-data); p=p-next; printf(n); returnOK; void CreateList(LinkList *L,intn)/*算法
30、 2、11 */ /*逆位序(插在表頭)輸入n個(gè)元素得值,建立帶表頭結(jié)構(gòu)得單鏈線性表 inti; LinkList p; *L=(LinkList)malloc(sizeof(structLNode); (*L)- next二NULL;/*先建立一個(gè)帶頭結(jié)點(diǎn)得單鏈表*/ printf(請輸入%d個(gè)數(shù)據(jù)n, n); for(i=n;i0;-i) p=(LinkList)malloc(sizeof(structLNode);/*生成新結(jié)點(diǎn) */ scanf(%d,/* 輸入元素值 */ p-next=(*L)-next;/* 插入到表頭 */ (*L)-next=p; void CreateLis
31、t2(LinkList *L,intn) /* 正位序 (插在表尾 )輸入 n 個(gè)元素得值,建立帶表頭結(jié)構(gòu)得單鏈線性表 inti; LinkList p,q; L */ */ *L=(LinkList)malloc(sizeof(structLNode);/*生成頭結(jié)點(diǎn) */ (*L)-next=NULL; q=*L; printf(請輸入d個(gè)數(shù)據(jù)n, n); for(i=1;idata); q-next=p; q=q-next; p-next=NULL; void MergeList(LinkList La,LinkList *Lb,LinkList *Lc)/算法 2、12 */ /*已知
32、單鏈線性表La與Lb得元素按值非遞減排列。*/ /*歸并La與Lb得到新得單鏈線性表Lc, Lc得元素也按值非遞減排列*/ LinkList pa=La-next,pb=(*Lb)-next,pc; *Lc=pc=La;/*用La得頭結(jié)點(diǎn)作為Lc得頭結(jié)點(diǎn)*/ while(pa pc=pa; pa=pa-next; else pc-next=pb; pc=pb; pb=pb-next; pc-next=pa?pa:pb;/* 插入剩余段 */ free(*Lb);/*釋放Lb得頭結(jié)點(diǎn)*/ Lb=NULL; void visit(ElemTypec)/* ListTraverse(調(diào)用得函數(shù)(類型
33、要一致)*/ printf(%d ,c); void main() intn=5; LinkList La,Lb,Lc; printf( 按非遞減順序 , ); CreateList2(/*正位序輸入n個(gè)元素得值*/ printf(La=);/*輸出鏈表La得內(nèi)容*/ ListTraverse(La,visit); printf( 按非遞增順序 , ); CreateList(/*逆位序輸入n個(gè)元素得值*/ printf(Lb=);/*輸出鏈表Lb得內(nèi)容*/ ListTraverse(Lb,visit); MergeList(La,/*按非遞減順序歸并La與Lb得到新表Lc */ printf
34、(Lc=);/*輸出鏈表Lc得內(nèi)容*/ ListTraverse(Lc,visit); /* algo2-6 、c 利用單鏈表結(jié)構(gòu)處理教科書圖 2、1(學(xué)生健康登記表 ) */ #includec1、h #defineNAMELEN 8/*姓名最大長度 */ #defineCLASSLEN 4/班*級(jí)名最大長度 */ struct stud /* 記錄得結(jié)構(gòu) */ char nameNAMELEN+1; long num; char sex; intage; char ClassCLASSLEN+1; inthealth; ; typedefstruct stud ElemType;/* 鏈表
35、結(jié)點(diǎn)元素類型為結(jié)構(gòu)體 */ #includec2-2、h char sta39=健康,一般,神經(jīng)衰弱;/*健康狀況(3類)*/ FILE *fp; StatusInitList(LinkList*L)/*拷自 bo2-2、c */ /* 操作結(jié)果:構(gòu)造一個(gè)空得線性表 L */ *L=(LinkList)malloc(sizeof(structLNode);/*產(chǎn)生頭結(jié)點(diǎn),并使 L指向此頭結(jié)點(diǎn) */if(!*L)/* 存儲(chǔ)分配失敗 */ exit(OVERFLOW); (*L)-next二NULL;/*指針域?yàn)榭?*/ returnOK; StatusListTraverse(LinkList
36、L,void(*vi)(ElemType)拷自 bo2-2、c */ /*初始條件:線性表L已存在*/ /*操作結(jié)果:依次對L得每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)vi()。一旦vi()失敗,則操作失 敗 */Li nkList p=L- next; while(p) vi(p-data); p=p-next; printf(n); returnOK; void InsertAscend(LinkList L,ElemTypee)/此函數(shù)就是由 bo2-9、c 中得同名函 數(shù)改寫 */* 按學(xué)號(hào)非降序插入 */ LinkList q=L,p=L-next; while(p p=p-next; q-next=(
37、LinkList)malloc(sizeof(structLNode);/*插在 q 后*/ q-next-data=e; q-next-next=p; void Print(structstud e) /* 顯示記錄 e 得內(nèi)容 */ printf(%-8s %6ld,e、 name,e、 num); if(e、 sex=m) printf( 男); else printf( 女); printf(%5d %-4s,e、age,e、Class); printf(%9sn,stae 、health); void ReadIn(structstud *e) /* 由鍵盤輸入結(jié)點(diǎn)信息 */ pri
38、ntf(請輸入姓名(name); printf( 請輸入學(xué)號(hào) : ); scanf(%ld, printf(請輸入性別(m:男f:女):); scanf(%*c%c, printf( 請輸入年齡 : ); scanf(%d, printf(請輸入班級(jí)(Class); printf( 請輸入健康狀況 (0:%s 1:%s 2:%s):,sta0,sta1,sta2); scanf(%d, void WriteTo stud e) /* 將結(jié)點(diǎn)信息寫入 fp 指定得文件 */ fwrite( StatusReadFrom stud *e) /* 由 fp 指定得文件讀取結(jié)點(diǎn)信息到 e */ int
39、i; i=fread(e,sizeof(structstud),1,fp); if(i=1)/* 讀取文件成功 */ returnOK; else returnERROR; StatusFindFromNum(LinkList L,long num,LinkList *p,LinkList *q) /*查找表中學(xué)號(hào)為num得結(jié)點(diǎn),如找到,q指向此結(jié)點(diǎn),p指向q得前驅(qū),*/ /*并返回TRUE如無此元素,則返回FALSE */ *p=L; while(*p) *q=(*p)-next; if(*q if(*q *p=*q; returnFALSE; StatusFindFromName(Link
40、List L,char name,LinkList *p,LinkList *q) /*查找表中姓名為name得結(jié)點(diǎn),如找到,q指向此結(jié)點(diǎn),p指向q得前驅(qū),*/ /*并返回TRUE如無此元素,則返回FALSE */ *p=L; while(*p) *q=(*p)-next; if(*q *p=*q; returnFALSE; Status DeleteElemNum(LinkList L,long num) /*刪除表中學(xué)號(hào)為num得元素,并返回TRUE如無此元素,則返回FALSE */LinkList p,q; if(FindFromNum(L,num, free(q); returnTRU
41、E; returnFALSE; Status DeleteElemName(LinkList L,char name) /*刪除表中姓名為name得元素,并返回TRUE如無此元素,則返回 FALSE */LinkList p,q; if(FindFromName(L,name, free(q); returnTRUE; returnFALSE; void Modify(ElemType*e) /* 修改結(jié)點(diǎn)內(nèi)容 */ char s80; Print(*e);/* 顯示原內(nèi)容 */ :n); printf( 請輸入待修改項(xiàng)得內(nèi)容,不修改得項(xiàng)按回車鍵保持原值 printf(請輸入姓名(name,s
42、); printf( 請輸入學(xué)號(hào) : ); gets(s); if(strlen(s) e-num=atol(s); printf(請輸入性別(m:男f:女):); gets(s); if(strlen(s) e-sex=s0; printf( 請輸入年齡 : ); gets(s); if(strlen(s) e-age=atoi(s); printf(請輸入班級(jí)(Class,s); printf( 請輸入健康狀況 (0:%s 1:%s 2:%s):,sta0,sta1,sta2); gets(s); if(strlen(s) e-health=atoi(s);/* 修改完畢 */ #defi
43、neN 4/* student 記錄得個(gè)數(shù) */ void main() structstud studentN=王小林,790631,m,18,計(jì) 91,0, 陳紅,790632,f,20,計(jì) 91,1, 劉建平,790633,m,21,計(jì) 91,0, 張立立,790634,m,17,計(jì) 91,2;/* 表得初始記錄 */inti,j,flag=1; long num; char 13,nameNAMELEN+1; ElemTypee; LinkList T,p,q; InitList(/* 初始化鏈表 */ while(flag) printf(1: 將結(jié)構(gòu)體數(shù)組 student 中得記錄
44、按學(xué)號(hào)非降序插入鏈表 n); printf(2: 將文件中得記錄按學(xué)號(hào)非降序插入鏈表 n); printf(3: 鍵盤輸入新記錄,并將其按學(xué)號(hào)非降序插入鏈表 n); printf(4: 刪除鏈表中第一個(gè)有給定學(xué)號(hào)得記錄 n); printf(5: 刪除鏈表中第一個(gè)有給定姓名得記錄 n); printf(6: 修改鏈表中第一個(gè)有給定學(xué)號(hào)得記錄 n); printf(7: 修改鏈表中第一個(gè)有給定姓名得記錄 n); printf(8: 查找鏈表中第一個(gè)有給定學(xué)號(hào)得記錄 n); printf(9: 查找鏈表中第一個(gè)有給定姓名得記錄 n); printf(10: 顯示所有記錄 11:將鏈表中得所有記錄存
45、入文件12:結(jié)束 n); printf( 請選擇操作命令 : ); scanf(%d, switch(i) case 1:for(j=0;jdata); if(q-data、num!=num)/* 學(xué)號(hào)被修改 */ p-next二q-next;/*把q所指得結(jié)點(diǎn)從L中刪除*/ InsertAscend(T,q-data);/*把元素插入 L */ free(q);/* 刪除 q */ break; case 7: printf(請輸入待修改記錄得姓名:”); seanf(%s%*c,name);/* %*c 吃掉回車符 */ if(!FindFromName(T,name, else num=
46、q-data、num;/* 學(xué)號(hào)存入 num */ Modify( if(q-data、 num!=num)/* 學(xué)號(hào)被修改 */ p-next二q-next;/*把q所指得結(jié)點(diǎn)從L中刪除*/ InsertAscend(T,q-data);/*把元素插入 L */ free(q);/* 刪除 q */ break; case 8: printf(請輸入待查找記錄得學(xué)號(hào):); scanf(%ld, if(!FindFromNum(T,num, else Print(q-data); break; case 9: printf(請輸入待查找記錄得姓名:”); scanf(%s,name); if(
47、!FindFromName(T,name, else Print(q-data); break; case 10:printf(姓名學(xué)號(hào)性別年齡班級(jí)健康狀況n); ListTraverse(T,Print); break; case 11:printf(請輸入文件名:); scanf(%s,); if(fp=fopen(,wb)=NULL) printf( 打開文件失敗 !n); else ListTraverse(T,WriteToFile); fclose(fp); break; case 12:flag=0; /* algo2-7 、c 教科書中圖 2、 1 0靜態(tài)鏈表示例 */ /*
48、第一個(gè)結(jié)點(diǎn)得位置在 0、cur 中,成員 cur 得值為 0,則到鏈表尾 */ #includec1 、h #defineN 6/* 字符串長度 */ typedef char ElemTypeN; #includec2-3、h /* c2-3 、h 線性表得靜態(tài)單鏈表存儲(chǔ)結(jié)構(gòu) */ #defineMAXSIZE 100/*鏈表得最大長度 */ typedefstruct ElemTypedata; intcur; component,SLinkListMAXSIZE; void main() SLinkList s=,1,ZHAO,2,QIAN,3,SUN,4,LI,5,ZHOU,6,WU,
49、7,ZHENG ,8,WANG,0; inti; i=s0、cur; while(i)/*輸出教科書中圖2、10(a)得狀態(tài)*/ printf(%s ,si、data);/* 輸出鏈表得當(dāng)前值 */ i=si、 cur;/* 找到下一個(gè) */ printf(n); s4、cur=9;/*按教科書中圖2、10(b)修改*/ s6、 cur=8; s9、 cur=5; strcpy(s9、 data,SHI); i=s0、 cur; while(i)/*輸出教科書中圖2、10(b)得狀態(tài)*/ printf(%s ,si、data);/* 輸出鏈表得當(dāng)前值 */ i=si、 cur;/* 找到下一個(gè)
50、 */ printf(n); /* algo2-8、 c 實(shí)現(xiàn)算法 2、 17得程序*/ #includec1 、 h #defineN 2 typedef char ElemType; #includec2-3、 h #includebo2-3、 c /* bo2-3 、 c 實(shí)現(xiàn)算法 2、 15、 2、 1 6得程序(數(shù)據(jù)結(jié)構(gòu)由 c2-3、 h 定義) (3 個(gè))*/intMalloc(SLinkList space)/*算法 2、15 */ /* 若備用鏈表非空 ,則返回分配得結(jié)點(diǎn)下標(biāo) (備用鏈表得第一個(gè)結(jié)點(diǎn) ),否則返 回 0 */inti=space0 、 cur; if(i)/*
51、備用鏈表非空 */ space0、cur=spacei、cur;/* 備用鏈表得頭結(jié)點(diǎn)指向原備用鏈表得第二個(gè) 結(jié)點(diǎn) */returni;/* 返回新開辟結(jié)點(diǎn)得坐標(biāo) */ void Free(SLinkList spacentk)/算法 2、16 */ /* 將下標(biāo)為 k 得空閑結(jié)點(diǎn)回收到備用鏈表 (成為備用鏈表得第一個(gè)結(jié)點(diǎn) ) */ spacek、 cur=space0、 cur;/* 回收結(jié)點(diǎn)得游標(biāo)指向備用鏈表得第一個(gè) 結(jié)點(diǎn)*/space0、cur=k;/*備用鏈表得頭結(jié)點(diǎn)指向新回收得結(jié)點(diǎn) */ void DestroyList() /* 靜態(tài)數(shù)組不能被銷毀 */ #includebo2-3
52、2、 c /* bo2-32 、 c 一個(gè)數(shù)組可生成若干靜態(tài)鏈表 (數(shù)據(jù)結(jié)構(gòu)由 c2-3、 h 定義)得基 本操作(12 個(gè))*/void InitSpace(SLinkList L)/算法 2、14。另加 */ /*將一維數(shù)組L中各分量鏈成一個(gè)備用鏈表,L0、cur為頭指針?!?表示 空指針 */inti; for(i=0;iMAXSIZE-1;i+) Li、 cur=i+1; LMAXSIZE-1、 cur=0; intInitList(SLinkList L) /* 構(gòu)造一個(gè)空鏈表,返回值為空表在數(shù)組中得位序 */ inti; i二Malloc(L);/* 調(diào)用 Malloc(),簡化程
53、序 */ Li、cur=0;/*空鏈表得表頭指針為空(0) */ returni; StatusClearList(SLinkList L,intn) /* 初始條件: L 中表頭位序?yàn)?n 得靜態(tài)鏈表已存在。操作結(jié)果:將此表重 置為空表 */intj,k,i=Ln 、 cur;/* 鏈表第一個(gè)結(jié)點(diǎn)得位置 */ Ln、cur=0;/* 鏈表空 */ k=L0、cur;/*備用鏈表第一個(gè)結(jié)點(diǎn)得位置*/ L0、cur=i;/*把鏈表得結(jié)點(diǎn)連到備用鏈表得表頭*/ while(i)/* 沒到鏈表尾 */ j=i; i=Li、 cur;/* 指向下一個(gè)元素 */ Lj、cur=k;/*備用鏈表得第一個(gè)結(jié)
54、點(diǎn)接到鏈表得尾部*/ returnOK; StatusListEmpty(SLinkList L,intn) /*判斷L中表頭位序?yàn)閚得鏈表就是否空,若就是空表返回TRUE否則返回 FALSE */if(Ln cur=O)/* 空表 */ returnTRUE; else returnFALSE; int ListLength(SLinkList L,intn) /* 返回 L 中表頭位序?yàn)?n 得鏈表得數(shù)據(jù)元素個(gè)數(shù) */ intj=0,i=Ln、 cur;/* i 指向第一個(gè)元素 */ while(i)/* 沒到靜態(tài)鏈表尾 */ i=Li、 cur;/* 指向下一個(gè)元素 */ j+; ret
55、urnj; Status GetElem(SLinkList L,intn,inti,ElemType*e) /* 用 e 返回 L 中表頭位序?yàn)?n 得鏈表得第 i 個(gè)元素得值 */ intl,k=n;/* k 指向表頭序號(hào) */ if(iListLength(L,n)/* i 值不合理 */ returnERROR; for(l=1;l=i;l+)/* 移動(dòng) i-1 個(gè)元素 */ k=Lk、cur; *e=Lk、data; returnOK; int LocateElem(SLinkList L,intn,ElemTypee) /*在L中表頭位序?yàn)閚得靜態(tài)單鏈表中查找第1個(gè)值為e得元素。*
56、/ /*若找到,則返回它在L中得位序,否則返回0 */ inti=Ln、cur;/* i 指示表中第一個(gè)結(jié)點(diǎn) */ while(i returni; Status PriorElem(SLinkList L,intn,ElemTypecur_e,ElemType*pre_e) /*初始條件:在L中表頭位序?yàn)閚得靜態(tài)單鏈表已存在*/ /* 操作結(jié)果:若 cur_e 就是此單鏈表得數(shù)據(jù)元素,且不就是第一個(gè), */ /*則用pre_e返回它得前驅(qū),否則操作失敗,pre_e無定義*/ intj,i=Ln 、cur;/* i 為鏈表第一個(gè)結(jié)點(diǎn)得位置 */ do /* 向后移動(dòng)結(jié)點(diǎn) */ j=i; i=L
57、i、cur; while(i if(i)/* 找到該元素 */ *pre_e=Lj 、data; returnOK; returnERROR; Status NextElem(SLinkList L,intn,ElemTypecur_e,ElemType*next_e) /* 初始條件:在 L 中表頭位序?yàn)?n 得靜態(tài)單鏈表已存在 */ /* 操作結(jié)果:若 cur_e 就是此單鏈表得數(shù)據(jù)元素,且不就是最后一個(gè), */ /* 則用 next_e 返回它得后繼,否則操作失敗, next_e 無定義 */ inti; i=LocateElem(L, n, cur_e);/*在鏈表中查找第一個(gè)值為 c
58、ur_e得元素得位置 */if(i)/* 在靜態(tài)單鏈表中存在元素 cur_e */ i=Li、cur;/* cur_e 得后繼得位置 */ if(i)/* cur_e 有后繼 */ *next_e=Li、 data; returnOK;/* cur_e 元素有后繼 */ returnERROR;/* L不存在cur_e元素,cur_e元素?zé)o后繼*/ StatusListInsert(SLinkList L,intn,inti,ElemTypee) /*在L中表頭位序?yàn)閚得鏈表得第i個(gè)元素之前插入新得數(shù)據(jù)元素e */ intl,j,k=n;/* k 指向表頭 */ if(iListLength(
59、L,n)+1) returnERROR; j二Malloc(L);/* 申請新單元 */ if(j)/* 申請成功*/ Lj、data二e;/*賦值給新單元*/ for(l=1;li;l+)/* 移動(dòng) i-1 個(gè)元素 */ k=Lk、 cur; Lj、 cur=Lk、 cur; Lk、 cur=j; returnOK; returnERROR; StatusListDelete(SLinkList L,intn,inti,ElemType*e) /*刪除在L中表頭位序?yàn)閚得鏈表得第i個(gè)數(shù)據(jù)元素e,并返回其值*/ intj,k=n;/* k 指向表頭 */ if(iListLength(L,n)
60、 returnERROR; for(j=1;jvi;j+)/* 移動(dòng) i-1 個(gè)元素 */ k= Lk、 cur ; j=Lk、cur; Lk、cur=Lj、cur; *e=Lj 、data; Free(L,j); returnOK; StatusListTraverse(SLinkList L,intn,void(*vi)(ElemType) /*依次對L中表頭位序?yàn)閚得鏈表得每個(gè)數(shù)據(jù)元素,調(diào)用函數(shù)vi()。一旦vi() 失敗,則操作失敗 */ inti=Ln、cur;/* 指向第一個(gè)元素 */ while(i)/* 沒到靜態(tài)鏈表尾 */ vi(Li、data);/* 調(diào)用 vi() */
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公廁水電工程施工合同范例
- 公司裝修合同范本首
- 中介填寫合同范本
- 220KV基礎(chǔ)分部工程中間驗(yàn)收報(bào)告
- 語文課件:剖析句子結(jié)構(gòu)與成分
- 《儒家管理智慧》課件
- 張氏智能科技集團(tuán)競爭對手及產(chǎn)品布局分析課件
- 《探討現(xiàn)代新聞傳播的多樣性:課件中的邊緣體裁》
- 病情觀察基礎(chǔ)護(hù)理學(xué)
- 《圣公會(huì)信徒》課件
- 新概念英語青少版入門 A-Unit-1課件(共98張)
- 中國金融書法家協(xié)會(huì)入會(huì)申請表
- 廣西易多收生物科技有限公司河池化工廠綠色節(jié)能生產(chǎn)升級(jí)項(xiàng)目環(huán)境影響報(bào)告書
- 北京市海淀區(qū)九年級(jí)英語第二學(xué)期期末練習(xí)(初三中考二模)試卷講評(píng)-客觀題
- (完整版)園藝產(chǎn)品貯藏與加工
- 中國古典文獻(xiàn)-第七章-文獻(xiàn)目錄
- 學(xué)前教育大專畢業(yè)論文3000字
- 注塑領(lǐng)班簡歷樣板
- 骨骼肌-人體解剖學(xué)-運(yùn)動(dòng)系統(tǒng)
- 兒童財(cái)商養(yǎng)成教育講座PPT
- 大學(xué)學(xué)院學(xué)生獎(jiǎng)助資金及相關(guān)經(jīng)費(fèi)發(fā)放管理暫行辦法
評(píng)論
0/150
提交評(píng)論