




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、顺序表的建立与常用操作的算法(C语言实现)#defineLIST_INIT_SIZE10/*线性表存储空间的初始分配量*/*c2-1.h线性表的动态分配顺序存储结构*/#defineLISTINCREMENT2/*线性表存储空间的分配增量*/typedefstructElemType*elem;/*存储空间基址*/intlength;/*当前长度*/intlistsize;/*当前分配的存储容量(以sizeof(ElemType)为单位)*/SqList;StatusInitList(SqList*L)/*操作结果:构造一个空的顺序线性表*/(*L).elem=(ElemType*)mallo
2、c(LIST_INIT_SIZE*sizeof(ElemType);if(!(*L).elem)exit(OVERFLOW);/*存储分配失败*/(*L).length=0;/*空表长度为0*/(*L).listsize=LIST_INIT_SIZE;/*初始存储容量*/returnOK;StatusDestroyList(SqList*L)/*初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L*/free(*L).elem);(*L).elem=NULL;(*L).length=0;(*L).listsize=0;/*bo2-1.c顺序表(存储结构由c2-1.h定义)的基本操作(12个
3、)returnOK;StatusClearList(SqList*L)/*初始条件:顺序线性表L已存在。操作结果:将L重置为空表*/(*L).length=0;returnOK;*/StatusListEmpty(SqListL)/*初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE否则返回FALSE*/if(L.length=0)returnTRUE;elsereturnFALSE;intListLength(SqListL)/*初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数*/returnL.length;StatusGetElem(SqListL,inti,
4、ElemType*e)/*初始条件:顺序线性表L已存在,1wiwListLength(L)*/*操作结果:用e返回L中第i个数据元素的值*/if(i<1|i>L.length)exit(ERROR);*e=*(L.elem+i-1);returnOK;intLocateElem(SqListL,ElemTypee,Status(*compare)(ElemType,ElemType)/*初始条件:顺序线性表L已存在,compare。是数据元素判定函数(满足为1,否则为0)*/*操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。*/*若这样的数据元素不存在,则返
5、回值为0。算法2.6*/ElemType*p;inti=1;/*i的初值为第1个元素的位序*/p=L.elem;/*p的初值为第1个元素的存储位置*/while(i<=L.length&&!compare(*p+,e)+i;if(i<=L.length)returni;elsereturn0;StatusPriorElem(SqListL,ElemTypecur_e,ElemType*pre_e)/*初始条件:顺序线性表L已存在*/*操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,*/*否则操作失败,pre_e无定义*/inti=2;
6、ElemType*p=L.elem+1;while(i<=L.length&&*p!=cur_e)p+;i+;if(i>L.length)returnINFEASIBLE;else*pre_e=*-p;returnOK;StatusNextElem(SqListL,ElemTypecur_e,ElemType*next_e)/*初始条件:顺序线性表L已存在*/*操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,*/*否则操作失败,next_e无定义*/inti=1;ElemType*p=L.elem;while(i<L.len
7、gth&&*p!=cur_e)i+;p+;Jif(i=L.length)returnINFEASIBLE;else*next_e=*+p;returnOK;StatusListInsert(SqList*L,inti,ElemTypee)/*初始条件:顺序线性表L已存在,1WiWListLength(L)+1*/*操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1*/ElemType*newbase,*q,*p;if(i<1|i>(*L).length+1)/*i值不合法*/returnERROR;if(*L).length>=(*L).lists
8、ize)/*当前存储空间已满,增加分配*/newbase=(ElemType*)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=
9、e;/*插入e*/+(*L).length;/*表长增1*/returnOK;StatusListDelete(SqList*L,inti,ElemType*e)/*初始条件:顺序线性表L已存在,1wiwListLength(L)*/*操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1*/ElemType*p,*q;if(i<1|i>(*L).length)/*i值不合法*/returnERROR;p=(*L).elem+i-1;/*p为被删除元素的位置*/*e=*p;/*被删除元素的值赋给e*/q=(*L).elem+(*L).length-1;/*表尾元素的位置*/
10、for(+p;p<=q;+p)/*被删除元素之后的元素左移*/*(p-1)=*p;(*L).length-;/*表长减1*/returnOK;StatusListTraverse(SqListL,void(*vi)(ElemType*)/*初始条件:顺序线性表L已存在*/*操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败*/*vi()的形参加'&',表明可通过调用vi()改变元素的值*/ElemType*p;inti;p=L.elem;for(i=1;i<=L.length;i+)vi(p+);printf("n&qu
11、ot;);returnOK;/*main2-1.c检验bo2-1.c的主程序*/#include"c1.h"typedefintElemType;#include"c2-1.h”#include"bo2-1.c”Statuscomp(ElemTypec1,ElemTypec2)/*数据兀素/Ute函数(平方关系)*/if(c1=c2*c2)returnTRUE;elsereturnFALSE;voidvisit(ElemType*c)/*ListTraverse()调用的函数(类型要,致)*/printf("%d",*c);voidd
12、bl(ElemType*c)/*ListTraverse()调用的另函数(兀素值加倍)*/*c*=2;voidmain()SqListL;ElemTypee,e0;Statusi;intj,k;i=InitList(&L);printf("初始化L后:L.elem=%uL.length=%dL.listsize=%dn",L.elem,L.length,L.listsize);for(j=1;j<=5;j+)i=ListInsert(&L,1,j);printf("在L的表头依次插入15后:*L.elem=");for(j=1;j&
13、lt;=5;j+)printf("%d",*(L.elem+j-1);printf("n");printf("L.elem=%uL.length=%dL.listsize=%dn",L.elem,L.length,L.listsize);i=ListEmpty(L);printf("L是否空:i=%d(1:是0:否)n",i);i=ClearList(&L);printf("清空L后:L.elem=%uL.length=%dL.listsize=%dn",L.elem,L.length,
14、L.listsize);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.elem=");for(j=1;j<=10;j+)printf("%d",*(L.elem+j-1);printf("n");printf("L.elem=%uL.length=%dL.listsize=%dn",L.elem,L.lengt
15、h,L.listsize);ListInsert(&L,1,0);printf("在L的表头插入0后:*L.elem=");for(j=1;j<=ListLength(L);j+)/*ListLength(L)为元素个数*/printf("%d",*(L.elem+j-1);printf("n");printf("L.elem=%u(有可能改变)L.length=%d(改变)L.listsize=%d(改变)n",L.elem,L.length,L.listsize);GetElem(L,5,&
16、;e);printf("第5个元素的值为:%dn",e);for(j=3;j<=4;j+)k=LocateElem(L,j,comp);if(k)printf("第个元素的值为%d的平方n",k,j);elseprintf("没有值为%d的平方的元素n",j);for(j=1;j<=2;j+)/*测试头两个数据*/GetElem(L,j,&e0);/*把第j个数据赋给e0*/i=PriorElem(L,e0,&e);/*求e0的前驱*/if(i=INFEASIBLE)printf("元素d无前驱n
17、",e0);elseprintf("元素d的前驱为:%dn",e0,e);for(j=ListLength(L)-1;j<=ListLength(L);j+)/*最后两个数据*/GetElem(L,j,&e0);/*把第j个数据赋给e0*/i=NextElem(L,e0,&e);/*求e0的后继*/if(i=INFEASIBLE)printf("元素d无后继n",e0);elseprintf("元素d的后继为:%dn",e0,e);k=ListLength(L);/*k为表长*/for(j=k+1;j>=k;j-)i=ListDelete(&L,j,&e);/*删除第j个数据*/if(i=ERROR)printf("删除第外数据失败n",j);elseprintf("删除的元素值为:dn",e);)printf("
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高铁、地铁等大型公共设施与城市发展关系研究
- 高绩效团队的特质与培养方法
- 高性能服务器在大型企业中的部署策略
- 高峰期城市交通疏导策略研究
- 高强度防水材料在地铁隧道工程中的应用研究
- 高层建筑的电气与弱电安全保障技术
- 金融机构如何运用大数据进行客户画像
- 购物中心的消防安全设计与实施
- 负面信息处理有效化解负面舆情
- 湖南省长沙市长郡集团2025年中考语文二模试卷及答案
- 学校校园膳食监督家长委员会履职承诺协议书
- 2020年1月国家开放大学汉语言文学本科《中国当代文学专题》期末纸质考试试题及答案
- 重点人口管理工作规定
- 大车司机考试试题及答案
- 高中主题班会 《珍爱生命 远离毒品》毒品预防主题班会
- 大竹县竹中中考数学试卷
- 新公司法下企业减资的税务处理探析
- 中医诊断学(浙江中医药大学)知到课后答案智慧树章节测试答案2025年春浙江中医药大学
- 现场组焊施工方案
- 教师专业发展知到智慧树章节测试课后答案2024年秋西南大学
- 龈上洁治术课件
评论
0/150
提交评论