关于#c语言#的问题,如何解决?

c语言拼接两个顺序表并按从小到大排序时输入第八个和第十六个元素时出现一个奇怪的回车
//
// Created by Dylan on 2022/9/27.
//
#include "stdio.h"
#include "stdlib.h"

#define INITAL 20
#define OVERFLOW 0
#define ERROR -1
#define ADD 5
#define OK 0
typedef struct sq {
    int *elem;
    int length;
    int listsize;
} sqlist;
sqlist C;

void initlist(struct sq *L, int n);

int listinsert(struct sq *L, int i, int e);

void listdisplay(sqlist *L);

void mergelist(sqlist A, sqlist B);

void initlist(struct sq *L, int n) {
    L->elem = (int *) malloc(INITAL * sizeof(int));
    if (!L->elem)exit(OVERFLOW);
    L->length = 0;
    L->listsize = INITAL;
    int elem;
    if (n < INITAL) {
        for (int i = 0; i < n; i++) {
            printf("请输入第%d个元素", i + 1);
            scanf("%d", &elem);
            L->elem[i] = elem;
            //L->elem++;
            L->length++;
        }
    } else {
        int *newbase;
        int add;
        add = (n - INITAL) / ADD + 1;
        newbase = (int *) realloc(L->elem, (INITAL + add * ADD) * sizeof(int));
        if (!newbase) exit(ERROR);
        L->elem = newbase;
        L->listsize = INITAL + ADD;
        for (int i = 0; i < n; i++) {
            printf("请输入第%d个元素", i + 1);
            scanf("%d", &elem);
            L->elem[i] = elem;
            //L->elem++;
            L->length++;
        }
    }
}

int listinsert(struct sq *L, int i, int e) {
    if (i < 1 || i > L->length + 1) {
        printf("插入位置不对\n");
        return ERROR;
    }
    int *newbase;
    if (L->length >= L->listsize) {
        newbase = (int *) realloc(L->elem, (INITAL + ADD) * sizeof(int));
        if (!newbase) exit(ERROR);
        L->elem = newbase;
        L->listsize = INITAL + ADD;
    }
    for (int j = L->length - 1; j >= i - 1; j--) {
        L->elem[j + 1] = L->elem[j];
    }
    L->elem[i - 1] = e;
    return OK;
}

void listdisplay(sqlist *L) {
    printf("\n");
    for (int i = 0; i < L->length; i++) {
        printf("%d\t", L->elem[i]);
        //printf("%d",i);
    }
}

void mergelist(sqlist a, sqlist b) {

    C.length = a.length + b.length;
    C.listsize = C.length;
    C.elem = malloc(C.listsize * sizeof(int));
    if (!C.elem)exit(OVERFLOW);
    for (int i = 0; i < a.length; i++) {
        for (int j = i; j < a.length - i; j++) {
            if (a.elem[j] > a.elem[j + 1]) {
                int temp = a.elem[j];
                a.elem[j] = a.elem[j + 1];
                a.elem[j + 1] = temp;
            }
        }
    }
//    for (int i = 0; i < a.length - 1; i++) {
//        for (int j = i; j < a.length; j++) {
//            if (a.elem[i] > a.elem[j]) {
//                int temp = a.elem[i];
//                a.elem[i] = a.elem[j];
//                a.elem[j] = temp;
//            }
//        }
//    }
    for (int i = 0; i < a.length; i++) {
        C.elem[i] = a.elem[i];
    }
    for (int j = 0; j < b.length; j++) {
        for (int k = 0; k < C.length; k++) {
            if (b.elem[j] <= C.elem[k]) {
                listinsert(&C, k + 1, b.elem[j]);
                break;
            }
        }
    }
}

int main() {
    sqlist A, B;
    int n1, n2;
    printf("请输入初始线性表A,B的长度n1,n2=");
    scanf("%d %d", &n1, &n2);
    printf("请输入A的元素\n");
    initlist(&A, n1);
    printf("请输入B的元素\n");
    initlist(&B, n2);
    mergelist(A, B);
    listdisplay(&C);
    return 0;
}

用的是clion
在输入时情况如下,运行结果没有问题。

img

void mergelist(sqlist a, sqlist b) 函数 ,int listinsert(struct sq *L, int i, int e) 函数存在漏洞,修改见注释处,供参考:

//
// Created by Dylan on 2022/9/27.
//
#include "stdio.h"
#include "stdlib.h"

#define INITAL 20
#define OVERFLOW 0
#define ERROR -1
#define ADD 5
#define OK 0
typedef struct sq {
    int *elem;
    int length;
    int listsize;
} sqlist;
sqlist C;

void initlist(struct sq *L, int n);

int listinsert(struct sq *L, int i, int e);
 
void listdisplay(sqlist *L);

void mergelist(sqlist A, sqlist B);

void initlist(struct sq *L, int n) {
    L->elem = (int *) malloc(INITAL * sizeof(int));
    if (!L->elem)exit(OVERFLOW);
    L->length = 0;
    L->listsize = INITAL;
    int elem;
    if (n < INITAL) {
        for (int i = 0; i < n; i++) {
            printf("请输入第%d个元素", i + 1);
            scanf("%d", &elem);
            L->elem[i] = elem;
            //L->elem++;
            L->length++;
        }
    } else {
        int *newbase;
        int add;
        add = (n - INITAL) / ADD + 1;
        newbase = (int *) realloc(L->elem, (INITAL + add * ADD) * sizeof(int));
        if (!newbase) exit(ERROR);
        L->elem = newbase;
        L->listsize = INITAL + ADD;
        for (int i = 0; i < n; i++) {
            printf("请输入第%d个元素", i + 1);
            scanf("%d", &elem);
            L->elem[i] = elem;
            //L->elem++;
            L->length++;
        }
    }
}
 
int listinsert(struct sq *L, int i, int e) {
    if (i < 1 || i > L->length + 1) {
        printf("插入位置不对\n");
        return ERROR;
    }
    int *newbase;
    if (L->length >= L->listsize) {
        newbase = (int *) realloc(L->elem, (INITAL + ADD) * sizeof(int));
        if (!newbase) exit(ERROR);
        L->elem = newbase;
        L->listsize = INITAL + ADD;
    }
    for (int j = L->length - 1; j >= i - 1; j--) {
        L->elem[j + 1] = L->elem[j];
    }
    L->elem[i - 1] = e;
    L->length++;              //修改  表长度加 1
    return OK;
}
 
void listdisplay(sqlist *L) {
    printf("\n");
    for (int i = 0; i < L->length; i++) {
        printf("%d\t", L->elem[i]);
        //printf("%d",i);
    }
}
 
void mergelist(sqlist a, sqlist b) {
 
    C.length   = a.length;     // C.length = a.length + b.length;  修改
    C.listsize = a.length + b.length; // C.listsize = C.length;    修改
    C.elem = (int *)malloc(C.listsize * sizeof(int));
    //C.elem = malloc(C.listsize * sizeof(int));                   修改
    if (!C.elem)exit(OVERFLOW);
    for (int i = 0; i < a.length - 1; i++) {         //for (int i = 0; i < a.length; i++) 修改
        for (int j = 0; j < a.length - i - 1; j++) { // for (int j = i; j < a.length - i; j++) 修改
            if (a.elem[j] > a.elem[j + 1]) {
                int temp = a.elem[j];
                a.elem[j] = a.elem[j + 1];
                a.elem[j + 1] = temp;
            }
        }
    }
//    for (int i = 0; i < a.length - 1; i++) {
//        for (int j = i; j < a.length; j++) {
//            if (a.elem[i] > a.elem[j]) {
//                int temp = a.elem[i];
//                a.elem[i] = a.elem[j];
//                a.elem[j] = temp;
//            }
//        }
//    }
    for (int i = 0; i < a.length; i++) {
        C.elem[i] = a.elem[i];
    }
    for (int j = 0, k = 0; j < b.length; j++) { //修改
        for (k = 0; k < C.length; k++) {        //修改
            if (b.elem[j] <= C.elem[k]) {
                listinsert(&C, k + 1, b.elem[j]);
                break;
            }
        }
        if (k == C.length){   //修改 如果 b.elem[]表元素 大于 C.elem[]表元素情况
            listinsert(&C, k + 1, b.elem[j]); //修改
        }
    }
}
 
int main() {
    sqlist A, B;
    int n1, n2;
    printf("请输入初始线性表A,B的长度n1,n2=");
    scanf("%d %d", &n1, &n2);
    printf("请输入A的元素\n");
    initlist(&A, n1);
    printf("请输入B的元素\n");
    initlist(&B, n2);
    mergelist(A, B);
    listdisplay(&C);

    return 0;
}

测试了一下没有你说的现象,是不是你手按回车太快了?

代码好像没有问题,就是在clion里面出现换行