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

上传人:一*** 文档编号:827219 上传时间:2019-07-24 格式:DOC 页数:69 大小:236KB
返回 下载 相关 举报
清华严蔚敏《数据结构》地全部代码实现C语言-.doc_第1页
第1页 / 共69页
清华严蔚敏《数据结构》地全部代码实现C语言-.doc_第2页
第2页 / 共69页
点击查看更多>>
资源描述

《清华严蔚敏《数据结构》地全部代码实现C语言-.doc》由会员分享,可在线阅读,更多相关《清华严蔚敏《数据结构》地全部代码实现C语言-.doc(69页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、/* 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#define ERROR 0#define INFEASIBLE -1/

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

3、/#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量线性表存储空间的初始分配量 */#define LISTINCREMENT 2 /* 线性表存储空间的分配增量线性表存储空间的分配增量 */typedef structElemType *elem; /* 存储空间基址存储空间基址 */int length; /* 当前长度当前长度 */int listsize; /* 当前分配的存储容量当前分配的存储容量(以以 sizeof(ElemType)为单位为单位) */SqList;#include“bo2-1.c“ /* bo2-1.c 顺序表示的线性表(存储结

4、构由 c2-1.h 定义)的基本操作(12 个) */Status InitList(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; /* 初始存储容量 */return OK;Status DestroyList(SqList *L)

5、 /* 初始条件:顺序线性表 L 已存在。操作结果:销毁顺序线性表 L */free(*L).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)retur

6、n TRUE;elsereturn FALSE;int ListLength(SqList 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,ElemTyp

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

8、eturn OK;Status NextElem(SqList L,ElemType cur_e,ElemType *next_e) /* 初始条件:顺序线性表 L 已存在 */* 操作结果:若 cur_e 是 L 的数据元素,且不是最后一个,则用 next_e 返回它的后继,*/* 否则操作失败,next_e 无定义 */int i=1;ElemType *p=L.elem;while(i(*L).length+1) /* i 值不合法 */return ERROR;if(*L).length=(*L).listsize) /* 当前存储空间已满,增加分配 */newbase=(ElemTy

9、pe *)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).leng

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

11、ength-1; /* 表尾元素的位置 */for(+p;pnext=NULL; /* 指针域为空指针域为空 */return OK;Status DestroyList(LinkList *L) /* 初始条件:线性表初始条件:线性表 L 已存在。操作结果:销毁线性表已存在。操作结果:销毁线性表 L */LinkList q;while(*L)q=(*L)-next;free(*L);*L=q;return OK;Status ClearList(LinkList L) /* 不改变不改变 L */ /* 初始条件:线性表初始条件:线性表 L 已存在。操作结果:将已存在。操作结果:将 L 重

12、置为空表重置为空表 */LinkList p,q;p=L-next; /* p 指向第一个结点指向第一个结点 */while(p) /* 没到表尾没到表尾 */q=p-next;free(p);/p=q;L-next=NULL; /* 头结点指针域为空头结点指针域为空 */return OK;Status ListEmpty(LinkList L) /* 初始条件:线性表初始条件:线性表 L 已存在。操作结果:若已存在。操作结果:若 L 为空表,则返回为空表,则返回 TRUE,否则返回,否则返回 FALSE */if(L-next) /* 非空非空 */return FALSE;elseret

13、urn TRUE;int ListLength(LinkList L) /* 初始条件:线性表初始条件:线性表 L 已存在。操作结果:返回已存在。操作结果:返回 L 中数据元素个数中数据元素个数 */int i=0;LinkList p=L-next; /* p 指向第一个结点指向第一个结点 */while(p) /* 没到表尾没到表尾 */i+;p=p-next;return i;Status GetElem(LinkList L,int i,ElemType *e) /* 算法算法 2.8 */ /* L 为带头结点的单链表的头指针。当第为带头结点的单链表的头指针。当第 i 个元素存在时个

14、元素存在时,其值赋给其值赋给 e 并返回并返回 OK,否则返否则返 回回 ERROR */int j=1; /* j 为计数器为计数器 */LinkList p=L-next; /* p 指向第一个结点指向第一个结点 */while(pj+;if(!p|ji) /* 第第 i 个元素不存在个元素不存在 */return ERROR;*e=p-data; /* 取第取第 i 个元素个元素 */return OK;int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType)/ /* 初始条件初始条件: 线性表线性表

15、 L 已存在已存在,compare()是数据元素判定函数是数据元素判定函数(满足为满足为 1,否则为否则为 0) */* 操作结果操作结果: 返回返回 L 中第中第 1 个与个与 e 满足关系满足关系 compare()的数据元素的位序。的数据元素的位序。 */* 若这样的数据元素不存在若这样的数据元素不存在,则返回值为则返回值为 0 */int i=0;LinkList p=L-next;while(p)i+;if(compare(p-data,e) /* 找到这样的数据元素找到这样的数据元素 */return i;p=p-next;return 0;Status PriorElem(Lin

16、kList L,ElemType cur_e,ElemType *pre_e) /* 初始条件初始条件: 线性表线性表 L 已存在已存在 */* 操作结果操作结果: 若若 cur_e 是是 L 的数据元素的数据元素,且不是第一个且不是第一个,则用则用 pre_e 返回它的前驱返回它的前驱, */* 返回返回 OK;否则操作失败否则操作失败,pre_e 无定义无定义,返回返回 INFEASIBLE */LinkList q,p=L-next; /* p 指向第一个结点指向第一个结点 */while(p-next) /* p 所指结点有后继所指结点有后继 */q=p-next; /* q 为为 p

17、 的后继的后继 */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 已存在已存在 */* 操作结果:若操作结果:若 cur_e 是是 L 的数据元素,且不是最后一个,则用的数据元素,且不是最后一个,则用 next_e 返回它的后继,返回它的后继,*/* 返回返回 OK;否则操作失败,否则操作失败,next_e 无定义,返回无定义

18、,返回 INFEASIBLE */LinkList p=L-next; /* p 指向第一个结点指向第一个结点 */while(p-next) /* p 所指结点有后继所指结点有后继 */if(p-data=cur_e)*next_e=p-next-data;/return OK;p=p-next;return INFEASIBLE;Status ListInsert(LinkList L,int i,ElemType e) /* 算法算法 2.9。不改变。不改变 L */ /* 在带头结点的单链线性表在带头结点的单链线性表 L 中第中第 i 个位置之前插入元素个位置之前插入元素 e */in

19、t j=0;LinkList p=L,s;while(pj+;if(!p|ji-1) /* i 小于小于 1 或者大于表长或者大于表长 */return ERROR;s=(LinkList)malloc(sizeof(struct LNode); /* 生成新结点生成新结点 */s-data=e; /* 插入插入 L 中中 */s-next=p-next;p-next=s;return OK;Status ListDelete(LinkList L,int i,ElemType *e) /* 算法算法 2.10。不改变。不改变 L */ /* 在带头结点的单链线性表在带头结点的单链线性表 L

20、中,删除第中,删除第 i 个元素个元素,并由并由 e 返回其值返回其值 */int j=0;LinkList p=L,q;while(p-nextj+;if(!p-next|ji-1) /* 删除位置不合理删除位置不合理 */return ERROR;q=p-next; /* 删除并释放结点删除并释放结点 */p-next=q-next;*e=q-data;free(q);return OK;Status ListTraverse(LinkList L,void(*vi)(ElemType)/* vi 的形参类型为的形参类型为 ElemType,与,与 bo2-1.c 中相应函数的形参类型中相

21、应函数的形参类型 ElemTypewhile(p)vi(p-data);p=p-next;printf(“n“);return OK;void CreateList(LinkList *L,int n) /* 算法 2.11 */ /* 逆位序(插在表头)输入 n 个元素的值,建立带表头结构的单链线性表 L */int i;LinkList p;*L=(LinkList)malloc(sizeof(struct LNode);(*L)-next=NULL; /* 先建立一个带头结点的单链表 */printf(“请输入%d 个数据n“,n);for(i=n;i0;-i)p=(LinkList)m

22、alloc(sizeof(struct LNode); /* 生成新结点 */scanf(“%d“, /* 输入元素值 */p-next=(*L)-next; /* 插入到表头 */(*L)-next=p;void CreateList2(LinkList *L,int n) /* 正位序(插在表尾)输入 n 个元素的值,建立带表头结构的单链线性表 */int i;LinkList p,q;*L=(LinkList)malloc(sizeof(struct LNode); /* 生成头结点 */(*L)-next=NULL;q=*L;printf(“请输入%d 个数据n“,n);for(i=1

23、;idata);q-next=p;q=q-next;/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 的头结点作为 Lc 的头结点 */while(papc=pa;pa=pa-next;elsepc-next=pb;pc=pb

24、;pb=pb-next;pc-next=pa?pa:pb; /* 插入剩余段 */free(*Lb); /* 释放 Lb 的头结点 */Lb=NULL;void visit(ElemType c) /* ListTraverse()调用的函数(类型要一致) */printf(“%d “,c);void main()int n=5;LinkList La,Lb,Lc;printf(“按非递减顺序, “);CreateList2( /* 正位序输入 n 个元素的值 */printf(“La=“); /* 输出链表 La 的内容 */ListTraverse(La,visit);printf(“按非

25、递增顺序, “);CreateList( /* 逆位序输入 n 个元素的值 */printf(“Lb=“); /* 输出链表 Lb 的内容 */ListTraverse(Lb,visit);MergeList(La, /* 按非递减顺序归并 La 和 Lb,得到新表 Lc */printf(“Lc=“); /* 输出链表 Lc 的内容 */ListTraverse(Lc,visit);/* algo2-6.c 利用单链表结构处理教科书图 2.1(学生健康登记表) */#include“c1.h“#define NAMELEN 8 /* 姓名最大长度 */#define CLASSLEN 4 /

26、* 班级名最大长度 */struct stud /* 记录的结构 */char nameNAMELEN+1;long num;char sex;int age;char ClassCLASSLEN+1;int health;typedef struct stud ElemType; /* 链表结点元素类型为结构体 */#include“c2-2.h“char sta39=“健康 “,“一般 “,“神经衰弱“; /* 健康状况(3 类) */FILE *fp;Status InitList(LinkList *L) /* 拷自 bo2-2.c */ /* 操作结果:构造一个空的线性表 L */*

27、L=(LinkList)malloc(sizeof(struct LNode); /* 产生头结点,并使 L 指向此头结点 */if(!*L) /* 存储分配失败 */exit(OVERFLOW);(*L)-next=NULL; /* 指针域为空 */return OK;Status ListTraverse(LinkList L,void(*vi)(ElemType) /* 拷自 bo2-2.c */ /* 初始条件:线性表 L 已存在 */* 操作结果:依次对 L 的每个数据元素调用函数 vi()。一旦 vi()失败,则操作失败 */LinkList p=L-next;while(p)vi

28、(p-data);p=p-next;printf(“n“);return OK;/void InsertAscend(LinkList L,ElemType e) /* 此函数是由 bo2-9.c 中的同名函数改写 */ /* 按学号非降序插入 */LinkList q=L,p=L-next;while(pp=p-next;q-next=(LinkList)malloc(sizeof(struct LNode); /* 插在 q 后 */q-next-data=e;q-next-next=p;void Print(struct stud e) /* 显示记录 e 的内容 */printf(“%

29、-8s %6ld“,e.name,e.num);if(e.sex=m)printf(“ 男“);elseprintf(“ 女“);printf(“%5d %-4s“,e.age,e.Class);printf(“%9sn“,stae.health);void ReadIn(struct stud *e) /* 由键盘输入结点信息 */printf(“请输入姓名(name);printf(“请输入学号: “);scanf(“%ld“,printf(“请输入性别(m:男 f:女): “);scanf(“%*c%c“,printf(“请输入年龄: “);scanf(“%d“,printf(“请输入班

30、级(Class);printf(“请输入健康状况(0:%s 1:%s 2:%s):“,sta0,sta1,sta2);scanf(“%d“,void WriteToFile(struct stud e) /* 将结点信息写入 fp 指定的文件 */fwrite(/Status ReadFromFile(struct stud *e) /* 由 fp 指定的文件读取结点信息到 e */int i;i=fread(e,sizeof(struct stud),1,fp);if(i=1) /* 读取文件成功 */return OK;elsereturn ERROR;Status FindFromNum

31、(LinkList L,long num,LinkList *p,LinkList *q) /* 查找表中学号为 num 的结点,如找到,q 指向此结点,p 指向 q 的前驱, */* 并返回 TRUE;如无此元素,则返回 FALSE */*p=L;while(*p)*q=(*p)-next;if(*qif(*q*p=*q;return FALSE;Status FindFromName(LinkList L,char name,LinkList *p,LinkList *q) /* 查找表中姓名为 name 的结点,如找到,q 指向此结点,p 指向 q 的前驱, */* 并返回 TRUE;如

32、无此元素,则返回 FALSE */*p=L;while(*p)*q=(*p)-next;if(*q*p=*q;return FALSE;Status DeleteElemNum(LinkList L,long num) /* 删除表中学号为 num 的元素,并返回 TRUE;如无此元素,则返回 FALSE */LinkList p,q;if(FindFromNum(L,num,free(q);return TRUE;return FALSE;Status DeleteElemName(LinkList L,char name) /* 删除表中姓名为 name 的元素,并返回 TRUE;如无此元

33、素,则返回 FALSE */LinkList p,q;if(FindFromName(L,name,free(q);return TRUE;return FALSE;void Modify(ElemType *e) /* 修改结点内容 */char s80;Print(*e); /* 显示原内容 */printf(“请输入待修改项的内容,不修改的项按回车键保持原值:n“);printf(“请输入姓名(name,s);printf(“请输入学号: “);gets(s);if(strlen(s)e-num=atol(s);printf(“请输入性别(m:男 f:女): “);gets(s);if(

34、strlen(s)e-sex=s0;printf(“请输入年龄: “);gets(s);if(strlen(s)e-age=atoi(s);printf(“请输入班级(Class,s);printf(“请输入健康状况(0:%s 1:%s 2:%s):“,sta0,sta1,sta2);gets(s);if(strlen(s)e-health=atoi(s); /* 修改完毕 */#define N 4 /* student 记录的个数 */void main()struct stud studentN=“王小林“,790631,m,18,“计 91“,0,“陈红“,790632,f,20,“计

35、 91“,1,“刘建平“,790633,m,21,“计 91“,0,“张立立“,790634,m,17,“计 91“,2; /* 表的初始记录 */int i,j,flag=1;long num;char filename13,nameNAMELEN+1;ElemType e;LinkList T,p,q;InitList( /* 初始化链表 */while(flag)printf(“1:将结构体数组 student 中的记录按学号非降序插入链表n“);printf(“2:将文件中的记录按学号非降序插入链表n“);printf(“3:键盘输入新记录,并将其按学号非降序插入链表n“);print

36、f(“4:删除链表中第一个有给定学号的记录n“);printf(“5:删除链表中第一个有给定姓名的记录n“);printf(“6:修改链表中第一个有给定学号的记录n“);printf(“7:修改链表中第一个有给定姓名的记录n“);printf(“8:查找链表中第一个有给定学号的记录n“);printf(“9:查找链表中第一个有给定姓名的记录n“);printf(“10:显示所有记录 11:将链表中的所有记录存入文件 12:结束n“);printf(“请选择操作命令: “);scanf(“%d“,switch(i)case 1: for(j=0;jdata);if(q-data.num!=num

37、) /* 学号被修改 */p-next=q-next; /* 把 q 所指的结点从 L 中删除 */InsertAscend(T,q-data); /* 把元素插入 L */free(q); /* 删除 q */break;case 7: printf(“请输入待修改记录的姓名: “);scanf(“%s%*c“,name); /* %*c 吃掉回车符 */if(!FindFromName(T,name,elsenum=q-data.num; /* 学号存入 num */Modify(/if(q-data.num!=num) /* 学号被修改 */p-next=q-next; /* 把 q 所

38、指的结点从 L 中删除 */InsertAscend(T,q-data); /* 把元素插入 L */free(q); /* 删除 q */break;case 8: printf(“请输入待查找记录的学号: “);scanf(“%ld“,if(!FindFromNum(T,num,elsePrint(q-data);break;case 9: printf(“请输入待查找记录的姓名: “);scanf(“%s“,name);if(!FindFromName(T,name,elsePrint(q-data);break;case 10:printf(“ 姓名 学号 性别 年龄 班级 健康状况n

39、“);ListTraverse(T,Print);break;case 11:printf(“请输入文件名: “);scanf(“%s“,filename);if(fp=fopen(filename,“wb“)=NULL)printf(“打开文件失败!n“);elseListTraverse(T,WriteToFile);fclose(fp);break;case 12:flag=0;/* algo2-7.c 教科书中图 2.10 静态链表示例 */* 第一个结点的位置在0.cur 中,成员 cur 的值为 0,则到链表尾 */#include“c1.h“#define N 6 /* 字符串长

40、度 */typedef char ElemTypeN;#include“c2-3.h“ /* c2-3.h 线性表的静态单链表存储结构线性表的静态单链表存储结构 */#define MAXSIZE 100 /* 链表的最大长度链表的最大长度 */typedef structElemType data;int cur;component,SLinkListMAXSIZE;void main()SLinkList s=“,1,“ZHAO“,2,“QIAN“,3,“SUN“,4,“LI“,5,“ZHOU“,6,“WU“,7,“ZHENG“,8, “WANG“,0;int i;i=s0.cur;whi

41、le(i) /* 输出教科书中图 2.10(a)的状态 */printf(“%s “,si.data); /* 输出链表的当前值 */i=si.cur; /* 找到下一个 */printf(“n“);s4.cur=9; /* 按教科书中图 2.10(b)修改 */s6.cur=8;s9.cur=5;strcpy(s9.data,“SHI“);i=s0.cur;while(i) /* 输出教科书中图 2.10(b)的状态 */printf(“%s “,si.data); /* 输出链表的当前值 */i=si.cur; /* 找到下一个 */printf(“n“);/* algo2-8.c 实现算

42、法 2.17 的程序 */#include“c1.h“#define N 2typedef char ElemType;#include“c2-3.h“#include“bo2-3.c“/* bo2-3.c 实现算法实现算法 2.15、2.16 的程序的程序 (数据结构由数据结构由 c2-3.h 定义定义) (3 个个) */int Malloc(SLinkList space) /* 算法算法 2.15 */ /* 若备用链表非空若备用链表非空,则返回分配的结点下标则返回分配的结点下标(备用链表的第一个结点备用链表的第一个结点),否则返回否则返回 0 */int i=space0.cur;i

43、f(i) /* 备用链表非空备用链表非空 */space0.cur=spacei.cur; /* 备用链表的头结点指向原备用链表的第二个结点备用链表的头结点指向原备用链表的第二个结点 */return i; /* 返回新开辟结点的坐标返回新开辟结点的坐标 */void Free(SLinkList space,int k) /* 算法算法 2.16 */ /* 将下标为将下标为 k 的空闲结点回收到备用链表的空闲结点回收到备用链表(成为备用链表的第一个结点成为备用链表的第一个结点) */spacek.cur=space0.cur; /* 回收结点的游标指向备用链表的第一个结点回收结点的游标指向

44、备用链表的第一个结点 */space0.cur=k; /* 备用链表的头结点指向新回收的结点备用链表的头结点指向新回收的结点 */void DestroyList() /* 静态数组不能被销毁静态数组不能被销毁 */#include“bo2-32.c“ /* bo2-32.c 一个数组可生成若干静态链表一个数组可生成若干静态链表(数据结构由数据结构由 c2-3.h 定义定义)的基本操作的基本操作(12 个个) */void InitSpace(SLinkList L) /* 算法算法 2.14。另加。另加 */ /* 将一维数组将一维数组 L 中各分量链成一个备用链表,中各分量链成一个备用链表

45、,L0.cur 为头指针。为头指针。 “0”表示空指针表示空指针 */int i;for(i=0;iListLength(L,n) /* i 值不合理值不合理 */return ERROR;for(l=1;lListLength(L,n)+1)return ERROR;j=Malloc(L); /* 申请新单元申请新单元 */if(j) /* 申请成功申请成功 */Lj.data=e; /* 赋值给新单元赋值给新单元 */for(l=1;lListLength(L,n)return ERROR;for(j=1;jnext=*L; /* 指针域指向头结点指针域指向头结点 */return OK;

46、Status DestroyList_CL(LinkList *L) /* 操作结果:销毁线性表操作结果:销毁线性表 L */LinkList q,p=(*L)-next; /* p 指向头结点指向头结点 */while(p!=*L) /* 没到表尾没到表尾 */q=p-next;free(p);p=q;free(*L);*L=NULL;return OK;Status ClearList_CL(LinkList *L) /* 改变改变 L */ /* 初始条件:线性表初始条件:线性表 L 已存在。操作结果:将已存在。操作结果:将 L 重置为空表重置为空表 */LinkList p,q;*L=

47、(*L)-next; /* L 指向头结点指向头结点 */p=(*L)-next; /* p 指向第一个结点指向第一个结点 */while(p!=*L) /* 没到表尾没到表尾 */q=p-next;free(p);p=q;(*L)-next=*L; /* 头结点指针域指向自身头结点指针域指向自身 */return OK;Status ListEmpty_CL(LinkList L) /* 初始条件:线性表初始条件:线性表 L 已存在。操作结果:若已存在。操作结果:若 L 为空表,则返回为空表,则返回 TRUE,否则返回,否则返回 FALSE */if(L-next=L) /* 空空 */re

48、turn TRUE;elsereturn FALSE;int ListLength_CL(LinkList L)/ /* 初始条件:初始条件:L 已存在。操作结果:返回已存在。操作结果:返回 L 中数据元素个数中数据元素个数 */int i=0;LinkList p=L-next; /* p 指向头结点指向头结点 */while(p!=L) /* 没到表尾没到表尾 */i+;p=p-next;return i;Status GetElem_CL(LinkList L,int i,ElemType *e) /* 当第当第 i 个元素存在时个元素存在时,其值赋给其值赋给 e 并返回并返回 OK,否则返回否则返回 ERROR */int j=1; /* 初始化初始化,j 为计数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com