小李子637 2023-04-11 13:01 采纳率: 60%
浏览 29
已结题

数据结构与算法,问题如何解决

题目:已知线性表La和Lb中的数据元素按值非递减有序排列,现要将两表归并为新表Lc,使Lc中所有元素仍然按值非递减有序排列,其中La=(3,5,8,11),Lb=(2,6,8,9,11,15,20),Lc=(2,3,5,6,8,8,9,11,11,15,20)。
问题:请问我这个代码哪里错了,能改正并且说明错误原因吗?

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 100
#define Status int
#define ElemType int
//顺序表结构
typedef struct {
    ElemType* data;
    int length;
}SqList;
//初始化
void InitList(SqList& L)
{
    L.data = new ElemType[MAXSIZE];
    L.length = 0;
}
//创建线性表
void Create(SqList& L)
{
    int n, i;
    printf("请输入要输入元素的个数:");
    scanf_s("%d", &n);
    if (n<0 || n>MAXSIZE)
    {
        printf("请输入正确的个数!\n");
    }
    for (i = 0; i < n; i++)
    {
        printf("请输入第%d个元素:", (i + 1));
        scanf_s("%d", &(L.data[i]));
        L.length++;
    }

}
//打印线性表
void PrintList(SqList L)
{
    printf("所有元素:");
    for (int i = 0; i < L.length; i++)
    {
        printf("%d ", L.data[i]);
    }
    printf("\n");
}
void MergeList(SqList& La, SqList& Lb, SqList& Lc)
{
    int i;
    int m = La.length;
    int n = Lb.length;
    int p = Lc.length;
    int q;
    if (m > n)
        q = n;
    else
        q = m;
    for (i = 0; i < m + n; i++)
    {
        if (i <= q)
        {
            if (La.data[i] <= Lb.data[i])
            {
                Lc.data[p] = La.data[i];
                Lc.data[p + 1] = Lb.data[i];
                Lc.length = Lc.length + 2;
                p=p+2;
            }
            if (La.data[i] > Lb.data[i])
            {
                Lc.data[p] = Lb.data[i];
                Lc.data[p + 1] = La.data[i];
                Lc.length = Lc.length + 2;
                p=p+2;
            }
        }
        if (i > q)
        {
            if (m > n)
            {
                Lc.data[p] = La.data[i];
                Lc.length++;
                p++;
            }
            if (m < n)
            {
                Lc.data[p] = Lb.data[i];
                Lc.length++;
                p++;
            }
        }
    }
}

int main()
{
        SqList La, Lb, Lc;
        //初始化
        InitList(La);
        InitList(Lb);
        InitList(Lc);
        //创建
        printf("请输入集合La的元素:\n");
        Create(La);
        printf("请输入集合Lb的元素:\n");
        Create(Lb);
        //合并A和B集合到Lc中
        MergeList(La, Lb,Lc);
        PrintList(Lc);

    }

  • 写回答

1条回答 默认 最新

  • 快乐鹦鹉 2023-04-11 13:08
    关注

    合并逻辑完全错误
    对La和Lb分别进行循环,分别取出当前元素进行比较,小的加入Lc,然后从小的所在的线性表中取下一个元素进行循环比较

    int i=0,j=0,k=0;
    while(i<La.length && j<Lb.length)
    {
        if(La.data[i] < Lb.data[j])
        {
            Lc.data[k] = La.data[i];
            i++;
        }
        else
        {
            Lc.data[k] = Lb.data[j];
            j++;
        }
        k++;
    }
    while(i<La.length)
        Lc.data[k++] = La.data[i++];
    while(j<Lb.length)
        Lc.data[k++] = Lb.data[j++];
    Lc.length = k;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 4月11日

悬赏问题

  • ¥40 图书信息管理系统程序编写
  • ¥15 7-1 jmu-java-m02-使用二维数组存储多元线性方程组
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟
  • ¥15 树莓派控制机械臂传输命令报错,显示摄像头不存在
  • ¥15 前端echarts坐标轴问题
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题