日理万机的杨总 2022-05-06 18:24 采纳率: 25%
浏览 29
已结题

我这里面的插入函数是不是哪里错了

问题遇到的现象和发生背景

两线性表合并不了,感觉是ListInsert函数错了,却看不出哪里错

问题相关代码,请勿粘贴截图
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef int Status;
#define MaxSize 100//初始最大分配量
#define Size 50
#define OVERFLOW -2
#define OK 1
#define ERROR -1

typedef struct {
    ElemType* elem;//基地址
    int length;//当前长度
    int listsize;//当前分配容量
}Sqlist;

/*初始化*/
Status InitList_Sq(Sqlist* L) {
    L->elem = (ElemType*)malloc(MaxSize * sizeof(ElemType));
    if (!L->elem) {
        exit(OVERFLOW);
        printf("分配空间失败\n");
    }//存储分配失败
    L->length = 0;//空表长度
    L->listsize = MaxSize;//初始容量
    return OK;
}
void CreateList(Sqlist* L, int n) {
    for (int i = 0; i < n; i++) {
        printf("输入元素:");
        int e;
        scanf_s("%d", &e);
        L->elem[i] = e;
        L->length++;
    }

}
Status ListLength(Sqlist* L) {
    return L->length;
}

/*按序号查某个元素的值*/
Status GetElem(Sqlist L, int i, ElemType *e) {
    if (i < 1 || i > L.length)
        return ERROR;
    *e = L.elem[i - 1];
    return OK;
}

/*查访La*/
Status LocateElem(Sqlist L, ElemType e) {
    for (int i = 0; i < L.length; i++) {
        if (L.elem[i] = e)
            return i + 1;
    }
    return OK;
}
/*进行合并*/
void Union(Sqlist La, Sqlist Lb, int n, int m) {
    ElemType e, a;
    for (int i = 1; i <= n; i++) {
        e = GetElem(Lb, i, &e);//取Lb表内元素的值
        a = LocateElem(La, e);
        if (a != 1) {
            ListInsert(&La, m, &e);
        }
    }//遍历Lb表
}

/*插入元素*/
Status ListInsert(Sqlist* L, int i, ElemType e) {
    if (i<1 || i>L->length + 1)
        return ERROR;
    ElemType* q = &(L->elem[i-1]);
    ElemType* p;
    for (p = &L->elem[L->length - 1]; p >= q; --p) {
        *(p + 1) = *p;
    }
    *q = e;
    ++L->length;
    return OK;
}

int PrintList(Sqlist* L) {
    for (int i = 0; i < L->length; i++) {
        printf("%d",L->elem[i]);
    }
    return OK;
}
int main() {
    Sqlist La, Lb;
    int n, m, e;
    InitList_Sq(&La);//初始化La
    InitList_Sq(&Lb);//初始化Lb;
    printf("请问你要输入La的个数\n");
    scanf_s("%d", &m);
    CreateList(&La, m);//创建La
    PrintList(&La);//输出La

    printf("请问你要输入Lb的个数\n");
    scanf_s("%d", &n);
    CreateList(&Lb, n);//创建Lb
    PrintList(&Lb);//输出Lb
    
    printf("合并后的结果\n");
    Union(La, Lb, n, m);
    PrintList(&La);
    return 0;
}

运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果

希望各位帮忙

  • 写回答

1条回答 默认 最新

  • a5156520 2022-05-06 20:24
    关注

    可能是因为在执行合并时没有使用Sqlist指针,所以导致不能将修改的操作保存下来,然后还有一些小的逻辑错误,修改如下:

    
    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    typedef int ElemType;
    typedef int Status;
    #define MaxSize 100//初始最大分配量
    #define Size 50
    #define OVERFLOW -2
    #define OK 101 //因为数组的最大长度是100 ,所以OK用0到99之间数都不适合,返回状态会和返回数组的位置重合,这里用101代表0K状态 
    #define ERROR -1
    
    typedef struct {
        ElemType* elem;//基地址
        int length;//当前长度
        int listsize;//当前分配容量
    }Sqlist;
     
    /*初始化*/
    Status InitList_Sq(Sqlist* L) {
        L->elem = (ElemType*)malloc(MaxSize * sizeof(ElemType));
        if (!L->elem) {
            exit(OVERFLOW);
            printf("分配空间失败\n");
        }//存储分配失败
        L->length = 0;//空表长度
        L->listsize = MaxSize;//初始容量
        return OK;
    }
    void CreateList(Sqlist* L, int n) {
        for (int i = 0; i < n; i++) {
            printf("输入元素:");
            int e;
            scanf("%d", &e);
            L->elem[i] = e;
            L->length++;
        }
     
    }
    Status ListLength(Sqlist* L) {
        return L->length;
    }
     
    /*按序号查某个元素的值*/
    Status GetElem(Sqlist L, int i, ElemType *e) {
        if (i < 1 || i > L.length)
            return ERROR;
        *e = L.elem[i - 1];
        return *e;  //返回elem数组第i个元素的值 
    }
     
    /*查访La*/
    Status LocateElem(Sqlist L, ElemType e) {
        for (int i = 0; i < L.length; i++) {
            if (L.elem[i] == e)
                return i + 1;
        }
        return OK;
    }
    
    /*插入元素*/
    Status ListInsert(Sqlist* L, int i, ElemType e) {
        if (i<1 || i>L->length + 1)
            return ERROR;
    //    ElemType* q = &(L->elem[i-1]);
    //    *(q+1)=e; 
      //  ElemType* p;
    //    for (p = &L->elem[L->length - 1]; p >= q; --p) {
    //        *(p + 1) = *p;
    //    }
    //    *q = e;
    //      int j;
    //      printf("before insert ,L->length=%d,L value is :\n",L->length); 
    //    for(j=0;j<L->length;j++){
    //        printf("L->elem[%d]=%d\n",j,L->elem[j]); 
    //    }
        
        L->elem[L->length]=e; //将elem最后一个元素的下一个位置插入e 
        
    //    printf("L->elem[%d]=%d\n",L->length,L->elem[L->length] );
        
       (*L).length++; //L结构的长度+1 
        
    //   printf("after get value ,e=%d, L->length=%d\n",e,L->length);
    //    for(j=0;j<L->length;j++){
    //        printf("L->elem[%d]=%d\n",j,L->elem[j]); 
    //    }
        
        return OK;
    }
    
    /*进行合并*/
    void Union(Sqlist * La, Sqlist * Lb, int n, int m) {
        ElemType e, a;
        for (int i = 1; i <= n; i++) {
            e = GetElem(*Lb, i, &e);//取Lb表内元素的值
            a = LocateElem(*La, e); //判断值e在La中是否存在 
            if (a == 101) { //如果不存在,则插入e
                ListInsert(La, m, e);
            }
        }//遍历Lb表
    }
     
    
     
    int PrintList(Sqlist* L) {
    //    printf("L->Length=%d\n",L->length);
        for (int i = 0; i < L->length; i++) {
            printf("%d ",L->elem[i]);
        }
        return OK;
    }
    int main() {
        Sqlist La, Lb;
        int n, m, e;
        InitList_Sq(&La);//初始化La
        InitList_Sq(&Lb);//初始化Lb;
        printf("请问你要输入La的个数\n");
        scanf("%d", &m);
        CreateList(&La, m);//创建La
        PrintList(&La);//输出La
     
        printf("请问你要输入Lb的个数\n");
        scanf("%d", &n);
        CreateList(&Lb, n);//创建Lb
        PrintList(&Lb);//输出Lb
        
        printf("合并后的结果\n");
        Union(&La, &Lb, n, m);
        PrintList(&La);
        return 0;
    }
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月2日
  • 已采纳回答 5月25日
  • 创建了问题 5月6日

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。