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

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

两线性表合并不了,感觉是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

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

希望各位帮忙

可能是因为在执行合并时没有使用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