线性表的数据元素存储在一段连续的存储单元
优点:
无须为表中元素间的关系增加额外的存储空间
快速存取元素
缺点:
插入删除操作会导致移动大量元素,效率低
由于存储空间是连续的,所以会造成内存碎片
#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
表为空,无需删除