luoshengZ 发表于 2025-4-11 00:24:16

顺序表的基本操作——插入

#include <stdio.h>
#define MaxSize 10        //定义最大长度
typedef struct{
        int data;        //用静态的“数组”存放数据元素
        int length;        //顺序表的当前长度
}SqList;        //顺序表的类型定义

//基本操作:在L的位序i处插入元素e.
bool ListTnsert(SqList &L,int i,int e){
        if(i<1||i>L.length+1){        //判断i的范围是否有效
                return false;
        }
        if(L.length>=MaxSize){        //当前存储空间已满,不能插入
                return false;
        }
        for(int j=L.length;j>=i;j--){        //将第i个元素及之后的元素后移
                L.data=L.data; } //注意位序、数组下标的关系,并从后面的元素依次移动
        L.data=e;        //在位置i出放入e
        L.length++;        //长度加一
        return true;
}

int main(){
        SqList L;        //声明一个顺序表
        InitList(L);        //初始化顺序表
        //。。。此处省略一些代码,插入几个元素
        ListInsert(L,3,3);
        return 0;
}

FishC 发表于 2025-4-11 00:25:08


#include <stdio.h> // 添加缺失的头文件
#define MaxSize 10

typedef struct {
    int data; // 修正:数组声明缺少[]
    int length;
} SqList;

// 初始化函数补充(原代码未给出)
void InitList(SqList &L) {
    L.length = 0;
}

bool ListInsert(SqList &L, int i, int e) { // 修正:函数名拼写错误
    if (i < 1 || i > L.length + 1) return false;
    if (L.length >= MaxSize) return false;

    // 修正:移动元素逻辑错误
    for (int j = L.length; j >= i; j--) {
      L.data = L.data; // 正确后移元素
    }
    L.data = e; // 修正:数组下标应为i-1
    L.length++;
    return true;
}

int main() {
    SqList L;
    InitList(L);
    ListInsert(L, 3, 3); // 此处实际会插入失败,因为此时顺序表为空
    return 0;
}


主要修改说明:


[*]1. 数组声明修正:原结构体缺少数组声明的[]符号
[*]2. 函数名修正:原ListTnsert拼写错误改为ListInsert
[*]3. 元素移动逻辑修正:原L.data = L.data改为正确的数组元素移动方式
[*]4. 插入位置修正:数组下标应从i-1开始(位序从1开始,数组下标从0开始)
[*]5. 补充初始化函数:添加必须的初始化逻辑


插入操作要点:
1. 判断插入位置合法性:i ∈
2. 元素后移必须从最后一个元素开始移动
3. 插入成功后需要更新表长
4. 时间复杂度:最好O(1),最坏O(n),平均O(n)

常见错误:忘记数组下标和位序的转换(位序i对应数组下标i-1)!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 顺序表的基本操作——插入