编辑代码

#include <stdio.h>
#include <stdlib.h> 
#define InitMaxSize 10  // 初始最大容量

// 动态顺序表结构体定义
typedef struct {
    int *data;       // 存储数据的动态数组
    int MaxSize;     // 顺序表最大容量
    int length;      // 顺序表现有元素个数
} SeqList;

// 初始化顺序表
void InitList(SeqList *L) {
    // 动态分配初始内存
    L->data = (int *)malloc(InitMaxSize * sizeof(int)); 
    L->MaxSize = InitMaxSize;  // 初始化最大容量
    L->length = 0;             // 初始化元素个数为 0
}

// 增加顺序表容量(扩容函数)
void IncreaseSize(SeqList *L, int newSize) {
    if (newSize <= L->MaxSize) return;  // 新容量不大于原容量,无需扩容
    // 开辟新内存空间
    int *newData = (int *)malloc(newSize * sizeof(int)); 
    for (int i = 0; i < L->length; i++) {
        newData[i] = L->data[i];  // 原数据拷贝到新空间
    }
    free(L->data);  // 释放原内存
    L->data = newData;  // 指向新内存
    L->MaxSize = newSize;  // 更新最大容量
}

// 插入元素:在第 pos 个位置插入值为 val 的元素(pos 从 1 开始)
int Insert(SeqList *L, int pos, int val) {
    // 检查插入位置合法性 & 顺序表是否已满
    if (pos < 1 || pos > L->length + 1) return 0; 
    if (L->length >= L->MaxSize) {
        // 容量不足时扩容(这里简单扩容为原容量 + 5,可按需调整策略)
        IncreaseSize(L, L->MaxSize + 5); 
    }
    // 元素后移,为插入腾位置
    for (int i = L->length; i >= pos; i--) { 
        L->data[i] = L->data[i - 1];
    }
    L->data[pos - 1] = val;  // 插入新元素
    L->length++;  // 长度加 1
    return 1;     // 插入成功返回 1
}

// 删除元素:删除第 pos 个位置的元素(pos 从 1 开始)
int Delete(SeqList *L, int pos) {
    // 检查删除位置合法性
    if (pos < 1 || pos > L->length) return 0; 
    // 元素前移,覆盖被删除元素
    for (int i = pos; i < L->length; i++) { 
        L->data[i - 1] = L->data[i];
    }
    L->length--;  // 长度减 1
    return 1;     // 删除成功返回 1
}

// 遍历顺序表,打印所有元素
void Traverse(SeqList *L) {
    for (int i = 0; i < L->length; i++) {
        printf("%d ", L->data[i]);
    }
    printf("\n");
}

// 销毁顺序表,释放内存
void DestroyList(SeqList *L) {
    free(L->data);  // 释放动态数组内存
    L->data = NULL; // 指针置空,避免野指针
    L->MaxSize = 0; 
    L->length = 0; 
}

int main() {
    SeqList L;
    InitList(&L);  // 初始化顺序表

    // 插入操作示例
    Insert(&L, 1, 10);
    Insert(&L, 2, 20);
    Insert(&L, 3, 30);
    printf("插入 3 个元素后:");
    Traverse(&L);

    // 扩容测试(当插入导致容量不足时会自动触发)
    // 这里手动多插入触发扩容,比如再插 8 个元素(原初始容量 10,当前已有 3 个,插 8 个后超初始容量)
    for (int i = 4; i <= 10; i++) {
        Insert(&L, i, i * 10);
    }
    printf("扩容后插入元素:");
    Traverse(&L);

    // 删除操作示例
    Delete(&L, 3);
    printf("删除第 3 个元素后:");
    Traverse(&L);

    // 销毁顺序表
    DestroyList(&L);
    return 0;
}