清華嚴(yán)蔚敏《大數(shù)據(jù)結(jié)構(gòu)》地全部代碼實(shí)現(xiàn)C語(yǔ)言

上傳人:仙*** 文檔編號(hào):89643189 上傳時(shí)間:2022-05-13 格式:DOC 頁(yè)數(shù):65 大?。?11KB
收藏 版權(quán)申訴 舉報(bào) 下載
清華嚴(yán)蔚敏《大數(shù)據(jù)結(jié)構(gòu)》地全部代碼實(shí)現(xiàn)C語(yǔ)言_第1頁(yè)
第1頁(yè) / 共65頁(yè)
清華嚴(yán)蔚敏《大數(shù)據(jù)結(jié)構(gòu)》地全部代碼實(shí)現(xiàn)C語(yǔ)言_第2頁(yè)
第2頁(yè) / 共65頁(yè)
清華嚴(yán)蔚敏《大數(shù)據(jù)結(jié)構(gòu)》地全部代碼實(shí)現(xiàn)C語(yǔ)言_第3頁(yè)
第3頁(yè) / 共65頁(yè)

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《清華嚴(yán)蔚敏《大數(shù)據(jù)結(jié)構(gòu)》地全部代碼實(shí)現(xiàn)C語(yǔ)言》由會(huì)員分享,可在線閱讀,更多相關(guān)《清華嚴(yán)蔚敏《大數(shù)據(jù)結(jié)構(gòu)》地全部代碼實(shí)現(xiàn)C語(yǔ)言(65頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、 /* (程序名) */ #include #include #include /* malloc()等 */ #include /* INT_MAX等 */ #include /* EOF(=^Z或F6),NULL */ #include /* atoi() */ #include /* eof() */ #include /* floor(),ceil(),abs() */ #include /* ex

2、it() */ /* 函數(shù)結(jié)果狀態(tài)代碼 */ #defineTRUE 1 #defineFALSE 0 #defineOK 1 #defineERROR 0 #defineINFEASIBLE -1 /* #define OVERFLOW -2 因?yàn)樵趍ath.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的程

3、序 */ #include"c1.h" typedef intElemType; #include"c2-1.h" /*c2-1.h 線性表的動(dòng)態(tài)分配順序存儲(chǔ)結(jié)構(gòu) */ #defineLIST_INIT_SIZE 10 /* 線性表存儲(chǔ)空間的初始分配量 */ #defineLISTINCREMENT 2/* 線性表存儲(chǔ)空間的分配增量 */ typedefstruct { ElemType*elem; /* 存儲(chǔ)空間基址 */ intlength; /* 當(dāng)前長(zhǎng)度 */ intlistsize; /* 當(dāng)前分配的存儲(chǔ)容量(以sizeof(ElemType)為單位

4、) */ }SqList; #include"bo2-1.c" /* bo2-1.c 順序表示的線性表(存儲(chǔ)結(jié)構(gòu)由c2-1.h定義)的根本操作(12個(gè)) */ StatusInitList(SqList*L) /* 算法2.3 */ { /* 操作結(jié)果:構(gòu)造一個(gè)空的順序線性表 */ (*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!(*L).elem) exit(OVERFLOW); /* 存儲(chǔ)分配失敗 */ (*L).length=0; /* 空表長(zhǎng)度為0 */ (

5、*L).listsize=LIST_INIT_SIZE; /* 初始存儲(chǔ)容量 */ return OK; } StatusDestroyList(SqList*L) { /* 初始條件:順序線性表L已存在。操作結(jié)果:銷毀順序線性表L */ free((*L).elem); (*L).elem=NULL; (*L).length=0; (*L).listsize=0; return OK; } StatusClearList(SqList*L) { /* 初始條件:順序線性表L已存在。操作結(jié)果:將L重置為空表 */ (*L)

6、.length=0; return OK; } StatusListEmpty(SqList L) { /* 初始條件:順序線性表L已存在。操作結(jié)果:假如L為空表,如此返回TRUE,否如此返回FALSE */ if(L.length==0) return TRUE; else return FALSE; } int ListLength(SqList L) { /* 初始條件:順序線性表L已存在。操作結(jié)果:返回L中數(shù)據(jù)元素個(gè)數(shù) */ return L.length; } Status GetElem(SqList L,int i,ElemTyp

7、e *e) { /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */ /* 操作結(jié)果:用e返回L中第i個(gè)數(shù)據(jù)元素的值 */ if(i<1||i>L.length) exit(ERROR); *e=*(L.elem+i-1); return OK; } int LocateElem(SqList L,ElemType e,Status(*pare)(ElemType,ElemType)) { /* 初始條件:順序線性表L已存在,pare()是數(shù)據(jù)元素判定函數(shù)(滿足為1,否如此為0) */ /* 操作結(jié)果:返回L中第1個(gè)與e滿足關(guān)系par

8、e()的數(shù)據(jù)元素的位序。 */ /* 假如這樣的數(shù)據(jù)元素不存在,如此返回值為0。算法2.6 */ ElemType *p; int i=1; /* i的初值為第1個(gè)元素的位序 */ p=L.elem; /* p的初值為第1個(gè)元素的存儲(chǔ)位置 */ while(i<=L.length&&!pare(*p++,e)) ++i; if(i<=L.length) return i; else return 0; } Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e) {

9、/* 初始條件:順序線性表L已存在 */ /* 操作結(jié)果:假如cur_e是L的數(shù)據(jù)元素,且不是第一個(gè),如此用pre_e返回它的前驅(qū), */ /* 否如此操作失敗,pre_e無(wú)定義 */ int i=2; ElemType *p=L.elem+1; while(i<=L.length&&*p!=cur_e) { p++; i++; } if(i>L.length) return INFEASIBLE; else { *pre_e=*--p; return OK; } } Statu

10、s NextElem(SqList L,ElemType cur_e,ElemType *next_e) { /* 初始條件:順序線性表L已存在 */ /* 操作結(jié)果:假如cur_e是L的數(shù)據(jù)元素,且不是最后一個(gè),如此用next_e返回它的后繼, */ /* 否如此操作失敗,next_e無(wú)定義 */ int i=1; ElemType *p=L.elem; while(i

11、se { *next_e=*++p; return OK; } } Status ListInsert(SqList*L,int i,ElemType e) /* 算法2.4 */ { /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L)+1 */ /* 操作結(jié)果:在L中第i個(gè)位置之前插入新的數(shù)據(jù)元素e,L的長(zhǎng)度加1 */ ElemType *newbase,*q,*p; if(i<1||i>(*L).length+1) /* i值不合法 */ return ERROR; if((*L).length>=(*L).list

12、size) /* 當(dāng)前存儲(chǔ)空間已滿,增加分配 */ { newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase) exit(OVERFLOW); /* 存儲(chǔ)分配失敗 */ (*L).elem=newbase; /* 新基址 */ (*L).listsize+=LISTINCREMENT; /* 增加存儲(chǔ)容量 */ } q=(*L).elem+i-1; /* q為插入位置 */ for(p=

13、(*L).elem+(*L).length-1;p>=q;--p) /* 插入位置與之后的元素右移 */ *(p+1)=*p; *q=e; /* 插入e */ ++(*L).length; /* 表長(zhǎng)增1 */ return OK; } Status ListDelete(SqList*L,int i,ElemType *e) /* 算法2.5 */ { /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */ /* 操作結(jié)果:刪除L的第i個(gè)數(shù)據(jù)元素,并用e返回其值,L的長(zhǎng)度減1 */ ElemType *p,*q; if(

14、i<1||i>(*L).length) /* i值不合法 */ return ERROR; p=(*L).elem+i-1; /* p為被刪除元素的位置 */ *e=*p; /* 被刪除元素的值賦給e */ q=(*L).elem+(*L).length-1; /* 表尾元素的位置 */ for(++p;p<=q;++p) /* 被刪除元素之后的元素左移 */ *(p-1)=*p; (*L).length--; /* 表長(zhǎng)減1 */ return OK; } Status ListTraverse(SqList L,void(*vi)

15、(ElemType*)) { /* 初始條件:順序線性表L已存在 */ /* 操作結(jié)果:依次對(duì)L的每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)vi()。一旦vi()失敗,如此操作失敗 */ /* vi()的形參加'&',明確可通過(guò)調(diào)用vi()改變?cè)氐闹?*/ ElemType *p; int i; p=L.elem; for(i=1;i<=L.length;i++) vi(p++); printf("\n"); return OK; } Status equal(ElemType c1,ElemType c2) { /* 判斷是否相等的函

16、數(shù),Union()用到 */ if(c1==c2) return TRUE; else return FALSE; } void Union(SqList*La,SqList Lb) /* 算法2.1 */ { /* 將所有在線性表Lb中但不在La中的數(shù)據(jù)元素插入到La中 */ ElemType e; int La_len,Lb_len; int i; La_len=ListLength(*La); /* 求線性表的長(zhǎng)度 */ Lb_len=ListLength(Lb); for(i=1;i<=Lb_len;i++) { Get

17、Elem(Lb,i,&e); /* 取Lb中第i個(gè)數(shù)據(jù)元素賦給e */ if(!LocateElem(*La,e,equal)) /* La中不存在和e一樣的元素,如此插入之 */ ListInsert(La,++La_len,e); } } void print(ElemType *c) { printf("%d ",*c); } void main() { SqList La,Lb; Status i; int j; i=InitList(&La); if(i==1) /* 創(chuàng)建空表La成功 */ for(j=

18、1;j<=5;j++) /* 在表La中插入5個(gè)元素 */ i=ListInsert(&La,j,j); printf("La= "); /* 輸出表La的容 */ ListTraverse(La,print); InitList(&Lb); /* 也可不判斷是否創(chuàng)建成功 */ for(j=1;j<=5;j++) /* 在表Lb中插入5個(gè)元素 */ i=ListInsert(&Lb,j,2*j); printf("Lb= "); /* 輸出表Lb的容 */ ListTraverse(Lb,print); Union(&La

19、,Lb); printf("new La= "); /* 輸出新表La的容 */ ListTraverse(La,print);} /* algo2-2.c 實(shí)現(xiàn)算法2.2的程序 */ #include"c1.h" typedef intElemType; #include"c2-1.h" #include"bo2-1.c" void MergeList(SqList La,SqList Lb,SqList*Lc) /* 算法2.2 */ { /* 線性表La和Lb中的數(shù)據(jù)元素按值非遞減排列。 */ /* 歸并La和Lb得到新的線性表Lc,Lc的數(shù)據(jù)元素

20、也按值非遞減排列 */ int i=1,j=1,k=0; int La_len,Lb_len; ElemType ai,bj; InitList(Lc); /* 創(chuàng)建空表Lc */ La_len=ListLength(La); Lb_len=ListLength(Lb); while(i<=La_len&&j<=Lb_len) /* 表La和表Lb均非空 */ { GetElem(La,i,&ai); GetElem(Lb,j,&bj); if(ai<=bj) { ListInsert(Lc,++k,ai)

21、; ++i; } else { ListInsert(Lc,++k,bj); ++j; } } while(i<=La_len) /* 表La非空且表Lb空 */ { GetElem(La,i++,&ai); ListInsert(Lc,++k,ai); } while(j<=Lb_len) /* 表Lb非空且表La空 */ { GetElem(Lb,j++,&bj); ListInsert(Lc,++k,bj); }

22、 } void print(ElemType *c) { printf("%d ",*c); } void main() { SqList La,Lb,Lc; int j,a[4]={3,5,8,11},b[7]={2,6,8,9,11,15,20}; InitList(&La); /* 創(chuàng)建空表La */ for(j=1;j<=4;j++) /* 在表La中插入4個(gè)元素 */ ListInsert(&La,j,a[j-1]); printf("La= "); /* 輸出表La的容 */ ListTraverse(La,p

23、rint); InitList(&Lb); /* 創(chuàng)建空表Lb */ for(j=1;j<=7;j++) /* 在表Lb中插入7個(gè)元素 */ ListInsert(&Lb,j,b[j-1]); printf("Lb= "); /* 輸出表Lb的容 */ ListTraverse(Lb,print); MergeList(La,Lb,&Lc); printf("Lc= "); /* 輸出表Lc的容 */ ListTraverse(Lc,print); } /* algo2-3.c 實(shí)現(xiàn)算法2.7的程序 */ #include

24、"c1.h" typedef intElemType; #include"c2-1.h" #include"bo2-1.c" void MergeList(SqList La,SqList Lb,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).le

25、ngth=La.length+Lb.length;/*不用InitList()創(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&&pb<=pb_last) /* 表La和表Lb均非空 */ { /* 歸并 */ i

26、f(*pa<=*pb) *pc++=*pa++; else *pc++=*pb++; } while(pa<=pa_last) /* 表La非空且表Lb空 */ *pc++=*pa++; /* 插入La的剩余元素 */ while(pb<=pb_last) /* 表Lb非空且表La空 */ *pc++=*pb++; /* 插入Lb的剩余元素 */ } void print(ElemType *c) { printf("%d ",*c); } void main() { SqList La

27、,Lb,Lc; int j; InitList(&La); /* 創(chuàng)建空表La */ for(j=1;j<=5;j++) /* 在表La中插入5個(gè)元素 */ ListInsert(&La,j,j); printf("La= "); /* 輸出表La的容 */ ListTraverse(La,print); InitList(&Lb); /* 創(chuàng)建空表Lb */ for(j=1;j<=5;j++) /* 在表Lb中插入5個(gè)元素 */ ListInsert(&Lb,j,2*j); printf("Lb= "); /* 輸出表Lb的容 */

28、 ListTraverse(Lb,print); MergeList(La,Lb,&Lc); printf("Lc= "); /* 輸出表Lc的容 */ ListTraverse(Lc,print); } /* algo2-4.c 修改算法2.7的第一個(gè)循環(huán)語(yǔ)句中的條件語(yǔ)句為開關(guān)語(yǔ)句,且當(dāng) */ /* *pa=*pb時(shí),只將兩者中之一插入Lc。此操作的結(jié)果和算法2.1一樣 */ #include"c1.h" typedef intElemType; #include"c2-1.h" #include"bo2-1.c" int p(E

29、lemType c1,ElemType c2) { int i; if(c1

30、e=La.length+Lb.length; /* 此句與算法2.7不同 */ pc=(*Lc).elem=(ElemType *)malloc((*Lc).listsize*sizeof(ElemType)); if(!(*Lc).elem) exit(OVERFLOW); pa_last=La.elem+La.length-1; pb_last=Lb.elem+Lb.length-1; while(pa<=pa_last&&pb<=pb_last) /* 表La和表Lb均非空 */ switch(p(*pa,*pb)) /* 此句與算法2.7不同

31、*/ { case 0: pb++; case 1: *pc++=*pa++; break; case -1: *pc++=*pb++; } while(pa<=pa_last) /* 表La非空且表Lb空 */ *pc++=*pa++; while(pb<=pb_last) /* 表Lb非空且表La空 */ *pc++=*pb++; (*Lc).length=pc-(*Lc).elem; /* 加此句 */ } void print(El

32、emType *c) { printf("%d ",*c); } void main() { SqList La,Lb,Lc; int j; InitList(&La); /* 創(chuàng)建空表La */ for(j=1;j<=5;j++) /* 在表La中插入5個(gè)元素 */ ListInsert(&La,j,j); printf("La= "); /* 輸出表La的容 */ ListTraverse(La,print); InitList(&Lb); /* 創(chuàng)建空表Lb */ for(j=1;j<=5;j++) /* 在表Lb中插入5

33、個(gè)元素 */ ListInsert(&Lb,j,2*j); printf("Lb= "); /* 輸出表Lb的容 */ ListTraverse(Lb,print); MergeList(La,Lb,&Lc); printf("Lc= "); /* 輸出表Lc的容 */ ListTraverse(Lc,print); } /* algo2-5.c 實(shí)現(xiàn)算法2.11、2.12的程序 */ #include"c1.h" typedef intElemType; #include"c2-2.h" /* c2-2.h 線性

34、表的單鏈表存儲(chǔ)結(jié)構(gòu) */ struct LNode { ElemType data; struct LNode *next; }; typedefstruct LNode *LinkList; /* 另一種定義LinkList的方法 */ #include"bo2-2.c" /* bo2-2.c 單鏈表線性表(存儲(chǔ)結(jié)構(gòu)由c2-2.h定義)的根本操作(12個(gè)) */ StatusInitList(LinkList *L) { /* 操作結(jié)果:構(gòu)造一個(gè)空的線性表L */ *L=(LinkList)malloc(sizeof(struct LNode)); /* 產(chǎn)生

35、頭結(jié)點(diǎn),并使L指向此頭結(jié)點(diǎn) */ if(!*L) /* 存儲(chǔ)分配失敗 */ exit(OVERFLOW); (*L)->next=NULL; /* 指針域?yàn)榭?*/ return OK; } StatusDestroyList(LinkList *L) { /* 初始條件:線性表L已存在。操作結(jié)果:銷毀線性表L */ LinkList q; while(*L) { q=(*L)->next; free(*L); *L=q; } return OK; } StatusClearList(LinkList

36、L) /* 不改變L */ { /* 初始條件:線性表L已存在。操作結(jié)果:將L重置為空表 */ LinkList p,q; p=L->next; /* p指向第一個(gè)結(jié)點(diǎn) */ while(p) /* 沒(méi)到表尾 */ { q=p->next; free(p); p=q; } L->next=NULL; /* 頭結(jié)點(diǎn)指針域?yàn)榭?*/ return OK; } StatusListEmpty(LinkList L) { /* 初始條件:線性表L已存在。操作結(jié)果:假如L為空表,如此返回TRUE,否如此返回

37、FALSE */ if(L->next) /* 非空 */ return FALSE; else return TRUE; } int ListLength(LinkList L) { /* 初始條件:線性表L已存在。操作結(jié)果:返回L中數(shù)據(jù)元素個(gè)數(shù) */ int i=0; LinkList p=L->next; /* p指向第一個(gè)結(jié)點(diǎn) */ while(p) /* 沒(méi)到表尾 */ { i++; p=p->next; } return i; } Status GetElem(LinkList L,int i,E

38、lemType *e) /* 算法2.8 */ { /* L為帶頭結(jié)點(diǎn)的單鏈表的頭指針。當(dāng)?shù)趇個(gè)元素存在時(shí),其值賦給e并返回OK,否如此返回ERROR */ int j=1; /* j為計(jì)數(shù)器 */ LinkList p=L->next; /* p指向第一個(gè)結(jié)點(diǎn) */ while(p&&jnext; j++; } if(!p||j>i) /* 第i個(gè)元素不存在 */ return ERROR; *e=p->data; /* 取第i個(gè)元素 */ r

39、eturn OK; } int LocateElem(LinkList L,ElemType e,Status(*pare)(ElemType,ElemType)) { /* 初始條件: 線性表L已存在,pare()是數(shù)據(jù)元素判定函數(shù)(滿足為1,否如此為0) */ /* 操作結(jié)果: 返回L中第1個(gè)與e滿足關(guān)系pare()的數(shù)據(jù)元素的位序。 */ /* 假如這樣的數(shù)據(jù)元素不存在,如此返回值為0 */ int i=0; LinkList p=L->next; while(p) { i++; if(pare(p->data,e)

40、) /* 找到這樣的數(shù)據(jù)元素 */ return i; p=p->next; } return 0; } Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e) { /* 初始條件: 線性表L已存在 */ /* 操作結(jié)果: 假如cur_e是L的數(shù)據(jù)元素,且不是第一個(gè),如此用pre_e返回它的前驅(qū), */ /* 返回OK;否如此操作失敗,pre_e無(wú)定義,返回INFEASIBLE */ LinkList q,p=L->next; /* p指向第一個(gè)結(jié)點(diǎn) */ w

41、hile(p->next) /* p所指結(jié)點(diǎn)有后繼 */ { q=p->next; /* q為p的后繼 */ if(q->data==cur_e) { *pre_e=p->data; return OK; } p=q; /* p向后移 */ } return INFEASIBLE; } Status NextElem(LinkList L,ElemType cur_e,ElemType *next_e) { /* 初始條件:線性表L已存在 */ /* 操作結(jié)果:假如cur_e是L的數(shù)據(jù)元素,且

42、不是最后一個(gè),如此用next_e返回它的后繼, */ /* 返回OK;否如此操作失敗,next_e無(wú)定義,返回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; return OK; } p=p->next; } return INFEASIBLE; } Status ListInse

43、rt(LinkList L,int i,ElemType e) /* 算法2.9。不改變L */ { /* 在帶頭結(jié)點(diǎn)的單鏈線性表L中第i個(gè)位置之前插入元素e */ int j=0; LinkList p=L,s; while(p&&jnext; j++; } if(!p||j>i-1) /* i小于1或者大于表長(zhǎng) */ return ERROR; s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新結(jié)點(diǎn) */ s->

44、data=e; /* 插入L中 */ s->next=p->next; p->next=s; return OK; } Status ListDelete(LinkList L,int i,ElemType *e) /* 算法2.10。不改變L */ { /* 在帶頭結(jié)點(diǎn)的單鏈線性表L中,刪除第i個(gè)元素,并由e返回其值 */ int j=0; LinkList p=L,q; while(p->next&&jnext; j++; } if(

45、!p->next||j>i-1) /* 刪除位置不合理 */ return ERROR; q=p->next; /* 刪除并釋放結(jié)點(diǎn) */ p->next=q->next; *e=q->data; free(q); return OK; } Status ListTraverse(LinkList L,void(*vi)(ElemType)) /* vi的形參類型為ElemTypeElemType&不同 */ { /* 初始條件:線性表L已存在 */ /* 操作結(jié)果:依次對(duì)L的每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)vi()。一旦vi()失敗,如此操作失敗 *

46、/ LinkList p=L->next; while(p) { vi(p->data); p=p->next; } printf("\n"); return OK; } void CreateList(LinkList *L,int n) /* 算法2.11 */ { /* 逆位序(插在表頭)輸入n個(gè)元素的值,建立帶表頭結(jié)構(gòu)的單鏈線性表L */ int i; LinkList p; *L=(LinkList)malloc(sizeof(struct LNode)); (*L)->next=NULL;

47、 /* 先建立一個(gè)帶頭結(jié)點(diǎn)的單鏈表 */ printf("請(qǐng)輸入%d個(gè)數(shù)據(jù)\n",n); for(i=n;i>0;--i) { p=(LinkList)malloc(sizeof(struct LNode)); /* 生成新結(jié)點(diǎn) */ scanf("%d",&p->data); /* 輸入元素值 */ p->next=(*L)->next; /* 插入到表頭 */ (*L)->next=p; } } void CreateList2(LinkList *L,int n) { /* 正位序(插在表尾)輸入n個(gè)

48、元素的值,建立帶表頭結(jié)構(gòu)的單鏈線性表 */ int i; LinkList p,q; *L=(LinkList)malloc(sizeof(struct LNode)); /* 生成頭結(jié)點(diǎn) */ (*L)->next=NULL; q=*L; printf("請(qǐng)輸入%d個(gè)數(shù)據(jù)\n",n); for(i=1;i<=n;i++) { p=(LinkList)malloc(sizeof(struct LNode)); scanf("%d",&p->data); q->next=p; q=q->next;

49、 } p->next=NULL; } void MergeList(LinkList La,LinkList *Lb,LinkList *Lc)/* 算法2.12 */ { /* 單鏈線性表La和Lb的元素按值非遞減排列。 */ /* 歸并La和Lb得到新的單鏈線性表Lc,Lc的元素也按值非遞減排列 */ LinkList pa=La->next,pb=(*Lb)->next,pc; *Lc=pc=La; /* 用La的頭結(jié)點(diǎn)作為L(zhǎng)c的頭結(jié)點(diǎn) */ while(pa&&pb) if(pa->data<=pb->data) {

50、pc->next=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(ElemType c) /* ListTraverse()調(diào)用的函數(shù)(類型要一致) */ { printf("%d ",c)

51、; } void main() { int n=5; LinkList La,Lb,Lc; printf("按非遞減順序, "); CreateList2(&La,n); /* 正位序輸入n個(gè)元素的值 */ printf("La="); /* 輸出鏈表La的容 */ ListTraverse(La,visit); printf("按非遞增順序, "); CreateList(&Lb,n); /* 逆位序輸入n個(gè)元素的值 */ printf("Lb="); /* 輸出鏈表Lb的容 */ ListTravers

52、e(Lb,visit); MergeList(La,&Lb,&Lc); /* 按非遞減順序歸并La和Lb,得到新表Lc */ printf("Lc="); /* 輸出鏈表Lc的容 */ ListTraverse(Lc,visit); } /* algo2-6.c 利用單鏈表結(jié)構(gòu)處理教科書圖2.1(學(xué)生健康登記表) */ #include"c1.h" #define NAMELEN 8 /* 最大長(zhǎng)度 */ #define CLASSLEN 4 /* 班級(jí)名最大長(zhǎng)度 */ struct stud /* 記錄的結(jié)構(gòu) */ { char na

53、me[NAMELEN+1]; long num; char sex; int age; char Class[CLASSLEN+1]; int health; }; typedefstruct stud ElemType; /* 鏈表結(jié)點(diǎn)元素類型為結(jié)構(gòu)體 */ #include"c2-2.h" char sta[3][9]={"健康 ","一般 ","神經(jīng)衰弱"}; /* 健康狀況(3類) */ FILE *fp; StatusInitList(LinkList *L) /* 拷自bo2-2.c */ { /* 操作結(jié)果:構(gòu)造一個(gè)空的線

54、性表L */ *L=(LinkList)malloc(sizeof(struct LNode)); /* 產(chǎn)生頭結(jié)點(diǎn),并使L指向此頭結(jié)點(diǎn) */ if(!*L) /* 存儲(chǔ)分配失敗 */ exit(OVERFLOW); (*L)->next=NULL; /* 指針域?yàn)榭?*/ return OK; } Status ListTraverse(LinkList L,void(*vi)(ElemType)) /* 拷自bo2-2.c */ { /* 初始條件:線性表L已存在 */ /* 操作結(jié)果:依次對(duì)L的每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)vi()。一旦vi()失敗,如此操作失敗

55、*/ LinkList p=L->next; while(p) { vi(p->data); p=p->next; } printf("\n"); return OK; } void InsertAscend(LinkList L,ElemType e) /* 此函數(shù)是由bo2-9.c中的同名函數(shù)改寫 */ { /* 按學(xué)號(hào)非降序插入 */ LinkList q=L,p=L->next; while(p&&e.num>p->data.num) { q=p; p=p->next;

56、 } q->next=(LinkList)malloc(sizeof(struct LNode)); /* 插在q后 */ q->next->data=e; q->next->next=p; } void Print(struct stud e) { /* 顯示記錄e的容 */ printf("%-8s %6ld",e.name,e.num); if(e.sex=='m') printf(" 男"); else printf(" 女"); printf("%5d %-4s",e.age,e.Class);

57、 printf("%9s\n",sta[e.health]); } void ReadIn(struct stud *e) { /* 由鍵盤輸入結(jié)點(diǎn)信息 */ printf("請(qǐng)輸入(<=%d個(gè)字符): ",NAMELEN); scanf("%s",e->name); printf("請(qǐng)輸入學(xué)號(hào): "); scanf("%ld",&e->num); printf("請(qǐng)輸入性別(m:男 f:女): "); scanf("%*c%c",&e->sex); printf("請(qǐng)輸入年齡: "); scanf("%d"

58、,&e->age); printf("請(qǐng)輸入班級(jí)(<=%d個(gè)字符): ",CLASSLEN); scanf("%s",e->Class); printf("請(qǐng)輸入健康狀況(0:%s 1:%s 2:%s):",sta[0],sta[1],sta[2]); scanf("%d",&e->health); } void WriteToFile(struct stud e) { /* 將結(jié)點(diǎn)信息寫入fp指定的文件 */ fwrite(&e,sizeof(struct stud),1,fp); } Status ReadFromFile(s

59、truct stud *e) { /* 由fp指定的文件讀取結(jié)點(diǎn)信息到e */ int i; i=fread(e,sizeof(struct stud),1,fp); if(i==1) /* 讀取文件成功 */ return OK; else return ERROR; } Status FindFromNum(LinkList L,long num,LinkList *p,LinkList *q) { /* 查找表中學(xué)號(hào)為num的結(jié)點(diǎn),如找到,q指向此結(jié)點(diǎn),p指向q的前驅(qū), */ /* 并返回TRUE;如無(wú)此元素,如此返回FALSE */ *p=

60、L; while(*p) { *q=(*p)->next; if(*q&&(*q)->data.num>num) /* 因?yàn)槭前磳W(xué)號(hào)非降序排列 */ break; if(*q&&(*q)->data.num==num) /* 找到該學(xué)號(hào) */ return TRUE; *p=*q; } return FALSE; } Status FindFromName(LinkList L,char name[],LinkList *p,LinkList *q) { /* 查找表中為name的結(jié)點(diǎn),如找到,q指向此結(jié)點(diǎn),p指向

61、q的前驅(qū), */ /* 并返回TRUE;如無(wú)此元素,如此返回FALSE */ *p=L; while(*p) { *q=(*p)->next; if(*q&&!strcmp((*q)->data.name,name)) /* 找到該 */ return TRUE; *p=*q; } return FALSE; } Status DeleteElemNum(LinkList L,long num) { /* 刪除表中學(xué)號(hào)為num的元素,并返回TRUE;如無(wú)此元素,如此返回FALSE */ LinkList p,q;

62、 if(FindFromNum(L,num,&p,&q)) /* 找到此結(jié)點(diǎn),且q指向其,p指向其前驅(qū) */ { p->next=q->next; free(q); return TRUE; } return FALSE; } Status DeleteElemName(LinkList L,char name[]) { /* 刪除表中為name的元素,并返回TRUE;如無(wú)此元素,如此返回FALSE */ LinkList p,q; if(FindFromName(L,name,&p,&q)) /* 找到此結(jié)點(diǎn),且q指向其,p

63、指向其前驅(qū) */ { p->next=q->next; free(q); return TRUE; } return FALSE; } void Modify(ElemType *e) { /* 修改結(jié)點(diǎn)容 */ char s[80]; Print(*e); /* 顯示原容 */ printf("請(qǐng)輸入待修改項(xiàng)的容,不修改的項(xiàng)按回車鍵保持原值:\n"); printf("請(qǐng)輸入(<=%d個(gè)字符): ",NAMELEN); gets(s); if(strlen(s)) strcpy(e

64、->name,s); printf("請(qǐng)輸入學(xué)號(hào): "); gets(s); if(strlen(s)) e->num=atol(s); printf("請(qǐng)輸入性別(m:男 f:女): "); gets(s); if(strlen(s)) e->sex=s[0]; printf("請(qǐng)輸入年齡: "); gets(s); if(strlen(s)) e->age=atoi(s); printf("請(qǐng)輸入班級(jí)(<=%d個(gè)字符): ",CLASSLEN); gets(s); if(strlen

65、(s)) strcpy(e->Class,s); printf("請(qǐng)輸入健康狀況(0:%s 1:%s 2:%s):",sta[0],sta[1],sta[2]); gets(s); if(strlen(s)) e->health=atoi(s); /* 修改完畢 */ } #define N 4 /* student記錄的個(gè)數(shù) */ void main() { struct stud student[N]={{"王小林",790631,'m',18,"計(jì)91",0}, {"紅",

66、790632,'f',20,"計(jì)91",1}, {"建平",790633,'m',21,"計(jì)91",0}, {"立立",790634,'m',17,"計(jì)91",2}}; /* 表的初始記錄 */ int i,j,flag=1; long num; char filename[13],name[NAMELEN+1]; ElemType e; LinkList T,p,q; InitList(&T); /* 初始化鏈表 */ while(flag) { printf("1:將結(jié)構(gòu)體數(shù)組student中的記錄按學(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è)有給定的

展開閱讀全文
溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!