1.顺序表
1.插入
在顺序表(SeqList
)中,last
和 length
通常表示同一个信息的不同方面。具体来说:
length
:表示顺序表中当前有效元素的数量。last
:表示最后一个有效元素的索引。
两者之间的关系如下:
-
初始化时:
length = 0
last = -1
(表示没有元素)
-
添加元素时:
- 每次添加一个元素,
length
增加 1。 - 每次添加一个元素,
last
增加 1。
- 每次添加一个元素,
因此,对于一个有效的顺序表 SeqList
,last
和 length
之间的关系可以表示为:
last=length−1
示例
假设有一个 SeqList
对象 L
,初始状态如下:
C
SeqList L;
init(&L); // 初始化顺序表
此时:
L->length = 0
L->last = -1
接下来,向顺序表中添加一些元素:
append(&L, 88);
append(&L, 99);
append(&L, 100);
每次调用 append
函数后:
-
第一次调用
append
后:L->length = 1
L->last = 0
-
第二次调用
append
后:L->length = 2
L->last = 1
-
第三次调用
append
后:L->length = 3
L->last = 2
插入操作的影响
在插入操作中,last
和 length
的关系仍然保持不变。例如,如果我们要在第 i
个元素之前插入一个新元素 e
:
insert(&L, 2, 111); // 在第 2 个元素之前插入 111
插入操作后:
L->length
增加 1。L->last
增加 1。
因此:
- 插入后
L->length
变为4
。 - 插入后
L->last
变为3
。
#include <stdio.h>
#define MAX_SIZE 10
typedef int ElemType;
typedef struct {
ElemType array[MAX_SIZE]; // 静态数组
int length; // 当前元素长度
int last;
} SeqList;
void init(SeqList* L) {
L->length = 0; // 将元素计数器初始化为0
}
void append(SeqList* L, ElemType e) {
if (L->length >=MAX_SIZE)
{
printf("list full ,append error\n");
return 0;
}
L->array[L->length] = e;
L->length++;
return 1;
}
void traverse(SeqList* L) {
for (int i = 0; i < L->length; i++) {
printf("%d ", L->array[i]);
}
printf("\n");
}
int insert(SeqList* L, int i, ElemType e) {
if (i < 1 || i > L->length) {
printf("Invalid index %d\n", i);
return 0;
}
if (L->length >= MAX_SIZE) {
printf("list full, insert error\n");
return 0;
}
// 将 i 位置及之后的所有元素向后移动一位
for (int j = L->length-1; j >= i - 1; j--) {
L->array[j + 1] = L->array[j];
}
// 在第 i 个位置插入新元素
L->array[i - 1] = e;
L->length++;
return 1;
}
int remove (SeqList* L, int i,ElemType* e ) {
if (L->length == 0)
{
printf("The list is empty.\n");
return 0;
}
if (i < 1 || i > L->length) {
printf("Invalid index %d\n", i);
return 0;
}
// 获取要删除的元素值 第i个元素的索引是i-1
*e = L->array[i - 1];
// 将 i 位置之后的所有元素向前移动一位
for (int j = i; j < L->length - 1; j++) {
L->array[j - 1] = L->array[j];
}
// 更新 length
L->length--;
return 1;
}
int main() {
SeqList L;
init(&L); // 注意这里需要使用&符号来获取list的地址
// 添加一些元素到顺序表
append(&L, 88);
append(&L, 99);
append(&L, 100);
// 遍历顺序表并打印所有元素
traverse(&L);
// 在第 2 个元素之前插入 111
insert(&L, 2, 111);
// 再次遍历顺序表并打印所有元素
traverse(&L);
// 删除第 2 个元素
ElemType removedElement;
if (remove(&L, 2, &removedElement)) {
printf("Removed element: %d\n", removedElement);
}
// 最后再次遍历顺序表并打印所有元素
traverse(&L);
return 0;
}