清华严蔚敏《数据结构》的全部代码.docx
- 文档编号:29233998
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:105
- 大小:41.70KB
清华严蔚敏《数据结构》的全部代码.docx
《清华严蔚敏《数据结构》的全部代码.docx》由会员分享,可在线阅读,更多相关《清华严蔚敏《数据结构》的全部代码.docx(105页珍藏版)》请在冰豆网上搜索。
清华严蔚敏《数据结构》的全部代码
/*c1、h
(程序名)*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*函数结果状态代码*/
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
/*#defineOVERFLOW-2因为在math、h中已定义OVERFLOW得值为3,故去掉此行*/typedefintStatus;/*Status就是函数得类型,其值就是函数结果状态代码,如OK等*/typedefintBoolean;/*Boolean就是布尔类型,其值就是TRUE或FALSE*/
/*algo2-1、c实现算法2、1得程序*/
#include"c1、h"
typedefintElemType;
#include"c2-1、h"
/*c2-1、h线性表得动态分配顺序存储结构*/
#defineLIST_INIT_SIZE10/*线性表存储空间得初始分配量*/
#defineLISTINCREMENT2/*线性表存储空间得分配增量*/
typedefstruct
{
ElemType*elem;/*存储空间基址*/
intlength;/*当前xx*/
intlistsize;/*当前分配得存储容量(以sizeof(ElemType)为单位)*/
}SqList;
#include"bo2-1、c"
/*bo2-1、c顺序表示得线性表(存储结构由c2-1、h定义)得基本操作(12个)*/
StatusInitList(SqList*L)/*算法2、3*/
{/*操作结果:
构造一个空得顺序线性表*/
(*L)、elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
(*L)、elem)
exit(OVERFLOW);/*存储分配失败*/
(*L)、length=0;/*空表长度为0*/
(*L)、listsize=LIST_INIT_SIZE;/*初始存储容量*/
returnOK;
}
StatusDestroyList(SqList*L)
{/*初始条件:
顺序线性表L已存在。
操作结果:
销毁顺序线性表L*/
free((*L)、elem);
(*L)、elem=NULL;
(*L)、length=0;
(*L)、listsize=0;
returnOK;
}
StatusClearList(SqList*L)
{/*初始条件:
顺序线性表L已存在。
操作结果:
将L重置为空表*/
(*L)、length=0;
returnOK;
}
StatusListEmpty(SqListL)
{/*初始条件:
顺序线性表L已存在。
操作结果:
若L为空表,则返回TRUE,否则返回FALSE*/
if(L、length==0)
returnTRUE;
else
returnFALSE;
}
intListLength(SqListL)
{/*初始条件:
顺序线性表L已存在。
操作结果:
返回L中数据元素个数*/
returnL、length;
}
StatusGetElem(SqListL,inti,ElemType*e)
{/*初始条件:
顺序线性表L已存在,1≤i≤ListLength(L)*/
/*操作结果:
用e返回L中第i个数据元素得值*/
if(i<1||i>L、length)
exit(ERROR);
*e=*(L、elem+i-1);
returnOK;
}
intLocateElem(SqListL,ElemTypee,Status(*compare)(ElemType,ElemType))
{/*初始条件:
顺序线性表L已存在,compare()就是数据元素判定函数(满足为1,否则为0)*/
/*操作结果:
返回L中第1个与e满足关系compare()得数据元素得位序。
*//*若这样得数据元素不存在,则返回值为0。
算法2、6*/
ElemType*p;
inti=1;/*i得初值为第1个元素得位序*/
p=L、elem;/*p得初值为第1个元素得存储位置*/
while(i<=L、length&&!
compare(*p++,e))
++i;
if(i<=L、length)
returni;
else
return0;
}
StatusPriorElem(SqListL,ElemTypecur_e,ElemType*pre_e)
{/*初始条件:
顺序线性表L已存在*/
/*操作结果:
若cur_e就是L得数据元素,且不就是第一个,则用pre_e返回它得前驱,*/
/*否则操作失败,pre_e无定义*/
inti=2;
ElemType*p=L、elem+1;
while(i<=L、length&&*p!
=cur_e)
{
p++;
i++;
}
if(i>L、length)
returnINFEASIBLE;
else
{
*pre_e=*--p;
returnOK;
}
}
StatusNextElem(SqListL,ElemTypecur_e,ElemType*next_e)
{/*初始条件:
顺序线性表L已存在*/
/*操作结果:
若cur_e就是L得数据元素,且不就是最后一个,则用next_e返回它得后继,*/
/*否则操作失败,next_e无定义*/
inti=1;
ElemType*p=L、elem;
while(i =cur_e) { i++; p++; } if(i==L、length) returnINFEASIBLE; else { *next_e=*++p; returnOK; } } StatusListInsert(SqList*L,inti,ElemTypee)/*算法2、4*/ {/*初始条件: 顺序线性表L已存在,1≤i≤ListLength(L)+1*/ /*操作结果: 在L中第i个位置之前插入新得数据元素e,L得长度加1*/ ElemType*newbase,*q,*p; if(i<1||i>(*L)、length+1)/*i值不合法*/ returnERROR; if((*L)、length>=(*L)、listsize)/*当前存储空间已满,增加分配*/ { newbase=(ElemType*)realloc((*L)、elem,((*L) listsize+LISTINCREMENT)*sizeof(ElemType)); if(! newbase) exit(OVERFLOW);/*存储分配失败*/ (*L)、elem=newbase;/*新基址*/ (*L)、listsize+=LISTINCREMENT;/*增加存储容量*/ } q=(*L)、elem+i-1;/*q为插入位置*/ for(p=(*L)、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)*/ /*操作结果: 删除L得第i个数据元素,并用e返回其值,L得长度减1*/ ElemType*p,*q; if(i<1||i>(*L)、length)/*i值不合法*/ returnERROR; 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--;/*表长减1*/ returnOK; } StatusListTraverse(SqListL,void(*vi)(ElemType*)) {/*初始条件: 顺序线性表L已存在*/ /*操作结果: 依次对L得每个数据元素调用函数vi()。 一旦vi()失败,则操作失败*//*vi()得形参加'&',表明可通过调用vi()改变元素得值*/ ElemType*p; inti; p=L、elem; for(i=1;i<=L、length;i++) vi(p++); printf("\n"); returnOK; } Statusequal(ElemTypec1,ElemTypec2) {/*判断就是否相等得函数,Union()用到*/ if(c1==c2) returnTRUE; else returnFALSE; } voidUnion(SqList*La,SqListLb)/*算法2、1*/ {/*将所有在线性表Lb中但不在La中得数据元素插入到La中*/ ElemTypee; intLa_len,Lb_len; inti; La_len=ListLength(*La);/*求线性表得长度*/ Lb_len=ListLength(Lb); for(i=1;i<=Lb_len;i++) { GetElem(Lb,i,&e);/*取Lb中第i个数据元素赋给e*/ if(! LocateElem(*La,e,equal))/*La中不存在与e相同得元素,则插入之*/ ListInsert(La,++La_len,e); } } voidprint(ElemType*c) { printf("%d",*c); } voidmain() { SqListLa,Lb; Statusi; intj; i=InitList(&La); if(i==1)/*创建空表La成功*/ for(j=1;j<=5;j++)/*在表La中插入5个元素*/ i=ListInsert(&La,j,j); printf("La=");/*输出表La得内容*/ ListTraverse(La,print); InitList(&Lb);/*也可不判断就是否创建成功*/ for(j=1;j<=5;j++)/*在表Lb中插入5个元素*/ i=ListInsert(&Lb,j,2*j); printf("Lb=");/*输出表Lb得内容*/ ListTraverse(Lb,print); Union(&La,Lb); printf("newLa=");/*输出新表La得内容*/ ListTraverse(La,print);} /*algo2-2、c实现算法2、2得程序*/ #include"c1、h" typedefintElemType; #include"c2-1、h" #include"bo2-1、c" voidMergeList(SqListLa,SqListLb,SqList*Lc)/*算法2、2*/ {/*已知线性表La与Lb中得数据元素按值非递减排列。 */ /*归并La与Lb得到新得线性表Lc,Lc得数据元素也按值非递减排列*/ inti=1,j=1,k=0; intLa_len,Lb_len; ElemTypeai,bj; InitList(Lc);/*创建空表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); ++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); } } voidprint(ElemType*c) { printf("%d",*c); } voidmain() { SqListLa,Lb,Lc; intj,a[4]={3,5,8,11},b[7]={2,6,8,9,11,15,20}; InitList(&La);/*创建空表La*/ for(j=1;j<=4;j++)/*在表La中插入4个元素*/ ListInsert(&La,j,a[j-1]); printf("La=");/*输出表La得内容*/ ListTraverse(La,print); InitList(&Lb);/*创建空表Lb*/ for(j=1;j<=7;j++)/*在表Lb中插入7个元素*/ 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实现算法2、7得程序*/ #include"c1、h" typedefintElemType; #include"c2-1、h" #include"bo2-1、c" voidMergeList(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;/*不用InitList()创建空表Lc*/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均非空*/ {/*归并*/ if(*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得剩余元素*/ } voidprint(ElemType*c) { printf("%d",*c); } voidmain() { SqListLa,Lb,Lc; intj; InitList(&La);/*创建空表La*/ for(j=1;j<=5;j++)/*在表La中插入5个元素*/ ListInsert(&La,j,j); printf("La=");/*输出表La得内容*/ ListTraverse(La,print); InitList(&Lb);/*创建空表Lb*/ for(j=1;j<=5;j++)/*在表Lb中插入5个元素*/ ListInsert(&Lb,j,2*j); printf("Lb=");/*输出表Lb得内容*/ ListTraverse(Lb,print); MergeList(La,Lb,&Lc); printf("Lc=");/*输出表Lc得内容*/ ListTraverse(Lc,print); } /*algo2-4、c修改算法2、7得第一个循环语句中得条件语句为开关语句,且当*//**pa=*pb时,只将两者中之一插入Lc。 此操作得结果与算法2、1相同*/ #include"c1、h" typedefintElemType; #include"c2-1、h" #include"bo2-1、c" intcomp(ElemTypec1,ElemTypec2) { inti; if(c1 i=1; elseif(c1==c2) i=0; else i=-1; returni; } voidMergeList(SqListLa,SqListLb,SqList*Lc) {/*另一种合并线性表得方法(根据算法2、7下得要求修改算法2、7)*/ ElemType*pa,*pa_last,*pb,*pb_last,*pc; pa=La、elem; pb=Lb、elem; (*Lc)、listsize=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(comp(*pa,*pb))/*此句与算法2、7不同*/ { case0: pb++; case1: *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;/*加此句*/ } voidprint(ElemType*c) { printf("%d",*c); } voidmain() { SqListLa,Lb,Lc; intj; InitList(&La);/*创建空表La*/ for(j=1;j<=5;j++)/*在表La中插入5个元素*/ ListInsert(&La,j,j); printf("La=");/*输出表La得内容*/ ListTraverse(La,print); InitList(&Lb);/*创建空表Lb*/ for(j=1;j<=5;j++)/*在表Lb中插入5个元素*/ ListInsert(&Lb,j,2*j); printf("Lb=");/*输出表Lb得内容*/ ListTraverse(Lb,print); MergeList(La,Lb,&Lc); printf("Lc=");/*输出表Lc得内容*/ ListTraverse(Lc,print); } /*algo2-5、c实现算法2、11、2、12得程序*/ #include"c1、h" typedefintElemType; #include"c2-2、h" /*c2-2、h线性表得单链表存储结构*/ structLNode { ElemTypedata; structLNode*next; }; typedefstructLNode*LinkList;/*另一种定义LinkList得方法*/ #include"bo2-2、c" /*bo2-2、c单链表线性表(存储结构由c2-2、h定义)得基本操作(12个)*/ StatusInitList(LinkList*L) {/*操作结果: 构造一个空得线性表L*/ *L=(LinkList)malloc(sizeof(structLNode));/*产生头结点,并使L指向此头结点*/if(! *L)/*存储分配失败*/ exit(OVERFLOW); (*L)->next=NULL;/*指针域为空*/ returnOK; } StatusDestroyList(LinkList*L) {/*初始条件: 线性表L已存在。 操作结果: 销毁线性表L*/ LinkListq; while(*L) { q=(*L)->next; free(*L); *L=q; } returnOK; } StatusClearList(LinkListL)/*不改变L*/ {/*初始条件: 线性表L已存在。 操作结果: 将L重置为空表*/ LinkListp,q; p=L->next;/*p指向第一个结点*/ while(p)/*没到表尾*/ { q=p->next; free(p); p=q; } L->next=NULL;/*头结点指针域为空*/ returnOK; } StatusListEmpty(LinkListL) {/*初始条件: 线性表L已存在。 操作结果: 若L为空表,则返回TRUE,否则返回FALSE*/ if(L->next)/*非空*/ returnFALSE; else returnTRUE; } intListLength(LinkListL) {/*初始条件: 线性表L已存在。 操作结果: 返回L中数据元素个数*/ inti=0; LinkListp=L->next;/*p指向第一个结点*/ while(p)/*没到表尾*/ { i++; p=p->next; } returni; } StatusGetElem(LinkListL,inti,ElemType*e)/*算法2、8*/ {/*L为带头结点得单链表得头指针。 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR*/ intj=1;/*j为计数器*/ LinkListp=L->next;/*p指向第一个结点*/ while(p&&j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 华严 全部 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)