dylaaaaan 2022-09-28 19:48 采纳率: 100%
浏览 21
已结题

关于#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

  • 写回答

4条回答 默认 最新

  • qzjhjxj 2022-09-28 21:18
    关注

    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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月29日
  • 已采纳回答 9月29日
  • 修改了问题 9月28日
  • 创建了问题 9月28日

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序