ImageVerifierCode 换一换
格式:DOCX , 页数:107 ,大小:43.02KB ,
资源ID:29376465      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29376465.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(清华严蔚敏《数据结构》的全部代码实现C语言.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

清华严蔚敏《数据结构》的全部代码实现C语言.docx

1、清华严蔚敏数据结构的全部代码实现C语言/* c1.h (程序名) */ #include #include #include /* malloc()等 */ #include /* INT_MAX等 */ #include /* EOF(=Z或F6),NULL */ #include /* atoi() */ #include /* eof() */ #include /* floor(),ceil(),abs() */ #include /* exit() */ /* 函数结果状态代码 */ #define TRUE 1 #define FALSE 0 #define OK 1 #defin

2、e ERROR 0 #define INFEASIBLE -1 /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */* algo2-1.c 实现算法2.1的程序 */ #includec1.h typedef int ElemType;#includec2-1.h /*c2-1.h 线性表的动态分配顺序存储结构 */

3、 #define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量 */ #define LISTINCREMENT 2 /* 线性表存储空间的分配增量 */ typedef struct ElemType *elem; /* 存储空间基址 */ int length; /* 当前长度 */ int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */ SqList;#includebo2-1.c/* bo2-1.c 顺序表示的线性表(存储结构由c2-1.h定义)的基本操作(12个) */ Status InitList(SqLis

4、t *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; /* 初始存储容量 */ return OK; Status DestroyList(SqList *L) /* 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L */ free(*L

5、).elem); (*L).elem=NULL; (*L).length=0; (*L).listsize=0; return OK; Status ClearList(SqList *L) /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */ (*L).length=0; return OK; Status ListEmpty(SqList L) /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */ if(L.length=0) return TRUE; else return FALSE; int ListLength(SqLis

6、t L) /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */ return L.length; Status GetElem(SqList L,int i,ElemType *e) /* 初始条件:顺序线性表L已存在,1iListLength(L) */ /* 操作结果:用e返回L中第i个数据元素的值 */ if(iL.length) exit(ERROR); *e=*(L.elem+i-1); return OK; int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType) /* 初始条件

7、:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */ /* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 */ /* 若这样的数据元素不存在,则返回值为0。算法2.6 */ ElemType *p; int i=1; /* i的初值为第1个元素的位序 */ p=L.elem; /* p的初值为第1个元素的存储位置 */ while(i=L.length&!compare(*p+,e) +i; if(i=L.length) return i; else return 0; Status PriorElem(SqList L,ElemT

8、ype cur_e,ElemType *pre_e) /* 初始条件:顺序线性表L已存在 */ /* 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱, */ /* 否则操作失败,pre_e无定义 */ int i=2; ElemType *p=L.elem+1; while(iL.length) return INFEASIBLE; else *pre_e=*-p; return OK; Status NextElem(SqList L,ElemType cur_e,ElemType *next_e) /* 初始条件:顺序线性表L已存在 */ /* 操作结果:若

9、cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, */ /* 否则操作失败,next_e无定义 */ int i=1; ElemType *p=L.elem; while(iL.length&*p!=cur_e) i+; p+; if(i=L.length) return INFEASIBLE; else *next_e=*+p; return OK; Status ListInsert(SqList *L,int i,ElemType e) /* 算法2.4 */ /* 初始条件:顺序线性表L已存在,1iListLength(L)+1 */ /* 操作结果:在L中第i

10、个位置之前插入新的数据元素e,L的长度加1 */ ElemType *newbase,*q,*p; if(i(*L).length+1) /* i值不合法 */ return ERROR; if(*L).length=(*L).listsize) /* 当前存储空间已满,增加分配 */ newbase=(ElemType *)realloc(*L).elem,(*L).listsize+LISTINCREMENT)*sizeof(ElemType); if(!newbase) exit(OVERFLOW); /* 存储分配失败 */ (*L).elem=newbase; /* 新基址 */ (

11、*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 */ return OK; Status ListDelete(SqList *L,int i,ElemType *e) /* 算法2.5 */ /* 初始条件:顺序线性表L已存在,1iListLength(L) */ /* 操作结果:删除L的

12、第i个数据元素,并用e返回其值,L的长度减1 */ ElemType *p,*q; if(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-; /* 表长减1 */ return OK; Status ListTraverse(SqList L,void(*

13、vi)(ElemType*) /* 初始条件:顺序线性表L已存在 */ /* 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */ /* vi()的形参加&,表明可通过调用vi()改变元素的值 */ 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) /* 判断是否相等的函数,Union()用到 */ if(c1=c2) return TRUE; else return FA

14、LSE; void Union(SqList *La,SqList Lb) /* 算法2.1 */ /* 将所有在线性表Lb中但不在La中的数据元素插入到La中 */ ElemType e; int La_len,Lb_len; int i; 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相同的元素,则插入之 */ List

15、Insert(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) /* 创建空表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;

16、j+) /* 在表Lb中插入5个元素 */ i=ListInsert(&Lb,j,2*j); printf(Lb= ); /* 输出表Lb的内容 */ ListTraverse(Lb,print); Union(&La,Lb); printf(new La= ); /* 输出新表La的内容 */ ListTraverse(La,print);/* algo2-2.c 实现算法2.2的程序 */ #includec1.h typedef int ElemType; #includec2-1.h #includebo2-1.c void MergeList(SqList La,SqList Lb,

17、SqList *Lc) /* 算法2.2 */ /* 已知线性表La和Lb中的数据元素按值非递减排列。 */ /* 归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列 */ int i=1,j=1,k=0; int La_len,Lb_len; ElemType ai,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); i

18、f(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); void print(ElemType *c) printf(%d ,*c); void main() SqList La,Lb,Lc; int j,a4=3,5,8,

19、11,b7=2,6,8,9,11,15,20; InitList(&La); /* 创建空表La */ for(j=1;j=4;j+) /* 在表La中插入4个元素 */ ListInsert(&La,j,aj-1); printf(La= ); /* 输出表La的内容 */ ListTraverse(La,print); InitList(&Lb); /* 创建空表Lb */ for(j=1;j=7;j+) /* 在表Lb中插入7个元素 */ ListInsert(&Lb,j,bj-1); printf(Lb= ); /* 输出表Lb的内容 */ ListTraverse(Lb,print)

20、; MergeList(La,Lb,&Lc); printf(Lc= ); /* 输出表Lc的内容 */ ListTraverse(Lc,print); /* algo2-3.c 实现算法2.7的程序 */ #includec1.h typedef int ElemType; #includec2-1.h #includebo2-1.c void MergeList(SqList La,SqList Lb,SqList *Lc) /* 算法2.7 */ /* 已知顺序线性表La和Lb的元素按值非递减排列。 */ /* 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列 */ El

21、emType *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

22、; 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的剩余元素 */ void print(ElemType *c) printf(%d ,*c); void main() SqList La,Lb,Lc; int j; Init

23、List(&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(L

24、c= ); /* 输出表Lc的内容 */ ListTraverse(Lc,print); /* algo2-4.c 修改算法2.7的第一个循环语句中的条件语句为开关语句,且当 */ /* *pa=*pb时,只将两者中之一插入Lc。此操作的结果和算法2.1相同 */ #includec1.h typedef int ElemType; #includec2-1.h #includebo2-1.c int comp(ElemType c1,ElemType c2) int i; if(c1c2) i=1; else if(c1=c2) i=0; else i=-1; return i; void

25、MergeList(SqList La,SqList Lb,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_las

26、t=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不同 */ 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=

27、pc-(*Lc).elem; /* 加此句 */ void print(ElemType *c) printf(%d ,*c); void main() SqList La,Lb,Lc; int j; 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个元素 */ L

28、istInsert(&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的程序 */ #includec1.h typedef int ElemType; #includec2-2.h/* c2-2.h 线性表的单链表存储结构 */ struct LNode ElemType data; struct LNode *next; ; typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */ #includebo2-2.c/* bo2-2.c 单链表线性表(存储结构由c2-2.h定义)的基本操作(12个) */ Status InitList(LinkList *L) /* 操作结果:构造一个空的线性表L */ *L=(LinkList)malloc(sizeof(struct LNode); /* 产生头结点,并使L指向此头结点 */ if(!*L) /* 存储分配失败 */ exit(OVERFLOW); (*L)

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

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