这是一个数据结构线性表 输出结果不对 很难受有疑问

如下:

一道 c语言数据结构的题

算法就是求 B中不包含A的 插入A队列 然后输出A 想知道在哪里如何修正

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define OVERFLOW 3
#define OK 1
#define ERROR 0
typedef struct
{//顺序表的存储结构
    int* elem;//存储空间的基地址
    int length;
}SqList;
int InitList(SqList& L) {
    L.elem = new int[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间
    if (!L.elem)
        exit(OVERFLOW);//存储分配失败退出
    L.length = 0;
    return OK;
}
int ListInsert(SqList& L, int i, int e) {
    if ((i < 1) || i > L.length + 1)
        return ERROR;
    if (L.length == MAXSIZE)
        return ERROR;
    for (int j = L.length; j >= i; j--) {
        L.elem[j ] = L.elem[j-1];
    }
    L.elem[i - 1] = e;
    ++L.length;
    return OK;
}
int GetElem(SqList L, int i, int& e) {
    if (i<1 || i>L.length)
        return ERROR;
    e = L.elem[i - 1];
    return OK;
}
int LocateElem(SqList L, int e) {
    for (int i = 0; i < L.length; i++) {
        if (L.elem[i] == e)
            return i + 1;
        return 0;
    }
}
void MergeList(SqList& La, SqList Lb) {
    //将所有在线性表LB当不在线性表La中的数据元素插入到LA中
    int m = La.length;
    int n = Lb.length;
    int e;
    for (int i = 1; i <= n; i++) {
        GetElem(Lb, i,e);
        if (!LocateElem(La, e)) {
            ListInsert(La, ++m, e);
        }
        
    }
}
int main() {
    SqList A;
    SqList B;
    InitList(A);
    InitList(B);
    ListInsert(A,1,7);
    ListInsert(A,2,5);
    ListInsert(A,3,3);
    ListInsert(A,4,11);
    ListInsert(B,1,2);
    ListInsert(B,2,6 );
    ListInsert(B,3,3);
    for (int i = 0; i < A.length; i++) {
        printf("%d,", A.elem[i]);
    }
    printf("\n");
    MergeList(A, B);
    for (int i = 0; i < A.length; i++) {
        printf("%d,", A.elem[i]);
    }
}

img


*

问题在 int LocateElem(SqList L, int e) 函数里,修改如下,改动处见注释,供参考:

int LocateElem(SqList L, int e) {
    for (int i = 0; i < L.length; i++) {
        if (L.elem[i] == e)
            return i + 1;
        //return 0;  修改 这行移动到for(){}外面
    }
    return 0; // 修改 移动到这里
}

【以下回答由 GPT 生成】

首先,分析代码中可能存在的问题: 1. 在初始化线性表时,没有判断是否分配内存成功。 2. 在插入数据前,没有判断插入位置是否合法。 3. 在插入数据前,没有判断线性表是否已满。 4. 在插入数据时,没有更新表的长度。 5. 在获取元素时,未对索引进行合法性判断。

针对以上问题,可以进行如下优化:

int InitList(SqList& L)
{
    L.elem = (int*)malloc(MAXSIZE * sizeof(int)); //为顺序表分配一个大小为MAXSIZE的数组空间
    if (L.elem == NULL) {
        exit(OVERFLOW); //存储分配失败退出
    }
    L.length = 0;
    return OK;
}

int ListInsert(SqList& L, int i, int e)
{
    if (i < 1 || i > L.length + 1) {
        return ERROR;
    }
    if (L.length >= MAXSIZE) {
        return ERROR;
    }
    for (int j = L.length - 1; j >= i - 1; j--)
    {
        L.elem[j + 1] = L.elem[j];
    }
    L.elem[i - 1] = e;
    L.length++;
    return OK;
}

int GetElem(SqList L, int i, int& e)
{
    if (i < 1 || i > L.length) {
        return ERROR;
    }
    e = L.elem[i - 1];
    return OK;
}

主要修改内容如下:

  1. 在初始化函数InitList()中,将new操作改为malloc,并添加内存分配成功与否的判断。
  2. 在插入函数ListInsert()中,将判断条件i > L.length改为i > L.length + 1,防止非法插入。
  3. 在插入函数ListInsert()中,将判断条件L.length == MAXSIZE改为L.length >= MAXSIZE,防止插入到已满的线性表中。
  4. 在插入函数ListInsert()中,将循环起始值修改为L.length - 1,并将元素后移。
  5. 在获取函数GetElem()中,添加合法性判断,防止获取不存在的元素。

以上是对代码的优化修改,希望能够解决你的问题。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^