luoshengZ 发表于 2025-4-11 01:11:17

顺序表的删除

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

//基本操作:在L的位序i处插入元素e.
bool ListDelete(SqList &L,int i,int &e){
        if(i<1||i>L.length+1){        //判断i的范围是否有效
                return false;
        }
        e=L.data;        //将被删除的元素赋值给e
        for(int j=i;j<L.length;j++){        //将第i个位置后的元素前移
                L.data=L.data; }         //注意位序、数组下标的关系,并从前面的元素依次移动
        L.length--;        //线性表长度减一
        return true;
}

int main(){
        SqList L;        //声明一个顺序表
        InitList(L);        //初始化顺序表
        //。。。此处省略一些代码,插入几个元素
        int e=-1;        //用变量e把删除的元素“带回来”
        if(ListDelete(length,3,e)){
                printf("已删除第3个元素,删除元素值为=%d\n",e);
        }else{
                printf("位序i不合法,删除失败\n");
        }
        return 0;
}

FishC 发表于 2025-4-11 01:11:57

顺序表删除操作代码修正

你提供的代码存在几个关键问题,修正后的代码如下:


#include <stdio.h>// 补全头文件
#define MaxSize 10

typedef struct {
    int data;// 修正:这里应该定义数组
    int length;
} SqList;

bool ListDelete(SqList &L, int i, int &e) {
    if (i < 1 || i > L.length) {// 修正判断条件
      return false;
    }
    e = L.data;// 修正:获取被删除元素
   
    // 删除位置后的元素前移
    for (int j = i; j < L.length; j++) {// 修正循环条件
      L.data = L.data;
    }
   
    L.length--;// 表长减1
    return true;
}


主要修正点说明:

[*]原代码缺少数组定义,结构体中的 int data 应改为 int data
[*]删除位置判断条件错误,正确范围应为 i < 1 || i > L.length
[*]元素前移时,原代码循环条件应改为 j < L.length
[*]被删除元素赋值应使用 L.data(数组下标从0开始)


使用示例:

int main() {
    SqList list = {{1,2,3,4,5}, 5};// 初始化顺序表
    int deleted_value;
   
    if (ListDelete(list, 3, deleted_value)) {
      printf("删除成功,被删除元素:%d", deleted_value);
    } else {
      printf("删除失败");
    }
    return 0;
}


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