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

上传人:m**** 文档编号:76430011 上传时间:2022-04-18 格式:DOC 页数:51 大小:382KB
收藏 版权申诉 举报 下载
清华严蔚敏《大数据结构》地全部代码实现C语言_第1页
第1页 / 共51页
清华严蔚敏《大数据结构》地全部代码实现C语言_第2页
第2页 / 共51页
清华严蔚敏《大数据结构》地全部代码实现C语言_第3页
第3页 / 共51页
资源描述:

《清华严蔚敏《大数据结构》地全部代码实现C语言》由会员分享,可在线阅读,更多相关《清华严蔚敏《大数据结构》地全部代码实现C语言(51页珍藏版)》请在装配图网上搜索。

1、/* cl.h (程序名)*/#in elude#in elude#in elude#in eludevmalloc .h /* malloc() 等 */* INT MAX等 */#in clude/* EOF(=AZ 或 F6),NULL */#in clude#in clude#in clude/* atoi() */ /* eof() */ /* floor(),ceil(),abs() */#in clude /* exit() */*函数结果状态代码*/ #defi ne TRUE 1#defi ne FALSE 0#defi ne OK 1#defi ne ERROR 0#def

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

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

4、:构造一个空的顺序线性表*/(*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). elem);(*L). el

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

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

7、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;elsereturn 0;Status Prior Elem( SqList L, ElemType cur_e, ElemType

8、*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 Next Elem(SqList L, ElemType cur_e, ElemType *next_e) /*初始条件:顺序线性表L已存在*/*操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的

9、后继, */*否则操作失败,next_e无定义*/int i=1;ElemType *p=L. elem;while (iL. length &*p!=cur_e)i+;p+;if (i=L. length )return INFEASIBLE;else*n ext_e=*+p;return OK;Status List In sert(SqList *L, i nt i, ElemType e) /* 算法 2.4 */ /*初始条件:顺序线性表L已存在,1 i ListLength(L)+1 */*操作结果:在L中第i个位置之前插入新的数据元素e, L的长度加1 */ElemType *n

10、 ewbase,*q,*p;if (i(*L). length +1) /* i值不合法 */return ERROR;if ( *L). length =(*L). listsize ) /*当前存储空间已满,增加分配*/n ewbase=( ElemType*)realloc( *L). elem,( *L). listsize +LISTINCREMENT)Sizeof (ElemType);if (!newbase)exit (OVERFLOW); /* 存储分配失败 */(*L). elem =newbase; /* 新基址 */(*L). listsize +=LISTINCREM

11、ENT;/* 增加存储容量 */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已存在,1 i ListLength(L) */*操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减

12、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(*vi)( ElemType*) /*初始条件:顺序

13、线性表L已存在*/*操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败*/* vi()的形参加& ,表明可通过调用 vi()改变元素的值*/ElemType *p;int i;p=L. elem;for (i=1;i=L.length ;i+)vi(p+);pr int f(n);return OK;Status equal( ElemType c1, ElemType c2) /*判断是否相等的函数,Union()用到*/if (c1=c2)return TRUE;elsereturn FALSE;void Union( SqList *La, SqList Lb

14、) /* 算法 2.1 */ /*将所有在线性表Lb中但不在La中的数据元素插入到La中*/ElemType e;int La_len,Lb_len;int i;La_len=ListLength (*L a); /* 求线性表的长度 */Lb_len=ListLength (Lb);for (i=1;i=Lb_len;i+)GetElem(Lb,i,&e);/*取Lb中第i个数据元素赋给 e */if (!Locate Elem( *La,e,equal) /* La 中不存在和e相同的元素,则插入之*/ ListI nsert(La,+La_le n, e);void pr int (El

15、emType *c)pr int f(%d ,*c);void mai n()SqList La,Lb;Status i;int j;i= In itList (&La);if (i=1)/* 创建空表 La成功*/for (j=1;j=5;j+)/*在表La中插入5个元素*/i=List In sert(&La,j,j);pr int f(La= );/* 输出表 La 的内容 */ListTraverse(La,print );InitList(&Lb); /*也可不判断是否创建成功*/for (j=1;j=5;j+)/* 在表Lb中插入5个元素*/i=ListI nsert(&Lb,j,

16、2*j);pr int f(Lb= );/* 输出表 Lb 的内容 */ListTraverse(Lb,pr int );Un io n(&La,Lb);pr int f(new La= );/* 输出新表 La 的内容 */ListTraverse(La,print );/* algo2-2.c实现算法 22的程序*/#include cl.htypedef intElemType;#include c2-1.h#include bo2-1.c void MergeList( SqList La, SqList Lb, SqList *Lc) /* 算法 2.2 */ /*已知线性表La和L

17、b中的数据元素按值非递减排列。*/*归并La和Lb得到新的线性表 Lc,Lc的数据元素也按值非递减排列*/int i=1,j=1,k=O;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);if (ai=bj)List In sert(Lc,+k,ai);+i;elseLi

18、stI nsert(Lc,+k,bj);+j;while (i=La_len)/* 表 La 非空且表 Lb 空 */Get Elem(La,i+, &ai);List In sert(Lc,+k,ai);while (j=Lb_len)/* 表 Lb 非空且表 La 空 */Get Elem(Lb,j+, &bj);ListI nsert(Lc,+k,bj);void pr int (ElemType *c)pr int f(%d ,*c);void mai n()SqList La,Lb,Lc;int j,a4=3,5,8,11,b7=2,6,8,9,11,15,20;In itList(

19、&La);/*创建空表La */for (j=1;j=4;j+)/*在表La中插入4个兀素*/ListI nsert(&La,j,aj-1);pr int f(La=);/*输出表La的内容*/ListTraverse(La,print );In itList(&Lb);/*创建空表Lb */for (j=1;j=7;j+)/* 在表Lb中插入7个元素*/ListI nsert(&Lb,j,bj-1);pr int f(Lb= );/* 输出表 Lb 的内容 */ListTraverse(Lb,pr int );MergeList(La,Lb,&Lc);pr int f(Lc= );/* 输出

20、表 Lc 的内容 */ListTraverse(Lc,pr int );/* algo2-3.c实现算法2.7的程序*/#include cl.htypedef intElemType;#include c2-1.h#include bo2-1.cvoid 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

21、;pb=Lb. elem;Lc(*Lc). listsize =(*Lc). length =La. length +Lb. length ; /* 不用 InitList()创建空表*/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_

22、last)/* 表 La 和表 Lb 均非空 */*归并*/if (*pa=*pb)*pc+=*pa+;else*pc+=*pb+;while (pa=pa_last)*pc+=*pa+;/*while (pb=pb_last)*pc+=*pb+;/*/*表La非空且表Lb空*/ 插入La的剩余元素*/* 表Lb非空且表 La空*/插入Lb的剩余元素*/void pr int (ElemType *c)pr int f(%d ,*c);void mai n()SqList La,Lb,Lc;int j;InitList(&La);/* 创建空表 La */for (j=1;j=5;j+)/*

23、在表La中插入5个元素*/ListI nsert (&La,j,j);pr int f(La= );/* 输出表 La 的内容 */ListTraverse(La,print );InitList(&Lb);/* 创建空表 Lb */for (j=1;j=5;j+)/* 在表Lb中插入5个元素*/ListI nsert(&Lb,j,2*j);pr int f(Lb= );/* 输出表 Lb 的内容 */ListTraverse(Lb,pr int );MergeList(La,Lb,&Lc);pr int f(Lc= );/* 输出表 Lc 的内容 */ListTraverse(Lc,pr i

24、nt );/* algo2-4.c 修改算法2.7的第一个循环语句中的条件语句为开关语句,且当 */ /* *pa=*pb 时,只将两者中之一插入Lc。此操作的结果和算法2.1相同*/#include c1.h typedef int ElemType;#include c2-1.h#include bo2-1.cint comp( ElemType c1, ElemType c2) int i;if (c1c2)i=1;else if (c1=c2)i=0;elsei=-1;return i;void MergeList( SqList La, SqList Lb, SqList *Lc)

25、/*另一种合并线性表的方法(根据算法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

26、;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 =pc-( *Lc). elem;

27、 /* 加此句 */void pr int (ElemType *c) pr int f(%d ,*c);void mai n()SqList La,Lb,Lc;int j;InitList(&La); /* 创建空表 La */for (j=1;j=5;j+)/* 在表La中插入5个元素*/ListI nsert (&La,j,j);pr int f(La= );/* 输出表 La 的内容 */ListTraverse(La,print );InitList(&Lb); /* 创建空表 Lb */for (j=1;jnext=NULL;/* 指针域为空 */return OK;Status

28、DestroyList (Li nkList *L) /*初始条件:线性表L已存在。操作结果:销毁线性表L */Lin kList q;while (*L)q=(*L)- next;free( *L);*L=q;return OK;Status ClearList (LinkList L) /* 不改变 L */ /*初始条件:线性表L已存在。操作结果:将L重置为空表*/Lin kList p,q;p=L- next; /* p指向第一个结点*/while (p) /* 没到表尾*/q=p-n ext;free(p);p=q;L- next=NULL;/*头结点指针域为空*/return OK

29、;Status ListEmpty (LinkList L) /*初始条件:线性表 L已存在。操作结果:若 L为空表,则返回TRUE否则返回FALSE*/if (L-next) /* 非空 */return FALSE;elsereturn TRUE;int List Length (LinkList L) /*初始条件:线性表L已存在。操作结果:返回L中数据元素个数*/int i=0;Lin kList p=L- next;/* p 指向第一个结点 */while (p) /* 没到表尾*/i+;p=p-n ext;return i;Status Get Elem(LinkList L, i

30、nt i, ElemType *e)/* 算法 2.8 */ /* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回 ERROR */int j=1;/* j 为计数器*/Lin kList p=L- next;/* p 指向第一个结点 */while (p&jn ext;j+;if (!p|ji)/*第i个元素不存在*/return ERROR;*e=p-data; /* 取第 i 个元素 */return OK;int Locate Elem(LinkList L, ElemType e, Status (*compare)( ElemType, ElemT

31、ype) /*初始条件:线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */ /*操作结果:返回L中第1个与e满足关系compare。的数据元素的位序。*/*若这样的数据元素不存在,则返回值为0 */int i=0;Lin kList p=L-n ext;while (p)i+;if (compare(p-data,e) /*找到这样的数据元素*/return i;p=p-n ext;return 0;Status Prior Elem(LinkList L, ElemType cur_e, ElemType *pre_e) /*初始条件:线性表L已存在*/*操作结

32、果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,*/*返回OK;否则操作失败,pre_e无定义,返回INFEASIBLE */Lin kList q,p=L- next;/* p 指向第一个结点 */while (p-next)/* p所指结点有后继 */q=p-next;/* q 为 p 的后继 */if (q-data=cur_e)*pre_e=p-data;return OK;p=q; /* p 向后移*/return INFEASIBLE;Status Next Elem(LinkList L,ElemType cur_e, ElemType *next_e)

33、 /*初始条件:线性表 L已存在*/*操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,*/*返回OK;否则操作失败,next_e无定义,返回INFEASIBLE */Lin kList p=L- next;/* p 指向第一个结点 */while (p-next)/* p所指结点有后继 */if (p-data=cur_e)*n ext_e=p-n ext-data;return OK;p=p-n ext;return INFEASIBLE;Status List In sert(Li nkList L,int i, ElemType e) /* 算法 2.

34、9。不改变 L */ /*在带头结点的单链线性表L中第i个位置之前插入元素e */int j=0;Lin kList p=L,s;while (p&jn ext;j+;if (!p|ji-1)/* i 小于1或者大于表长*/return ERROR;s=(LinkList) malloc (sizeof (struct LNode); /* 生成新结点 */s-data=e; /* 插入 L 中 */s-n ext=p-n ext;p_n ext=s;return OK;Status ListDelete(LinkList L,int i, ElemType *e) /* 算法 2.10。不改

35、变 L */ /*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/int j=0;Lin kList p=L,q;while (p-next&jn ext;j+;if (!p-next|ji-1)/* 删除位置不合理 */return ERROR;q=p-next;/*删除并释放结点*/p_n ext=q _n ext;*e=q_data;free(q);return OK;Status ListTraverse(LinkList L,void(*vi)(ElemType)/* vi的形参类型为 ElemType,与bo2-1.c中相应函数的形参类型ElemType&不同*/ /

36、*初始条件:线性表 L已存在*/*操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败*/Lin kList p=L-n ext;while (p)vi(p-data);p=p-n ext;pr int f(n);return OK;void CreateList(LinkList*L, int n) /* 算法 2.11 */ /*逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L */int i;Lin kList p;*L=(LinkList)malloc (sizeof (struct LNode);(*L)- next=NULL; /* 先建立

37、一个带头结点的单链表*/pr int f(请输入d个数据n,n);for (i=n;i0;_i)p=(LinkList) malloc (sizeof (struct LNode); /* 生成新结点 */scanf(%d,&p-data);/* 输入元素值 */p-next=(*L )-next; /* 插入到表头 */(*L)-n ext=p;void CreateList2(LinkList *L, int n) /*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表*/int i;Lin kList p,q;*L=(LinkList)malloc (sizeof (stru

38、ct LNode); /* 生成头结点 */(*L)- next=NULL;q= *L;pr int f(请输入d个数据n,n);for (i=1;idata);q_n ext=p;q=q_n ext;p- next=NULL;void MergeList(LinkList La,LinkList*Lb,LinkList *Lc)/* 算法 2.12 */ /*已知单链线性表 La和Lb的元素按值非递减排列。*/*归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列*/LinkList pa=La-next,pb=(*L b)-next,pc;*Lc=pc=La; /*用La的头结

39、点作为 Lc的头结点*/while (pa&pb)if (pa-datadata)pc- n ext=pa;pc=pa;pa=pa-n ext;elsepc- n ext=pb;pc=pb;pb=pb-n ext;pc-next=pa?pa:pb; /* 插入剩余段 */free( *Lb); /*释放Lb的头结点*/Lb=NULL;void visit( ElemType c) /* ListTraverse() 调用的函数(类型要一致)*/pr int f(%d ”,c);void mai n()int n=5;Lin kList La,Lb,Lc;pr int f(按非递减顺序,);Cr

40、eateList2(&La,n);/*正位序输入 n个元素的值*/pr int f(La=);/*输出链表La的内容*/ListTraverse(La,visit);pr int f(按非递增顺序,);CreateList(&Lb,n);/* 逆位序输入 n个元素的值*/pr int f(Lb=);/*输出链表Lb的内容*/ListTraverse(Lb,visit);MergeList(La,&Lb,&Lc);/* 按非递减顺序归并 La和Lb,得到新表Lc */pr int f(Lc=);/*输出链表Lc的内容*/ListTraverse(Lc,visit);/* algo2-6.c利用单

41、链表结构处理教科书图2.1(学生健康登记表)*/#include c1.h#defi ne NAMELEN 8 /* 姓名最大长度 */#defi ne CLASSLEN 4 /* 班级名最大长度 */struct stud /* 记录的结构*/char nameNAMELEN+1;long num;char sex;int age;char ClassCLASSLEN+1;int health;typedef struct stud ElemType; /*链表结点元素类型为结构体*/#include c2-2.hchar sta39= 健康,” 一般,”神经衰弱;/*健康状况(3类)*/F

42、ILE *fp;Status InitList(LinkList*L) /* 拷自 bo2-2.c */ /*操作结果:构造一个空的线性表L */*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已存在*/*操作

43、结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败*/Lin kList p=L-n ext;while (p)vi(p-data);p=p-n ext;pr int f(n);return OK;void In sertAsce nd(Li nkList L,ElemType e) /* 此函数是由 bo2-9.c 中的同名函数改写*/ /*按学号非降序插入*/Lin kList q=L,p=L-n ext;while (p&e.nump-data.num)q=p;p=p-n ext;q-next=(LinkList)malloc (sizeof (struct LN

44、ode); /* 插在 q 后 */q-n ext-data=e;q_n ext- n ext=p; void Print (struct stud e) /*显示记录e的内容*/pr int f(%-8s %6ld,e.name,e.num);if (e.sex=m)pr int f(男);elsepr int f(女);pr int f(%5d %-4s,e.age,e.Class);pr int f(%9sn,stae.health);void Readln( struct stud *e) /*由键盘输入结点信息*/pr int f(请输入姓名(n ame);pr int f(请输入学

45、号:);sca nf(%ld, &e- nu m);pr int f(请输入性别(m:男f:女):);sca nf(%*c%c, &e-sex);pr int f(请输入年龄:);sca nf(%d, &e-age);pr int f(请输入班级(Class);pr int f(请输入健康状况(0:%s 1:%s 2:%s):,sta0,sta1,sta2); sca nf(%d, &e-health);void WriteToFile( struct stud e) /*将结点信息写入fp指定的文件*/fwrite(&e,sizeof (struct stud),1,fp);Status R

46、eadFromFile( struct stud *e) /*由fp指定的文件读取结点信息到e */int i;i=fread(e, sizeof (struct stud),1,fp);if (i=1)/* 读取文件成功*/return OK;elsereturn ERROR;Status FindFromNum(LinkList L,long num,LinkList *p,LinkList *q) /*查找表中学号为num的结点,如找到,q指向此结点,p指向q的前驱,*/*并返回TRUE如无此元素,则返回FALSE */*p=L;while (*p)*q=(*p)- next;if (*

47、q&(*q)-data.numnum)/*因为是按学号非降序排列*/break;if (*q&(*q)-data.num=num)/* 找到该学号 */return TRUE;*p=*q;return FALSE;Status FindFromName(LinkList L,char name,LinkList *p,LinkList *q) /*查找表中姓名为name的结点,如找到,q指向此结点,p指向q的前驱,*/*并返回TRUE如无此元素,则返回FALSE */*p=L;while (*p)*q=(*p)- next;if (*q&!strcmp(*q)-data.name,name)/

48、* 找到该姓名 */return TRUE;*p=*q;FALSE; returnStatus Delete ElemNum(LinkList L,long num) /*删除表中学号为num的元素,并返回TRUE如无此元素,则返回 FALSE */Lin kList p,q;if (FindFromNum(L,num,&p,&q)/*找到此结点,且q指向其,p指向其前驱*/p_n ext=q _n ext;free(q);return TRUE;return FALSE;Status Delete ElemName(LinkList L,char name) /*删除表中姓名为name的元素

49、,并返回 TRUE如无此元素,则返回 FALSE */Lin kList p,q;if (FindFromName(L,name,&p,&q)/* 找到此结点,且q指向其,p指向其前驱*/p_n ext=q _n ext;free(q);return TRUE;return FALSE;void Modf y( ElemType *e) /*修改结点内容*/char s80;Pr int (*e);/* 显示原内容 */pr int f(请输入待修改项的内容,不修改的项按回车键保持原值:n);pr int f(请输入姓名(n ame,s);pr int f(请输入学号:);gets(s);if

50、 (strlen(s)e-num=atol(s);pr int f(请输入性别(m:男f:女):);gets(s);if (strlen(s)e_sex=s0;pr int f(请输入年龄:);gets(s);if (strlen(s)e_age=atoi(s);pr int f(请输入班级(Class,s);pr int f(请输入健康状况(0:%s 1:%s 2:%s):,sta0,sta1,sta2); gets(s);if (strlen(s)e-health=atoi(s);/* 修改完毕 */#define N 4 /* student记录的个数 */void mai n()str

51、uct stud stude ntN=王小林,790631,m,18,计 91,0,陈红,790632,f,20,计 91,1,刘建平,790633,m,21,计 91,0,*/张立立,790634,m,17,计91,2;/*表的初始记录int i,j,flag=1;long num;char file name13, nameNAMELEN+1;ElemType e;Lin kList T,p,q;InitList(&T); /* 初始化链表 */while (flag)pr int f(1:将结构体数组student中的记录按学号非降序插入链表n);pr int f(2:将文件中的记录按学

52、号非降序插入链表n);pr int f(3:键盘输入新记录,并将其按学号非降序插入链表n);printf(4:删除链表中第一个有给定学号的记录n);printf(5:删除链表中第一个有给定姓名的记录n”);printf(6:修改链表中第一个有给定学号的记录n”);printf(7:修改链表中第一个有给定姓名的记录n);printf(8:查找链表中第一个有给定学号的记录n);printf(9:查找链表中第一个有给定姓名的记录n”);pr int f(10:显示所有记录11:将链表中的所有记录存入文件12:结束n);pr int f(请选择操作命令:);scan f(%d,&i);switch(i

53、)case 1:for (j=0;jN;j+)In sertAsce nd(T,stude ntj);break;case 2: pr int f(请输入文件名:”);sea nf(%s,file name);if (fp=fopen(filename,rb)=NULL)print f(打开文件失败!n);elsewhile (ReadFromFile(&e)In sertAsce nd(T,e);fclose(fp);break;case 3: ReadI n(& e);In sertAsce nd(T,e);break;case 4: print f(请输入待删除记录的学号:);scan f(%ld, &nu m);if (!Delete ElemNum(T,num)print f(没有学号为 %ld的记录n,num);break;case 5: pr int f(请输入待删除记录的姓名:);sca nf(%s, name);if (!Delete ElemName(T,name)print f(没有姓名为 %s的记录n”,name);break;ca

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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