线性表顺序表示和实现(C语言)(二)

简介: 线性表顺序表示和实现(C语言)(二)

运行结果演示:


为了方便演示,在这里线性表一次赋值为1,2,3,4,5

构建一个空线性表

image.png

赋值操作

image.png

判断此时的线性表是否为空

image.png

获取线性表的长度

image.png

获取2号位置的元素

image.png

在3号位置插入520并打印线性表

image.png

image.png

删除3号位置的520并打印线性表

image.png

image.png

求3号位置的前驱和后继

image.png

image.png

以上便是线性表顺序表示和实现,由于高级程序设计语言中的数组类型也有随机存取的特性,因此,通常用数组来描述数据结构中的顺序存储结构。在这种结构中,很容易实现线性表的某些操作,但是需要特别注意的是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;
}
相关文章
|
7月前
|
存储 C语言
C语言线性表的链式表示和实现讲解
C语言线性表的链式表示和实现讲解
44 0
数据结构入门(C语言版)线性表中顺序表介绍及接口实现(下)
在顺序表中,头插相对于尾插来说就不是那么简单了,这里主要是让顺序表整体向后移动,再在头部插入数据。
|
7月前
|
存储 C语言 索引
C语言线性表的顺序表示和实现讲解
C语言线性表的顺序表示和实现讲解
39 0
|
存储 C语言
数据结构 C语言 2.1 线性表抽象数据类型 2.2 小议顺序表
数据结构 C语言 2.1 线性表抽象数据类型 2.2 小议顺序表
51 0
|
存储 缓存
数据结构入门(C语言版)线性表带头双向循环链表接口实现(下)
这里的查找就是使用一个while循环遍历链表找到某节点的data符合要查找的值
数据结构入门(C语言版)线性表带头双向循环链表接口实现(上)
第一步当然是先使用malloc函数申请内存空间,然后就是两个指针的建立,尾部指针指向头结点头部,头部指针指向头结点尾部,返回带头结点,头结点初始化完成。
|
存储 程序员 C语言
数据结构入门(C语言版)线性表中链表介绍及无头单向非循环链表接口实现
概念: 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素。因此,为了表示每个数据元素与其直接后继数据元素之间的逻辑关系,对数据元素来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。
|
存储 机器学习/深度学习 算法
数据结构入门(C语言版)线性表中顺序表介绍及接口实现(上)
不论在程序员的工作上,还是在学习或是考研上,数据结构都是一门非常重要且值得我们一直研究探索的学科,可以说数据结构和算法就是编程的核心。OK,接下来我们来到数据结构的入门第一步就是学习线性表,接下来由作者来详细介绍数据结构第一章线性表。
|
存储 C语言
线性表之顺序表(C语言实现)
线性表之顺序表(C语言实现)
134 0
|
存储 算法 C语言
C语言算法之线性表查找
C语言算法之线性表查找
211 0