线性顺序表c语言,数据结构学习笔记——线性表之顺序表(c语言实现)

1.概念

顺序表即线性表的顺序存储结构 ,指的是用一段地址连续的存储单元依次存储线性表数据元素。在线性表中,每个数据元素的类型都相同,一般可以用一维数组来实现顺序存储结构。

4ea34b0c2a1a5de31a7387dd8d63f5f5.png

2.实现

完整代码下载地址 https://download.youkuaiyun.com/download/luotuoxiansheng/10746233

(1)建立顺序表的结构

利用c语言结构体来建立顺序表的结构,顺序表结构体中包含数据和表长。

#define MAXSIZE 10 //存储空间初始分配量

typedef int ElemType; //定义类型,此处为int(可变)

typedef int Status;

typedef struct

{

ElemType data[MAXSIZE];//创建数组存储空间

int length; //线性表当前长度

}sqlist;

(2)初始化表单

初始化一个n长度的顺序表并打印,表单数据初始化为1~n,n为函数形参InitLength。

1

2

3

4

5

n

示例代码:

void sqlistInit(sqlist *sl,int InitLength)

{

int j;

sl->length=0;

printf("当前表单:");

for(j=0;jdata[j]=j+1;

printf("%d ",sl->data[j]);

++sl->length;

}

printf("\n初始表单长度:%d\n",sl->length);

}

结果演示:

21a5c8f312df00013d57de01561caad4.png

f8dd29155dd910c2abdd10655dcc9637.png

(3)增:在表中第i个位置增加数据e

fbc0e3aaa3cef75d2406310a046cba79.png

示例代码:

Status sqlistInsert(sqlist *L,int i,ElemType e)

{

int k;

if(L->length==MAXSIZE)//表已满

{

printf("表已满!\n");

return error;

}

if(i<1||i>L->length+1)//i不在范围内

{

printf("插入位置不在表单范围内!\r\n\n");

return error;

}

if(ilength+1)//插入数据不在表尾

{

for(k=L->length;k>=i;k--)//插入位置后数据元素依次向后移动一位

L->data[k]=L->data[k-1];

}

L->data[i-1]=e;//插入新元素

L->length++;

return ok;

}

结果演示:

在任意位置插入数字:

e9ee60cd9404be258e5ca3daa07bbc1e.png

也可以在头部和尾部插入:

609be3ec139565a7786b938ddc07b789.png

(4)删:删除表中第i个位置数据

要删除第i个数据,即将i位置后数据依次左移,表长减一

fe80c90baf81770ed9fda1a218a18db1.png

示例代码:

Status sqlistDelete(sqlist *L,int i)

{

int k;

if(L->length==0)//空表

{

printf("无删除对象,这是一个空表!\n");

return error;

}

if(i<1||i>L->length)//i不在范围内

{

printf("找不到该删除对象!\r\n\n");

return error;

}

for(k=i;klength;k++)//第i个位置后数据依次左移

L->data[k-1]=L->data[k];

L->length--;

return ok;

}

结果演示:

删除第三个数字

53d74994c5f0bbb7911cd62d898c72a2.png

(5)改:改变表中第i个位置数据

6554374c33aa32d0d0fa4c27b54b27c5.png

示例代码:

Status sqlistChange(sqlist *L,int i,ElemType e)

{

int k;

if(L->length==0)//空表

{

printf("无改变对象,这是一个空表!\n");

return error;

}

if(i<1||i>L->length)//i不在范围内

{

printf("找不到该对象!\r\n\n");

return error;

}

L->data[i-1]=e;//改变数值

return ok;

}

5b5e323e4ed51c89b82591bc933c0e01.png

(6)查:查找表中第i个位置数据,并返回该值

第i个数据即为元素da[i-1],在表单范围内返回该值即可

示例代码:

Status sqlistLocate(sqlist *L,int i)

{

int k;

if(L->length==0)//空表

{

printf("这是一个空表!\n");

return error;

}

if(i<1||i>L->length)//i不在范围内

{

printf("找不到该对象!\r\n\n");

return error;

}

return L->data[i-1];

}

结果演示:

4af1e738654200fd42f70114746e72e7.png

(7)其他

此外还设计了打印表单,清零表单,重置表单等操作,详见完整代码

https://download.youkuaiyun.com/download/luotuoxiansheng/10746233

3.优劣势分析

优点

缺点

不需要为表中元素之间的逻辑关系而增加额外的存储空间

可以快速地存取表中任意位置的元素

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

当线性表长度变化较大时,难以确定存储空间的容量

造成存储空间的“碎片”及浪费

以上就是对顺序存储结构的线性表的学习及分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值