线性表的顺序存储结构,建立,获取,插入,删除
线性表是最基础的数据结构,针对线性表有很多操作。一起来了解一下吧!如有不足和错误,烦大佬帮忙指出。
线性表的简单介绍
1.线性表是什么
线性表是零个或多个数据元素的有限序列
2.为什么会有零个
在对线性表进行一系列操作时我们都要考虑空表的情况,再加上一般一个好的代码必须要考虑所有可能出现的情况
3.为什么是有限序列
计算机中的数据元素都是有限的。
4.线性表的分类
线性表的顺序存储结构也被叫做顺序表
关于链式存储结构也就是我们叫做的单链表,下次会对单链表进行说明。接下来是对顺序存储结构的介绍。
线性表顺序存储结构介绍及操作
线性表的顺序存储结构是什么
线性表的顺序存储结构是将零个或多个数据元素依次存储在一个连续的存储单元内。我们会联想到数组,对就是用数组来实现的。
强调
线性表的数据元素从1开始;而数组的成员从0开始。
初始操作
#define MAXSIZE 20 //分配数组的存储空间长度
#define OK 1 //操作成功则OK
#define ERROR 0 //操作错误则ERROR
typedef int elemtype;
typedef int Status;
typedef struct
{
elemtype date[MAXSIZE]; //数组存储数据元素,最大值位MAXSIZE
int length; //线性表的长度
}Sqlist; //建立线性表结构体
针对顺序存储结构的操作
Status Creatlist(Sqlist *list) //建立一个顺序表
Status Getelem(Sqlist list,int i,int *e) //获得顺序表中一个位序的数据元素
Status ListDelete(Sqlist *list,int i,int *e)//删除顺序表中一个位序的数据元素
Status ListInsert(Sqlist *list,int i,int e) //插入一个数据元素到顺序表的一个位序
Status Printlist(Sqlist *list) //打印顺序表
获得数据元素
Status Getelem(Sqlist list,int i,elemtype *e) //获得线性表中一个位序(i)的数据元素,并用e来返回该值
{
if(list.length<0||i<1||i>list.length) //不符合线性表的情况
return ERROR;
*e=list.date[i-1]; //返回该值给e
return OK;
}
删除数据元素
Status ListDelete(Sqlist *list,int i,elemtype *e) //删除线性表一个位序(i)的数据元素,并用e来返回该值
{
int k; //k值来从位序i来遍历线性表
if(i>MAXSIZE)
return ERROR;
if(i<1||i>list->length)
return ERROR;
*e=list->date[i-1]; //返回位序为i的值
for(k=i-1;k<list->length-1;k++) //从i-1开始遍历线性表
list->date[k]=list->date[k+1]; //将删除位置后继元素前移一位
list->length--; //线性表长度减1
return OK;
}
插入数据元素
Status ListInsert(Sqlist *list,int i,elemtype e) //插入一个数据元素到位序(i),e是插入的值
{
int k; //k来逆序遍历线性表
if(i>MAXSIZE)
return ERROR;
if(i<1||i>list->length+1)
return ERROR;
if(i==list->length+1) //如果插入元素在最后一个位序
{
list->date[i-1]=e;
list->length++;
return OK;
}
for(k=list->length-1;k>i-2;k--) //插入元素不在最后以为
list->date[k+1]=list->date[k]; //将后继元素向后移位
list->date[i-1]=e; //将e赋值给位序为date[i-1]
list->length++; //线性表长度加1
return OK;
}
总结
完整代码如下
#include"stdio.h"
#define MAXSIZE 20 //分配数组的存储空间长度
#define OK 1 //操作成功则OK
#define ERROR 0 //操作错误则ERROR
typedef int elemtype;
typedef int Status;
typedef struct
{
elemtype date[MAXSIZE]; //数组存储数据元素,最大值位MAXSIZE
int length; //线性表的长度
}Sqlist; //建立线性表结构体
Status Creatlist(Sqlist *list)
{
int i;
printf("请输入该线性表的长度: ");
scanf("%d",&list->length);
if(list->length>MAXSIZE)
return ERROR;
printf("请输入线性表所包含的元素: ");
for(i=0;i<list->length;i++)
scanf("%d",&list->date[i]);
return OK;
}
Status Printlist(Sqlist *list)
{
int i;
printf("此时线性表为 ");
for(i=0;i<list->length;i++)
printf(" %d",list->date[i]);
printf("\n");
return OK;
}
Status Getelem(Sqlist list,int i,elemtype *e) //获得线性表中一个位序(i)的数据元素,并用e来返回该值
{
if(list.length<0||i<1||i>list.length) //不符合线性表的情况
return ERROR;
*e=list.date[i-1]; //返回该值给e
return OK;
}
Status ListInsert(Sqlist *list,int i,elemtype e) //插入一个数据元素到位序(i),e是插入的值
{
int k; //k来逆序遍历线性表
if(i>MAXSIZE)
return ERROR;
if(i<1||i>list->length+1)
return ERROR;
if(i==list->length+1) //如果插入元素在最后一个位序
{
list->date[i-1]=e;
list->length++;
return OK;
}
for(k=list->length-1;k>i-2;k--) //插入元素不在最后以为
list->date[k+1]=list->date[k]; //将后继元素向后移位
list->date[i-1]=e; //将e赋值给位序为date[i-1]
list->length++; //线性表长度加1
return OK;
}
Status ListDelete(Sqlist *list,int i,elemtype *e) //删除线性表一个位序(i)的数据元素,并用e来返回该值
{
int k; //k值来从位序i来遍历线性表
if(i>MAXSIZE)
return ERROR;
if(i<1||i>list->length)
return ERROR;
*e=list->date[i-1]; //返回位序为i的值
for(k=i-1;k<list->length-1;k++) //从i-1开始遍历线性表
list->date[k]=list->date[k+1]; //将删除位置后继元素前移一位
list->length--; //线性表长度减1
return OK;
}
int main()
{
int i,e;
Sqlist mylist;
Creatlist(&mylist);
Printlist(&mylist);
printf("请输入想要获得线性表中数据的位序");
scanf("%d",&i);
Getelem(mylist,i,&e);
printf("%d\n",e);
printf("请输入你想插入数据的位序和数字");
scanf("%d%d",&i,&e);
ListInsert(&mylist,i,e);
Printlist(&mylist);
printf("请输入删除获得线性表中数据的位序");
scanf("%d",&i);
ListDelete(&mylist,i,&e);
printf("%d\n",e);
Printlist(&mylist);
return 0;
}
以上就是线性表顺序存储结构的全部内容。小白写代码,有不足请大家指出😆。