清华严蔚敏《数据结构》的全部代码.docx

上传人:b****6 文档编号:6320831 上传时间:2023-01-05 格式:DOCX 页数:84 大小:46.74KB
下载 相关 举报
清华严蔚敏《数据结构》的全部代码.docx_第1页
第1页 / 共84页
清华严蔚敏《数据结构》的全部代码.docx_第2页
第2页 / 共84页
清华严蔚敏《数据结构》的全部代码.docx_第3页
第3页 / 共84页
清华严蔚敏《数据结构》的全部代码.docx_第4页
第4页 / 共84页
清华严蔚敏《数据结构》的全部代码.docx_第5页
第5页 / 共84页
点击查看更多>>
下载资源
资源描述

清华严蔚敏《数据结构》的全部代码.docx

《清华严蔚敏《数据结构》的全部代码.docx》由会员分享,可在线阅读,更多相关《清华严蔚敏《数据结构》的全部代码.docx(84页珍藏版)》请在冰豆网上搜索。

清华严蔚敏《数据结构》的全部代码.docx

清华严蔚敏《数据结构》的全部代码

/*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()*/

/*函数结果状态代码*/

#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

/*操作结果:

用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已存在*/

next_e

/*操作结果:

若cur_e就是L得数据元素,且不就是最后一个,则用返回它得后继,*/

/*否则操作失败,next_e无定义*/

inti=1;

ElemType*p=L、elem;

while(i

=cur_e)

{

i++;

p++;

}

if(i==L、length)

returnINFEASIBLE;

else

*next_e=*++p;

returnOK;

}

}

StatusListlnsert(SqList*L,inti,ElemTypee)/算法2、4*/

{/*初始条件:

顺序线性表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+LlSTlNCREMENT)*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

/*操作结果:

删除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;pv二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;jv=5;j++)/*在表La中插入5个元素*/

i=ListInsert(&La,j,j);

printf("La二");/*输出表La得内容*/

ListTraverse(La,print);

InitList(&Lb);/*也可不判断就是否创建成功*/

for(j=1;jv=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;

E-emTypeaLbj-

一nifLisf(LC)r^wH)}*Lc*、

Lal-enuLis产engfh(La)八

Lbl-enuLis产engfh(Lb)八

whi-e(AHLal-enQOQOAHLbl-en)/**La>»LbM皿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)/**Lb^H)}bn*LaH)}*/宀

Gem-em(Lbj++QObj)八Lisf-nsert(LC++Kbj)八voidp「inf(E-emType*c)

 

p「inff(=%d=*c)八

voidmaino

SqLis产p&lg

Ik4H宀3U18三亘7HN3689二二525一nifLisf(QOLa)r^wH)}*La*、for5rhAH4j++)/*m»La甘B>4->昌洲*/匚sf-nsert(QOLa・Lau—二)八p「inff(・La!

)r鸯圧*LaliN翊*、

亠3/亠24

 

ListTraverse(La,print);

InitList(&Lb);/*创建空表Lb*/

for(j=1;jv=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;jv=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),e-em''E-emType*)ma--oc((*LC}s=sfsN-e*sizeof(E-emType)=if(一(*LC)丿e-em)exif(OVERFLOW}_pal-asllL^e-em+La-engfh——k八pb—-asllLbAe-em+Lb>-engfh丄whi-e(paAHPal-asQSQOpbAHPbl-asf)/**La>»LbM^H)}*/swifch(comp(*pa「pb))/*乓Q>*M2,7^0*/宀caseppb++case」;pc++H*pa++

 

break

case;pc++H*pb++whi-e(paAHPal-asf)/**La^H)}bn*LbH)}*/

*pc++H*pa++

whi-e(pbAHPbl-asf)/**Lb^H)}bn*LaH)}*/

*pc++H*pb++

(*LC),-engfhHPC—(*LC),e-emrs'乓Q*_voidprinfmemTypeo

亠8/亠24

 

printf("%d",*c);

}

voidmain()

{

SqListLa,Lb,Lc;

intj;

InitList(&La);/*创建空表La*/

for(j=1;jv=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++;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1