1、第 1 页 共 51 页(线性表顺序存储)#include string.h#include ctype.h#include stdio.h#include stdlib.h#include io.h#include math.h#include time.h#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 20/*存储空间初始分配量*/typedefintStatus;/*Status 是函数的类型,其值是函数结果状态代码,如 OK 等*/typedefintElemType;/*ElemType
2、类型根据实际情况而定,这里假设为int*/Statusvisit(ElemType c)printf(%d,c);return OK;typedef structElemTypedataMAXSIZE;/*数组,存储数据元素*/intlength;/*线性表当前长度*/SqList;/*初始化顺序线性表*/StatusInitList(SqList*L)L-length=0;return OK;/*初始条件:顺序线性表 L 已存在。操作结果:若 L 为空表,则返回 TRUE,否则返回 FALSE*/StatusListEmpty(SqList L)if(L.length=0)return TR
3、UE;elsereturn FALSE;/*初始条件:顺序线性表 L 已存在。操作结果:将 L 重置为空表*/StatusClearList(SqList*L)L-length=0;return OK;/*初始条件:顺序线性表 L 已存在。操作结果:返回L中数据元素个数*/intListLength(SqList L)return L.length;/*初始条件:顺序线性表 L 已存在,1iListLength(L)*/*操作结果:用 e 返回 L 中第 i 个数据元素的值,注意i是指位置,第 1 个位置的数组是从 0 开始*/Status GetElem(SqList L,int i,Ele
4、mType*e)if(L.length=0|iL.length)return ERROR;*e=L.datai-1;return OK;/*初始条件:顺序线性表 L 已存在*/*操作结果:返回 L 中第 1 个与 e 满足关系的数据元素的位序。*/*若这样的数据元素不存在,则返回值为 0*/intLocateElem(SqList L,ElemType e)inti;if(L.length=0)return 0;for(i=0;i=L.length)return 0;return i+1;/*初始条件:顺序线性表 L 已存在,1iListLength(L),*/*操作结果:在L中第i个位置之前
5、插入新的数据元素 e,L 的长度加 1*/Status ListInsert(SqList*L,int i,ElemTypee)intk;if(L-length=MAXSIZE)/*顺序线性表已经满*/return ERROR;if(iL-length+1)/*当 i 比第一位置小或者比最后一位置后一位置还要大时*/return ERROR;if(ilength)/*若插入数据位置不在表尾*/for(k=L-length-1;k=i-1;k-)/*将要插入位置之后的数据元素向后移动一位*/第 2 页 共 51 页L-datak+1=L-datak;L-datai-1=e;/*将新元素插入*/L
6、-length+;return OK;/*初始条件:顺序线性表 L 已存在,1iListLength(L)*/*操作结果:删除 L 的第 i 个数据元素,并用 e 返回其值,L 的长度减 1*/StatusListDelete(SqList*L,int i,ElemType*e)intk;if(L-length=0)/*线性表为空*/return ERROR;if(iL-length)/*删除位置不正确*/return ERROR;*e=L-datai-1;if(ilength)/*如果删除不是最后位置*/for(k=i;klength;k+)/*将删除位置后继元素前移*/L-datak-1=
7、L-datak;L-length-;return OK;/*初始条件:顺序线性表 L 已存在*/*操作结果:依次对 L 的每个数据元素输出*/StatusListTraverse(SqList L)inti;for(i=0;iL.length;i+)visit(L.datai);printf(n);return OK;void unionL(SqList*La,SqList Lb)intLa_len,Lb_len,i;ElemTypee;La_len=ListLength(*La);Lb_len=ListLength(Lb);for(i=1;i=Lb_len;i+)GetElem(Lb,i,&
8、e);if(!LocateElem(*La,e)ListInsert(La,+La_len,e);intmain()SqList L;SqList Lb;ElemTypee;Statusi;intj,k;i=InitList(&L);printf(初始化 L 后:L.length=%dn,L.length);for(j=1;j=5;j+)i=ListInsert(&L,1,j);printf(在 L 的表头依次插入 15 后:L.data=);ListTraverse(L);printf(L.length=%d n,L.length);i=ListEmpty(L);printf(L 是否空:i
9、=%d(1:是0:否)n,i);i=ClearList(&L);printf(清空 L 后:L.length=%dn,L.length);i=ListEmpty(L);printf(L 是否空:i=%d(1:是0:否)n,i);for(j=1;j=10;j+)ListInsert(&L,j,j);printf(在 L 的表尾依次插入 110 后:L.data=);ListTraverse(L);printf(L.length=%d n,L.length);ListInsert(&L,1,0);printf(在 L 的表头插入 0 后:L.data=);ListTraverse(L);print
10、f(L.length=%d n,L.length);GetElem(L,5,&e);printf(第 5 个元素的值为:%dn,e);for(j=3;j=k;j-)i=ListDelete(&L,j,&e);/*删除第 j 个数据*/if(i=ERROR)printf(删 除 第%d 个 数 据 失 败n,j);elseprintf(删除第%d 个的元素值为:%dn,j,e);printf(依次输出 L 的元素:);ListTraverse(L);j=5;第 3 页 共 51 页ListDelete(&L,j,&e);/*删除第 5 个数据*/printf(删除第%d 个的元素值为:%dn,j
11、,e);printf(依次输出 L 的元素:);ListTraverse(L);/构造一个有 10 个数的 Lbi=InitList(&Lb);for(j=6;jnext=NULL;/*指针域为空*/return OK;/*初始条件:顺序线性表 L 已存在。操作结果:若 L 为空表,则返回 TRUE,否则返回 FALSE*/Status ListEmpty(LinkList L)if(L-next)return FALSE;elsereturn TRUE;/*初始条件:顺序线性表 L 已存在。操作结果:将 L 重置为空表*/Status ClearList(LinkList*L)LinkLis
12、t p,q;p=(*L)-next;/*p 指向第一个结点*/while(p)/*没到表尾*/q=p-next;free(p);p=q;(*L)-next=NULL;/*头结点指针域为空*/return OK;/*初始条件:顺序线性表 L 已存在。操作结果:返回L中数据元素个数*/intListLength(LinkList L)inti=0;LinkList p=L-next;/*p 指向第一个结点*/while(p)i+;p=p-next;returni;/*初始条件:顺序线性表 L 已存在,1iListLength(L)*/*操作结果:用 e 返回 L 中第 i 个数据元素的值*/Sta
13、tus GetElem(LinkList L,int i,ElemType*e)intj;LinkList p;/*声明一结点 p*/第 4 页 共 51 页p=L-next;/*让 p 指向链表 L 的第一个结点*/j=1;/*j 为计数器*/while(p&jnext;/*让 p 指向下一个结点*/+j;if(!p|ji)return ERROR;/*第 i 个元素不存在*/*e=p-data;/*取第 i 个元素的数据*/return OK;/*初始条件:顺序线性表 L 已存在*/*操作结果:返回 L 中第 1 个与 e 满足关系的数据元素的位序。*/*若这样的数据元素不存在,则返回值为
14、 0*/intLocateElem(LinkList L,ElemTypee)inti=0;LinkList p=L-next;while(p)i+;if(p-data=e)/*找到这样的数据元素*/returni;p=p-next;return 0;/*初始条件:顺序线性表 L 已存在,1iListLength(L),*/*操作结果:在L中第i个位置之前插入新的数据元素 e,L 的长度加 1*/StatusListInsert(LinkList*L,int i,ElemTypee)intj;LinkList p,s;p=*L;j=1;while(p&jnext;+j;if(!p|ji)ret
15、urn ERROR;/*第 i 个元素不存在*/s=(LinkList)malloc(sizeof(Node);/*生成新结点(C语言标准函数)*/s-data=e;s-next=p-next;/*将 p 的后继结点赋值给 s的后继*/p-next=s;/*将 s 赋值给 p 的后继*/return OK;/*初始条件:顺序线性表 L 已存在,1iListLength(L)*/*操作结果:删除 L 的第 i 个数据元素,并用 e返回其值,L 的长度减 1*/Status ListDelete(LinkList*L,int i,ElemType*e)intj;LinkList p,q;p=*L;
16、j=1;while(p-next&jnext;+j;if(!(p-next)|ji)return ERROR;/*第 i 个元素不存在*/q=p-next;p-next=q-next;/*将 q 的后继赋值给 p 的后继*/*e=q-data;/*将 q 结点中的数据给 e*/free(q);/*让系统回收此结点,释放内存*/return OK;/*初始条件:顺序线性表 L 已存在*/*操作结果:依次对 L 的每个数据元素输出*/Status ListTraverse(LinkList L)LinkList p=L-next;while(p)visit(p-data);p=p-next;printf(n);return OK;/*随机产生 n 个元素的值,建立带表头结点的单链线性表L(头插法)*/void CreateListHead(LinkList*L,intn)LinkList p;inti;srand(time(0);/*初始化随机数种子*/*L=(LinkList)malloc(sizeof(Node);(*L)-next=NULL;/*先建立一个带头结点的单链表*/for(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1