‍/* c1、h (程序名)"/>
收藏 分销(赏)

《数据结构》的全部代码实现C语言.doc

上传人:天**** 文档编号:4373672 上传时间:2024-09-14 格式:DOC 页数:65 大小:214.50KB
下载 相关 举报
《数据结构》的全部代码实现C语言.doc_第1页
第1页 / 共65页
《数据结构》的全部代码实现C语言.doc_第2页
第2页 / 共65页
《数据结构》的全部代码实现C语言.doc_第3页
第3页 / 共65页
《数据结构》的全部代码实现C语言.doc_第4页
第4页 / 共65页
《数据结构》的全部代码实现C语言.doc_第5页
第5页 / 共65页
点击查看更多>>
资源描述

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

2、 -1 /* #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 struct   ElemType *elem; /* 存储空间基址 */   int length; /* 当前长度 */   int listsize; /* 当前分配得存储容量(以sizeof(ElemType)为单位) */ SqList;#include"bo2-1、c"/* bo2-1、c 顺序表示得线性表(存储结构由c2-1、h定义)得基

4、本操作(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; /* 初始存储容量 */   r

5、eturn OK; Status DestroyList(SqList *L) /* 初始条件:顺序线性表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 ListEm

6、pty(SqList L) /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */   if(L、length=0)     return TRUE;   else     return FALSE; int ListLength(SqList L) /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */   return L、length; Status GetElem(SqList L,int i,ElemType *e) /* 初始条件:顺序线性表L已存在,

7、1iListLength(L) */   /* 操作结果:用e返回L中第i个数据元素得值 */   if(i<1|i>L、length)     exit(ERROR);   *e=*(L、elem+i-1);   return OK; int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType) /* 初始条件:顺序线性表L已存在,compare()就是数据元素判定函数(满足为1,否则为0) */   /* 操作结果:返回L中第1个

8、与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)  

9、  return i;   else     return 0; Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e) /* 初始条件:顺序线性表L已存在 */   /* 操作结果:若cur_e就是L得数据元素,且不就是第一个,则用pre_e返回它得前驱, */   /*           否则操作失败,pre_e无定义 */   int i=2;   ElemType *p=L、elem+1; &nb

10、sp; while(i<=l、length&&*p!=cur_e) i="">L、length)     return INFEASIBLE;   else       *pre_e=*-p;     return OK;   Status NextElem(SqList L,ElemType cur_e,ElemType *next_e) /* 初始条件:顺序线性表L已存在 */   /* 操作结果:若cur_e就是L得数据元素,且不就是最后一个

11、,则用next_e返回它得后继, */   /*           否则操作失败,next_e无定义 */   int i=1;   ElemType *p=L、elem;   while(i<L、length&&*p!=cur_e)       i+;     p+;     if(i=L、length)     return INFEASIBLE;   else   &

12、nbsp;   *next_e=*+p;     return OK;   Status ListInsert(SqList *L,int i,ElemType e) /* 算法2、4 */ /* 初始条件:顺序线性表L已存在,1iListLength(L)+1 */   /* 操作结果:在L中第i个位置之前插入新得数据元素e,L得长度加1 */   ElemType *newbase,*q,*p;   if(i<1|i>(*L)、length+1) /* i值不合法 */     retur

13、n ERROR;   if(*L)、length>=(*L)、listsize) /* 当前存储空间已满,增加分配 */       newbase=(ElemType *)realloc(*L)、elem,(*L)、listsize+LISTINCREMENT)*sizeof(ElemType);     if(!newbase)       exit(OVERFLOW); /* 存储分配失败 */     (*L)、elem=newbase; /* 新基址 */  

14、   (*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,ElemT

15、ype *e) /* 算法2、5 */ /* 初始条件:顺序线性表L已存在,1iListLength(L) */   /* 操作结果:删除L得第i个数据元素,并用e返回其值,L得长度减1 */   ElemType *p,*q;   if(i<1|i>(*L)、length) /* i值不合法 */     return ERROR;   p=(*L)、elem+i-1; /* p为被删除元素得位置 */   *e=*p; /* 被删除元素得值赋给e */   q=(*L)、elem+(*L)、leng

16、th-1; /* 表尾元素得位置 */   for(+p;p<=q;+p) /* 被删除元素之后得元素左移 */     *(p-1)=*p;   (*L)、length-; /* 表长减1 */   return OK; Status ListTraverse(SqList L,void(*vi)(ElemType*) /* 初始条件:顺序线性表L已存在 */   /* 操作结果:依次对L得每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */   /*        

17、;   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)   &n

18、bsp; return TRUE;   else     return FALSE; 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

19、+)       GetElem(Lb,i,&e); /* 取Lb中第i个数据元素赋给e */     if(!LocateElem(*La,e,equal) /* La中不存在与e相同得元素,则插入之 */       ListInsert(La,+La_len,e);   void print(ElemType *c)   printf("%d ",*c); void main()   SqList La,Lb;   Status i; &nb

20、sp; 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); /* 也可不判断就是否创建成功 */  

21、for(j=1;j<=5;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得程序 */ #inc

22、lude"c1、h" typedef int ElemType; #include"c2-1、h" #include"bo2-1、c" void MergeList(SqList La,SqList Lb,SqList *Lc) /* 算法2、2 */ /* 已知线性表La与Lb中得数据元素按值非递减排列。 */   /* 归并La与Lb得到新得线性表Lc,Lc得数据元素也按值非递减排列 */   int i=1,j=1,k=0;   int La_len,Lb_len;   ElemType

23、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)       &nb

24、sp;   ListInsert(Lc,+k,ai);       +i;         else           ListInsert(Lc,+k,bj);       +j;         while(i<=La_len) /* 表La非空且表Lb空 */       GetElem(La,i+,&ai);     Lis

25、tInsert(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,11,b7=2,6,8,9,11,15,20; &

26、nbsp; 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个元素 */    

27、; ListInsert(&Lb,j,bj-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" typedef int ElemType; #incl

28、ude"c2-1、h" #include"bo2-1、c" void 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;   pb=Lb、elem;   (*Lc)、listsize=(*Lc)、le

29、ngth=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&l

30、t;=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空 */ &n

31、bsp;   *pc+=*pb+; /* 插入Lb得剩余元素 */ 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= "

32、;); /* 输出表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

33、("Lc= "); /* 输出表Lc得内容 */   ListTraverse(Lc,print); /* algo2-4、c 修改算法2、7得第一个循环语句中得条件语句为开关语句,且当 */ /* *pa=*pb时,只将两者中之一插入Lc。此操作得结果与算法2、1相同 */ #include"c1、h" typedef int ElemType; #include"c2-1、h" #include"bo2-1、c" int comp(ElemType c1,ElemType c2)   int

34、 i;   if(c1<c2)     i=1;   else if(c1=c2)     i=0;   else     i=-1;   return i; void MergeList(SqList La,SqList Lb,SqList *Lc) /* 另一种合并线性表得方法(根据算法2、7下得要求修改算法2、7) */   ElemType  *pa,*pa_last,*pb,*pb_last,*pc;   pa=La、elem;   pb=

35、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&&a

36、mp;pb<=pb_last) /* 表La与表Lb均非空 */     switch(comp(*pa,*pb) /* 此句与算法2、7不同 */           case  0: pb+;       case  1: *pc+=*pa+;                break;       case -1: *pc+=*pb+;   &n

37、bsp;   while(pa<=pa_last) /* 表La非空且表Lb空 */     *pc+=*pa+;   while(pb<=pb_last) /* 表Lb非空且表La空 */     *pc+=*pb+;   (*Lc)、length=pc-(*Lc)、elem; /* 加此句 */ void print(ElemType *c)   printf("%d ",*c); void main()   SqList La,Lb,Lc;   int j;

38、   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="); /* 输出表Lb得内容 */ &nbs

39、p; ListTraverse(Lb,print);   MergeList(La,Lb,&Lc);   printf(" lc="); /* 输出表Lc得内容 */   ListTraverse(Lc,print); /* algo2-5、c 实现算法2、11、2、12得程序 */ #include" typedef="" int="" h="" struct="" lnode="" elemtype=""

40、 c="" status="" linklist="" l="(LinkList)malloc(sizeof(struct" -="">next=NULL; /* 指针域为空 */   return OK; Status DestroyList(LinkList *L) /* 初始条件:线性表L已存在。操作结果:销毁线性表L */   LinkList q;   while(*L)       q=(*L)->next; &

41、nbsp;   free(*L);     *L=q;     return OK; Status ClearList(LinkList L) /* 不改变L */ /* 初始条件:线性表L已存在。操作结果:将L重置为空表 */   LinkList p,q;   p=L->next; /* p指向第一个结点 */   while(p) /* 没到表尾 */       q=p->next;     free(p);     p=q;

42、     L->next=NULL; /* 头结点指针域为空 */   return OK; Status ListEmpty(LinkList L) /* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */   if(L->next) /* 非空 */     return FALSE;   else     return TRUE; int ListLength(LinkList L) /* 初始条件:线性表L已存在。操作结果:返回L中数据元素个数 *

43、/   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个元素存在时,其值赋给e并返回OK,否则返回ERROR */   int j=1; /* j为计数器

44、 */   LinkList p=L->next; /* p指向第一个结点 */   while(p&&jnext;     j+;     if(!p|j>i) /* 第i个元素不存在 */     return ERROR;   *e=p->data; /* 取第i个元素 */   return OK; int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType) /* 初始

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

46、元素 */       return i;     p=p->next;     return 0; Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e) /* 初始条件: 线性表L已存在 */   /* 操作结果: 若cur_e就是L得数据元素,且不就是第一个,则用pre_e返回它得前驱, */   /*           返回OK;否则操作失败,pre_e无定义,返回INFEAS

47、IBLE */   LinkList 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; /*

48、p向后移 */     return INFEASIBLE; Status NextElem(LinkList L,ElemType cur_e,ElemType *next_e) /* 初始条件:线性表L已存在 */   /* 操作结果:若cur_e就是L得数据元素,且不就是最后一个,则用next_e返回它得后继, */   /*           返回OK;否则操作失败,next_e无定义,返回INFEASIBLE */   LinkList p=L->next; /* p指向第一个

49、结点 */   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,ElemTy

50、pe e) /* 算法2、9。不改变L */ /* 在带头结点得单链线性表L中第i个位置之前插入元素e */   int j=0;   LinkList p=L,s;   while(p&&jnext;     j+;     if(!p|j>i-1) /* i小于1或者大于表长 */     return ERROR;   s=(LinkList)malloc(sizeof(struct LNode); /* 生成新结点 */   s->data=e; /

51、* 插入L中 */   s->next=p->next;   p->next=s;   return OK; Status ListDelete(LinkList L,int i,ElemType *e) /* 算法2、10。不改变L */ /* 在带头结点得单链线性表L中,删除第i个元素,并由e返回其值 */   int j=0;   LinkList p=L,q;   while(p->next&&jnext;     j+;     if(!p-&g

52、t;next|j>i-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中相应函数得形参类型ElemType&不同 */ /* 初始条件:线性表L

53、已存在 */   /* 操作结果:依次对L得每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */   LinkList p=L->next;   while(p)       vi(p->data);     p=p->next;     printf("n");   return OK; void CreateList(LinkList *L,int n) /* 算法2、11 */ /* 逆位序(插在表头)输入n个元素得值,建立带表头

54、结构得单链线性表L */   int i;   LinkList p;   *L=(LinkList)malloc(sizeof(struct LNode);   (*L)->next=NULL; /* 先建立一个带头结点得单链表 */   printf("请输入%d个数据n",n);   for(i=n;i>0;-i)       p=(LinkList)malloc(sizeof(struct LNode); /* 生成新结点 */     scan

55、f("%d",&p->data); /* 输入元素值 */     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;i<

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服