运行结果演示:
为了方便演示,在这里线性表一次赋值为1,2,3,4,5
构建一个空线性表
赋值操作
判断此时的线性表是否为空
获取线性表的长度
获取2号位置的元素
在3号位置插入520并打印线性表
删除3号位置的520并打印线性表
求3号位置的前驱和后继
以上便是线性表顺序表示和实现,由于高级程序设计语言中的数组类型也有随机存取的特性,因此,通常用数组来描述数据结构中的顺序存储结构。在这种结构中,很容易实现线性表的某些操作,但是需要特别注意的是C语言的数组下标是从“0”开始。
源码:
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<windows.h>//函数结果状态代码 #defineTRUE1//代码中出现TRUE相当于出现了1 #defineFALSE0//出现FALSE相当于出现了0 #defineOK1//出现OK相当于出现了1 #defineERROR0//出现ERROR相当于出现了0 #defineINFEASIBLE-1#defineOVERFLOW-2typedefintStatus; typedefintElemType; #defineLIST_INIT_SIZE100//线性表存储空间的初始分配量 #defineLISTINCREMENT10//线性表存储空间的分配增量 typedefstruct{ ElemType*elem; //存储空间的基址 intlength; //当前线性表的长度intlistsize; //当前线性表的存储容量 }SqList; //构造一个空的线性表StatusInitList_Sq(SqList&L){ L.elem= (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //L.elem为首元素的地址 if(!L.elem){ //如果存储空间分配失败,L.elem为NULLprintf("存储空间分配失败\n"); exit(OVERFLOW); } L.length=0; //当前线性表为空表,即线性表长度为0L.listsize=LIST_INIT_SIZE; //给线性表分配初始容量printf("一个空的线性表已经构建成功\n"); //输出空线性表构建成功的提示消息 returnOK; } //对线性表进行赋值StatusValueList_Sq(SqList&L){ inti,j; printf("请输入线性表元素的个数:"); scanf("%d",&i); if(i>L.listsize) //如果当要输入的元素个数大于内存大小时 { while(1) //一直开辟新空间,直到开辟的空间大于需要的空间为止 { if(i>L.listsize){ L.elem= (ElemType*)realloc(L.elem,LISTINCREMENT*sizeof(ElemType)); L.listsize+=LISTINCREMENT; /*realloc()函数:重新分配空间 参数:原空间基址,现需空间大小 返回:1.成功:新空间地址(本质上是一个数值) 2.失败:Null */ } elsebreak; } } for(j=0;j<i;j++){ printf("请输入第%d个元素:",j+1); scanf("%d",&L.elem[j]); } L.length=i; //赋值完成后,修改并保存线性表的长度 printf("赋值成功\n"); returnOK; } //对线性表进行销毁StatusDistoryList_Sq(SqList&L){ if(!L.elem){ printf("您还未建立线性表,请先建立线性表\n"); returnERROR; } free(L.elem); //使用free函数,将之前动态分配的内存还给系统 L.elem=NULL; //重置elem的值为Null L.length=0; //将线性表的元素个数重置为0L.listsize=0; //将线性表的存储容量重置为0 printf("线性表已经销毁\n"); returnOK; } //对线性表进行重置StatusClearList_Sq(SqList&L){ if(L.elem){ //如果线性表存在 L.length=0; //将线性表的元素个数重置为0printf("线性表已重置\n"); returnOK; } elseprintf("线性表不存在,无法重置\n"); returnOK; } //判断线性表是否为空StatusListEmpty_Sq(SqListL){ if(L.elem){ //判断线性表是否为空的前提是线性表存在,当首元素地址即L.elem存在时说明线性表存在 if(L.length!=0){ //如果线性表中元素为0,即L.length的值为0时说明线性表是空表 printf("线性表不是空表\n"); returnFALSE; } elseprintf("线性表是空表\n"); returnTRUE; } elseprintf("线性表不存在,无法判断\n"); returnOK; } //获取线性表的长度StatusListLength_Sq(SqListL){ if(L.elem){ //判断当前线性表存在 intK; K=L.length; //将线性表的元素个数赋值给Kprintf("线性表长度为%d\n",K); returnOK; } elseprintf("线性表不存在,无法判断\n"); returnOK; } //获取线性表某一位置对应的元素StatusGetElem_Sq(SqListL,intindex){ intNum; if(index<=0||index>L.length){ //如果要获取元素的位置是否出界 printf("请输入一个有效的数字\n"); returnERROR; } elseNum=L.elem[index-1]; printf("第%d个位置的元素为:%d\n",index,Num); returnOK; } //在线性表某一位置插入元素StatusListInsert_Sq(SqList&L,inti,ElemTypee){ ElemType*newbase; int*q,*p; if(i<1||i>L.length+1) //判断插入位置的index值是否合法 returnERROR; if(L.length>=L.listsize){ //如果当前线性表存储空间已满,增加分配 newbase= (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase) { //如果存储空间分配失败,则执行异常退出 printf("存储空间分配失败\n"); exit(OVERFLOW); } L.elem=newbase; //新的存储空间基址 L.listsize+=LISTINCREMENT; } q=&(L.elem[i-1]); //L.elem[index-1]为数组中的最后一个元素,q为要插入的位置 for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1) =*p; //要插入位置以及之后的位置向后移 *q=e; //将e插入到想要插入的位置 ++L.length; //插入新的元素之后表长加1 printf("元素插入成功\n"); returnOK; } //打印线性表StatusPrintList_Sq(SqListL){ printf("当前线性表的元素为:"); for(intK=0;K<L.length;K++) //遍历当前线性表 printf(" %d",L.elem[K]); printf("\n"); //换行 returnOK; } //删除线性表某一位置的元素StatusDeleteList_Sq(SqList&L,inti){ int*p,*q; if(i<1||i>L.length){ //如果要删除的位置不合法printf("请输入一个有效数字\n"); returnERROR; } p=&(L.elem[i-1]); //p为被删除元素的位置q=L.elem+L.length-1; //将表尾元素的位置赋值给qfor(++p;p<=q;p++) *(p-1) =*p; //被删除的元素之后的元素全部左移 --L.length; //表长减1 printf("第%d个元素删除成功\n",i); returnOK; } //求线性表某一元素的前驱StatusPriorElem_Sq(SqListL,inti){ intK; if(L.elem){ //判断线性表是否为空的前提是线性表存在,当首元素地址即L.elem存在时说明线性表存在if(i<=1||i>L.length+1) //判断输入的i值是否合法 printf("请输入一个有效数字\n"); K=L.elem[i-2]; //将第i个元素的前一个元素赋值给Kprintf("第%d个位置的直接前驱为:%d\n",i,K); } elseprintf("线性表不存在,无法判断\n"); returnOK; } //求线性表某一元素的后继 StatusNextElem_Sq(SqListL,inti){ intK; if(L.elem){ //判断线性表是否为空的前提是线性表存在,当首元素地址即L.elem存在时说明线性表存在if(i<=1||i>L.length-1) //判断输入的i值是否合法 printf("请输入一个有效数字\n"); K=L.elem[i]; //将第i个元素的后一个元素赋值给Kprintf("第%d个位置的直接后继为:%d\n",i,K); } elseprintf("线性表不存在,无法判断\n"); returnOK; } intmain(){ SetConsoleTitle("Dream_飞翔"); SqListL; intchoose,index,e; while(1){ printf("*****************************************\n"); printf("* *\n"); printf("* 线性表的顺序表示和实现: *\n"); printf("* *\n"); printf("* 1. 构造一个空的线性表 *\n"); printf("* 2. 对线性表进行赋值 *\n"); printf("* 3. 对线性表进行销毁 *\n"); printf("* 4. 对线性表进行重置 *\n"); printf("* 5. 判断线性表是否为空 *\n"); printf("* 6. 获取线性表的长度 *\n"); printf("* 7. 获取线性表某一位置对应的元素 *\n"); printf("* 8. 在线性表某一位置插入元素 *\n"); printf("* 9. 删除线性表某一位置的元素 *\n"); printf("* 10. 求线性表某一元素的前驱 *\n"); printf("* 11. 求线性表某一元素的后继 *\n"); printf("* 12. 打印线性表 *\n"); printf("* 13. 退出 *\n"); printf("* *\n"); printf("*****************************************\n"); printf("请做出您的选择:"); scanf("%d",&choose); switch(choose){ case1:InitList_Sq(L);break; case2:ValueList_Sq(L);break; case3:DistoryList_Sq(L);break; case4:ClearList_Sq(L);break; case5:ListEmpty_Sq(L);break; case6:ListLength_Sq(L);break; case7:{ printf("请输入要获取元素的位置:"); scanf("%d",&index); GetElem_Sq(L,index); } break; case8:{ printf("请输入要插入元素的位置:"); scanf("%d",&index); printf("请输入要插入的元素:"); scanf("%d",&e); ListInsert_Sq(L,index,e); } break; case9:{ printf("请输入要删除元素的位置:"); scanf("%d",&index); DeleteList_Sq(L,index); } break; case10:{ printf("请输入想要查找哪一个元素的前驱:"); scanf("%d",&index); PriorElem_Sq(L,index); } break; case11:{ printf("请输入想要查找哪一个元素的后继:"); scanf("%d",&index); NextElem_Sq(L,index); } break; case12:PrintList_Sq(L);break; case13:exit(0); } } return0; }