清華嚴(yán)蔚敏《大數(shù)據(jù)結(jié)構(gòu)》地全部代碼實(shí)現(xiàn)C語(yǔ)言
《清華嚴(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
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&&j 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&&j 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 領(lǐng)導(dǎo)班子2024年度民主生活會(huì)對(duì)照檢查材料范文(三篇)
- 金融工作主題黨課講稿范文(匯編)
- 鍋爐必備學(xué)習(xí)材料
- 鍋爐設(shè)備的檢修
- 主題黨課講稿:走中國(guó)特色金融發(fā)展之路加快建設(shè)金融強(qiáng)國(guó)(范文)
- 鍋爐基礎(chǔ)知識(shí):?jiǎn)t注意事項(xiàng)技術(shù)問(wèn)答題
- 領(lǐng)導(dǎo)班子2024年度民主生活會(huì)“四個(gè)帶頭”對(duì)照檢查材料范文(三篇)
- 正常運(yùn)行時(shí)影響鍋爐汽溫的因素和調(diào)整方法
- 3.鍋爐檢修模擬考試復(fù)習(xí)題含答案
- 司爐作業(yè)人員模擬考試試卷含答案-2
- 3.鍋爐閥門模擬考試復(fù)習(xí)題含答案
- 某公司鍋爐安全檢查表
- 3.工業(yè)鍋爐司爐模擬考試題庫(kù)試卷含答案
- 4.司爐工考試題含答案解析
- 發(fā)電廠鍋爐的運(yùn)行監(jiān)視和調(diào)整