线性表顺序存储 c语言,线性表-顺序存储结构(C语言,数组)

线性表的数据元素存储在一段连续的存储单元

优点:

​ 无须为表中元素间的关系增加额外的存储空间

​ 快速存取元素

缺点:

​ 插入删除操作会导致移动大量元素,效率低

​ 由于存储空间是连续的,所以会造成内存碎片

#include

#define OK 0

#define ERROR 1

#define MAX 5

typedef int ElemType;

typedef int Status;

struct Data {

ElemType arr[MAX];

int length;

};

// 插入位置从0开始

Status insert(struct Data *, int, ElemType);

void delete(struct Data *, int);

void printData(struct Data);

void printData(struct Data data)

{

printf("length:%d, value:", data.length);

for (int i=0; i < data.length; i++) {

printf(" %d", data.arr[i]);

}

printf("\n");

}

void delete(struct Data *data, int i)

{

int k;

// 如果表为空,直接退出

if (data->length == 0) {

printf("表为空,无需删除\n");

return;

}

// 如果删除的位置不在有效范围内则返回错误

if (i < 0 || i >=data->length) {

printf("删除失败,删除位置不是合法范围\n");

return;

}

// 如果删除的不是末尾元素,其后元素依次向左移动,同时会覆盖要删除的元素

if (i < data->length - 1) {

for (k = i; k < data->length - 1; k++) {

data->arr[k] = data->arr[k + 1];

}

} else {

data->arr[i] = 0;

}

data->length--;

}

Status insert(struct Data *data, int i, ElemType num)

{

int k;

// 如果插入位置不在有效范围内则返回错误

if (i < 0 || i > data->length) {

printf("插入失败,插入位置不是合法范围\n");

return ERROR;

}

// 表满返回错误

if (data->length == MAX) {

printf("插入失败,线性表已满\n");

return ERROR;

}

// 如果插入位置不是末尾,则向后移动其后的元素

if (i < data->length) {

for (k = data->length; k > i; k--) {

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

}

}

data->arr[i] = num;

data->length++;

printf("插入成功\n");

return OK;

}

int main(void)

{

struct Data data = {

.length = 0,

};

int i;

ElemType num;

while (1) {

printf("请输入要插入的位置:");

scanf("%d", &i);

if (i == -1) {

printf("结束插入操作\n");

break;

}

printf("请输入要插入的数值:");

scanf("%d", &num);

printf("%d %d\n", i, num);

Status status = insert(&data, i, num);

// status not used yet

printData(data);

}

while (1) {

printf("请输入要删除的位置:");

scanf("%d", &i);

if (i == -1) {

break;

}

delete(&data, i);

printData(data);

}

return OK;

}

output:

[root@8be225462e66 c]# gcc arr1.c &&./a.out

请输入要插入的位置:0

请输入要插入的数值:0

0 0

插入成功

length:1, value: 0

请输入要插入的位置:1

请输入要插入的数值:1

1 1

插入成功

length:2, value: 0 1

请输入要插入的位置:2

请输入要插入的数值:2

2 2

插入成功

length:3, value: 0 1 2

请输入要插入的位置:1

请输入要插入的数值:11

1 11

插入成功

length:4, value: 0 11 1 2

请输入要插入的位置:33 33

请输入要插入的数值:33 33

插入失败,插入位置不是合法范围

length:4, value: 0 11 1 2

请输入要插入的位置:3 22

请输入要插入的数值:3 22

插入成功

length:5, value: 0 11 1 22 2

请输入要插入的位置:1

请输入要插入的数值:1

1 1

插入失败,线性表已满

length:5, value: 0 11 1 22 2

请输入要插入的位置:-1

结束插入操作

请输入要删除的位置:4

length:4, value: 0 11 1 22

请输入要删除的位置:0

length:3, value: 11 1 22

请输入要删除的位置:1

length:2, value: 11 22

请输入要删除的位置:11

删除失败,删除位置不是合法范围

length:2, value: 11 22

请输入要删除的位置:1

length:1, value: 11

请输入要删除的位置:0

length:0, value:

请输入要删除的位置:1

表为空,无需删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值