数据结构与算法

1.顺序表

        1.插入

在顺序表(SeqList)中,lastlength 通常表示同一个信息的不同方面。具体来说:

  1. length:表示顺序表中当前有效元素的数量。
  2. last:表示最后一个有效元素的索引。

两者之间的关系如下:

  • 初始化时

    • length = 0
    • last = -1 (表示没有元素)
  • 添加元素时

    • 每次添加一个元素,length 增加 1。
    • 每次添加一个元素,last 增加 1。

因此,对于一个有效的顺序表 SeqListlastlength 之间的关系可以表示为:

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 函数后:

  1. 第一次调用 append 后:

    • L->length = 1
    • L->last = 0
  2. 第二次调用 append 后:

    • L->length = 2
    • L->last = 1
  3. 第三次调用 append 后:

    • L->length = 3
    • L->last = 2

插入操作的影响

在插入操作中,lastlength 的关系仍然保持不变。例如,如果我们要在第 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值