线性表的顺序存储结构
Posted kangna
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表的顺序存储结构相关的知识,希望对你有一定的参考价值。
首先让我们来认识顺序表
在顺序存储结构中,以数据元素的长度为单位,所以每个元素之间的距离为L。
在顺序存储结构中,数据的存储位置和它们的物理位置一致,因此较为简单、自然
使用C语言描述顺序存储结构下的线性表代码如下:
#define MAXSIZE 100 //线性表的最大长度
typedef struct Linear_list
{
datatype elem[MAXSIZE]; //定义数组域
int last; //最后一个元素在表中的位置
}SeqList;
需要注意的有以下问题
(1)数组的长度和线性表的长度不是一个概念。数组的长度是存放线性表的存储空间的长度,线性表的长度是线性表中数据元素的个数,它随着插入、删除等操作会发生变化,而数组的长度一开始就被定义且不可改变。
(2)线性表的当前长度:由于last表示最后一个元素1在表中的位置,而且元素是从0开始,所以当前长度为last+1。
(3)线性表的最大容量为一开始为线性表分配的MAXSIZE决定,后序不可更改。
(4)elem[]即用来存储数据的数组。
在C语言中,为了发挥指针的优势,我们可以定义一个指向SeqList类型的指针,即:
SeqList *Lp;
Lp是一个指针变量,存储空间通过C Lp=(SeqList*)malloc(sizeof(SeqList))
来获得。Lp是存放的顺序表的地址
##顺序表的插入、删除、求表长等操作
1、在某一位置(如i)插入元素之后:
(1)将ai~an一直向下移动,为新元素让出位置
(2)将x置入空出的位置
(3)修改Last指针使其总指向最后一个元素
此处的逻辑关系应当很容易理解,博主在这里就不上流程图了
代码如下:
int InsertList(SeqList *Lp,int i,datatype x) //分别是表、插入的位置(在...之前)、插入的值
{
int j;
if(Lp->last==MAXSIZE) //空间已满,无法继续存入元素了
{
printf("内存已满,无法继续存入");
return(-1);
}
if(i<1||i>Lp->last+2)
{
printf("位置错误,不能进行该操作哦"
);
return(0);
}
for(j=Lp->last;j>=i-1;j--)
{
Lp->elem[j+1]=Lp->elem[j]; //往后移动
Lp->elem[i-1]=x; //插入元素
Lp->last++; //使Lp->last指向最后一个元素
return(1);
}
2、删除某个元素
在删除线性表之后,长度为n线性表的长度会变为n-1;
(1)将ai+1~an顺序向上移动
(2)修改Lp-last指针,使其总指向最后一个元素
此处也比较简单,就不像后序非递归遍历二叉树那样上了流程图了,代码如下
int DeleteList(SeqList *Lp,int i)
{
int j;
if(i<1||i>Lp->last+1) //判断输入数据的合法性
{
printf("不存在第%d个元素哦
",i);
return 0;
}
for(j=i;j<=Lp->last,j++)
Lp->elem[j-1]=Lp-elem[j]; //向上移动
Lp->last--;
return(1);
}
2、求表长
这里没什么好说的我们定义了Lp->last总指向最后一个元素,所以表长不言而喻了
ex:创建一个递增顺序表并实现顺序表的基本功能
代码如下:
#include<stdio.h>
#define M 100 //数组长度
typedef int ElemType;
typedef struct //定义线性表
{
ElemType list[M];
int last; //指向末尾的last元素
}SeqList;
void InitList(SeqList *L) //创建空表
{
L->last=-1; //初始化last元素
}
void Scanflist(SeqList *L,int n) //输入递增的有序顺序表
{
int i;
for(i=0;i<n;i++)
scanf("%d",&(L->list[i]));
L->last=L->last+n;
}
int LengthList(SeqList *L)
{
int Len; //初始化一个len值,用于记录列表长度
Len=L->last+1; //长度==last+1 last初始值为-1
return Len;
}
int PositionList(SeqList *L,int x) //判断插入位置
{
int j;
for(j=0;j<=L->last;j++)
if(x<L->list[j]) //如果找到位置就返回地址
return j+1; //下标j表示j+1个元素,所以返回j+1
return(L->last+2); //插入位置合法,所以可以添加元素,所以线性表长度+1,即last+2
}
int InsertList(SeqList *L,int i,int e)
{
int k;
if((i<1)||(i>L->last+2))
{
printf("您的输入有误");
return 0;
}
if(L->last>=M-1)
{
printf("该表已满,无法再添加数据");
return 0;
}
for(k=L->last;k>=i-1;k--)
L->list[k+1]=L->list[k];
L->list[i-1]=e;
L->last++;
return(1);
}
int OutputList(SeqList *L)
{
int i;
printf("输出结果为:");
for(i=0;i<=L->last;i++)
printf("%d",L->list[i]);
return(L->list[i]);
}
int main()
{
int s,c;
SeqList L;
InitList(&L);
printf("请输入顺序表长度:");
scanf("%d",&s);
printf("请输入递增顺序表:");
Scanflist(&L,s);
LengthList(&L);
printf("表长为:%d
",LengthList(&L));
printf("请输入要插入的元素:");
scanf("%d",&c);
InsertList(&L,PositionList(&L,c),c);
OutputList(&L);
printf("
");
}
以上是关于线性表的顺序存储结构的主要内容,如果未能解决你的问题,请参考以下文章