数据结构线性表(一)之顺序存储结构思路

本文详细介绍了线性表的顺序存储方式,包括利用数组实现的顺序存储结构、线性表与数组的区别、获取元素、插入及删除操作的实现代码,并分析了顺序存储结构的局限性。

一:顺序存储,利用数组来实现顺序存储的.

注:线性表长度是线性表数据元素的个数,所以恒小于或等于数组长度

二:顺序存储结构代码

#define maxsize 20
typedef int ElemType;//
typedef struct  //具体typedef用法见博客
{
ElemType data[maxsize]; 
int length;  //线性表当前长度
}SqList;

三:推算线性表的存储位置

LOC(ai+1)=LOC(ai)+c //LOC是获得该位置的函数,c指该变量占的存储单元

==>LOC(ai)=LOC(a1)+(i-1)*c

四:线性表与数组区别

线性表定义从1开始而数组从0开始,所以线性表的i位置就是数组i-1的位置

五:线性表获取元素操作

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status
/*status是函数类型,其值是函数结果状态代码,如ok等*/
i>=1&&i<=ListLength
操作结果:用e返回L中第i个数据元素的值
Status GetElem(SqList L,int i,ElemType *e)  //L为结构体变量
{
if(L.length==0||i<1||i>L.length)
return ERROR; //return了之后就退出了
*e=L.data[i-1];
return ok;
}

六:顺序存储结构插入操作

思路:1.插入位置是否合理

            2.数组和线性表长度问题

            3.表长加1

一个元素插入到线性表i位置

操作结构

Status ListInsert(SqList *L,int i,ElemType e)
{
int k;
if(L->length==maxsize)
return ERROR;
if(i<1||i>L->length+1)
return ERROR;
if(i<=L->length)
{
for(k=L->length-1;k>=i-1;k--) //将数组i-1位置之后元素向后移1
L->data[k+1]=L->data[k];
}
L->data[i-1]=e;  //插入数据
L->length++; //表长加1
return OK;
}

七.顺序存储结构删除操作

思路:1.删除位置是否合理

            2.取出删除数据元素

            3.从删除元素位置开始遍历到最后一个元素分别向前移动1个位置

            4.表长减1

删除线性表i位置的数据元素

Status ListDelete(SqList *L,int i,ElemType *e)
{
int k;
if(L->length==0)
return ERROR;
if(i<1||i>L->length)
return ERROR;
*e=L->data[i-1]; //删除
if(i<L->length) //如果删除不是最后位置
{
for(k=i;k<L->length;k++) //将数组i-1位置之后元素向前移一个位置
L->data[k-1]=L->data[k];
}
L->length--; //表长减1
return OK;
}

八.线性表顺序存储结构缺点:

1.插入和删除操作需要移动大量元素

2.当线性表长度变化大时,难以确定存储空间的容量(数组大小)

3.造成存储空间的“碎片”








评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值