数据结构代码.pdf
《数据结构代码.pdf》由会员分享,可在线阅读,更多相关《数据结构代码.pdf(51页珍藏版)》请在冰豆网上搜索。
第1页共51页(线性表顺序存储)#includestring.h#includectype.h#includestdio.h#includestdlib.h#includeio.h#includemath.h#includetime.h#defineOK1#defineERROR0#defineTRUE1#defineFALSE0#defineMAXSIZE20/*存储空间初始分配量*/typedefintStatus;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/typedefintElemType;/*ElemType类型根据实际情况而定,这里假设为int*/Statusvisit(ElemTypec)printf(%d,c);returnOK;typedefstructElemTypedataMAXSIZE;/*数组,存储数据元素*/intlength;/*线性表当前长度*/SqList;/*初始化顺序线性表*/StatusInitList(SqList*L)L-length=0;returnOK;/*初始条件:
顺序线性表L已存在。
操作结果:
若L为空表,则返回TRUE,否则返回FALSE*/StatusListEmpty(SqListL)if(L.length=0)returnTRUE;elsereturnFALSE;/*初始条件:
顺序线性表L已存在。
操作结果:
将L重置为空表*/StatusClearList(SqList*L)L-length=0;returnOK;/*初始条件:
顺序线性表L已存在。
操作结果:
返回L中数据元素个数*/intListLength(SqListL)returnL.length;/*初始条件:
顺序线性表L已存在,1iListLength(L)*/*操作结果:
用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始*/StatusGetElem(SqListL,inti,ElemType*e)if(L.length=0|iL.length)returnERROR;*e=L.datai-1;returnOK;/*初始条件:
顺序线性表L已存在*/*操作结果:
返回L中第1个与e满足关系的数据元素的位序。
*/*若这样的数据元素不存在,则返回值为0*/intLocateElem(SqListL,ElemTypee)inti;if(L.length=0)return0;for(i=0;i=L.length)return0;returni+1;/*初始条件:
顺序线性表L已存在,1iListLength(L),*/*操作结果:
在L中第i个位置之前插入新的数据元素e,L的长度加1*/StatusListInsert(SqList*L,inti,ElemTypee)intk;if(L-length=MAXSIZE)/*顺序线性表已经满*/returnERROR;if(iL-length+1)/*当i比第一位置小或者比最后一位置后一位置还要大时*/returnERROR;if(ilength)/*若插入数据位置不在表尾*/for(k=L-length-1;k=i-1;k-)/*将要插入位置之后的数据元素向后移动一位*/第2页共51页L-datak+1=L-datak;L-datai-1=e;/*将新元素插入*/L-length+;returnOK;/*初始条件:
顺序线性表L已存在,1iListLength(L)*/*操作结果:
删除L的第i个数据元素,并用e返回其值,L的长度减1*/StatusListDelete(SqList*L,inti,ElemType*e)intk;if(L-length=0)/*线性表为空*/returnERROR;if(iL-length)/*删除位置不正确*/returnERROR;*e=L-datai-1;if(ilength)/*如果删除不是最后位置*/for(k=i;klength;k+)/*将删除位置后继元素前移*/L-datak-1=L-datak;L-length-;returnOK;/*初始条件:
顺序线性表L已存在*/*操作结果:
依次对L的每个数据元素输出*/StatusListTraverse(SqListL)inti;for(i=0;iL.length;i+)visit(L.datai);printf(n);returnOK;voidunionL(SqList*La,SqListLb)intLa_len,Lb_len,i;ElemTypee;La_len=ListLength(*La);Lb_len=ListLength(Lb);for(i=1;i=Lb_len;i+)GetElem(Lb,i,&e);if(!
LocateElem(*La,e)ListInsert(La,+La_len,e);intmain()SqListL;SqListLb;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=%dn,L.length);i=ListEmpty(L);printf(L是否空:
i=%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=%dn,L.length);ListInsert(&L,1,0);printf(在L的表头插入0后:
L.data=);ListTraverse(L);printf(L.length=%dn,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,e);printf(依次输出L的元素:
);ListTraverse(L);/构造一个有10个数的Lbi=InitList(&Lb);for(j=6;jnext=NULL;/*指针域为空*/returnOK;/*初始条件:
顺序线性表L已存在。
操作结果:
若L为空表,则返回TRUE,否则返回FALSE*/StatusListEmpty(LinkListL)if(L-next)returnFALSE;elsereturnTRUE;/*初始条件:
顺序线性表L已存在。
操作结果:
将L重置为空表*/StatusClearList(LinkList*L)LinkListp,q;p=(*L)-next;/*p指向第一个结点*/while(p)/*没到表尾*/q=p-next;free(p);p=q;(*L)-next=NULL;/*头结点指针域为空*/returnOK;/*初始条件:
顺序线性表L已存在。
操作结果:
返回L中数据元素个数*/intListLength(LinkListL)inti=0;LinkListp=L-next;/*p指向第一个结点*/while(p)i+;p=p-next;returni;/*初始条件:
顺序线性表L已存在,1iListLength(L)*/*操作结果:
用e返回L中第i个数据元素的值*/StatusGetElem(LinkListL,inti,ElemType*e)intj;LinkListp;/*声明一结点p*/第4页共51页p=L-next;/*让p指向链表L的第一个结点*/j=1;/*j为计数器*/while(p&jnext;/*让p指向下一个结点*/+j;if(!
p|ji)returnERROR;/*第i个元素不存在*/*e=p-data;/*取第i个元素的数据*/returnOK;/*初始条件:
顺序线性表L已存在*/*操作结果:
返回L中第1个与e满足关系的数据元素的位序。
*/*若这样的数据元素不存在,则返回值为0*/intLocateElem(LinkListL,ElemTypee)inti=0;LinkListp=L-next;while(p)i+;if(p-data=e)/*找到这样的数据元素*/returni;p=p-next;return0;/*初始条件:
顺序线性表L已存在,1iListLength(L),*/*操作结果:
在L中第i个位置之前插入新的数据元素e,L的长度加1*/StatusListInsert(LinkList*L,inti,ElemTypee)intj;LinkListp,s;p=*L;j=1;while(p&jnext;+j;if(!
p|ji)returnERROR;/*第i个元素不存在*/s=(LinkList)malloc(sizeof(Node);/*生成新结点(C语言标准函数)*/s-data=e;s-next=p-next;/*将p的后继结点赋值给s的后继*/p-next=s;/*将s赋值给p的后继*/returnOK;/*初始条件:
顺序线性表L已存在,1iListLength(L)*/*操作结果:
删除L的第i个数据元素,并用e返回其值,L的长度减1*/StatusListDelete(LinkList*L,inti,ElemType*e)intj;LinkListp,q;p=*L;j=1;while(p-next&jnext;+j;if(!
(p-next)|ji)returnERROR;/*第i个元素不存在*/q=p-next;p-next=q-next;/*将q的后继赋值给p的后继*/*e=q-data;/*将q结点中的数据给e*/free(q);/*让系统回收此结点,释放内存*/returnOK;/*初始条件:
顺序线性表L已存在*/*操作结果:
依次对L的每个数据元素输出*/StatusListTraverse(LinkListL)LinkListp=L-next;while(p)visit(p-data);p=p-next;printf(n);returnOK;/*随机产生n个元素的值,建立带表头结点的单链线性表L(头插法)*/voidCreateListHead(LinkList*L,intn)LinkListp;inti;srand(time(0);/*初始化随机数种子*/*L=(LinkList)malloc(sizeof(Node);(*L)-next=NULL;/*先建立一个带头结点的单链表*/for(