AC_wy 2023-03-25 00:49 采纳率: 83.3%
浏览 48
已结题

求两个有序表的合并 为什么没输出呢,请问出现这种情况应该怎么检查修改啊



```c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status;
typedef int ElemType;
typedef struct
{
    ElemType data[MAXSIZE];    /*存储数组元素*/
    int length;      /*表当前长度*/
}List;/*数组存储类型名*/
int ListLength(List L);
Status GetElem(List L,int i,ElemType *e);
Status ListInsert(List *L,ElemType i,ElemType e);
void MergeList(List La, List Lb,List *Lc);
Status ListEmpty(List L);
int main()
{
    int i;
    char ch;
    List La,Lb,Lc;
    La.length=0;
    Lb.length=0;
    for(i=0;;i++)
    {
        scanf("%d%c",&La.data[i],&ch);
        La.length++;
        if(ch=='\n')
            break;
    }
    for(i=0;;i++)
    {
        scanf("%d%c",&Lb.data[i],&ch);
        Lb.length++;
        if(ch=='\n')
            break;
    }
    if(!ListEmpty(La)&&!ListEmpty(Lb))
        MergeList(La,Lb,&Lc);
    for(i=0;i<Lc.length;i++)
        printf("%d ",Lc.data[i]);
    return 0;
}

/*返回L中数据元素个数*/
int ListLength(List L)
{
    return L.length;
}

/*用e返回L中第i个数据元素的值*/
Status GetElem(List L,int i,ElemType *e)
{
    if(L.length==0||i<1||i>L.length)
        return ERROR;
    *e=L.data[i-1];
    return OK;
}

/*L中第i个位置之前插入定的数据元素e,L的长度+1*/
Status ListInsert(List *L,ElemType i,ElemType e)
{
    int k;
    if(i==L->length+1)
        L->data[i-1]=e;
    else
    {
        for(k=L->length-1;k>=i-1;k--)
        {
            L->data[k+1]=L->data[k];
        }
        L->data[i-1]=e;
    }
    L->length++;
}

/*归并LaLb得到新的表Lc,Lc的数据元素也按值非递减排列*/
void MergeList(List La, List Lb,List *Lc)
{
    int i=1,j=1,k=0;
    int La_len,Lb_len,Lc_len;
    int ai,bj;
    La_len=ListLength(La);
    Lb_len=ListLength(Lb);
    Lc_len=ListLength(*Lc);
    while(i<=La_len&&i<=Lb_len)    /*La和表Lb均非空*/
    {
        GetElem(La,i,&ai);
        GetElem(Lb,j,&bj);
        if(ai<=bj)
        {
            ListInsert(Lc,++k,ai);
            ++i;
        }
        else
        {
            ListInsert(Lc,++k,bj);
            ++j;
        }
    }
    while(i<=La_len)       /*La非空且表Lb*/
    {
        GetElem(La,i++,&ai);
        ListInsert(Lc,++k,ai);
    }
    while(j<=Lb_len)      /*Lb非空且表La*/
    {
        GetElem(Lb,j++,&bj);
        ListInsert(Lc,++k,bj);
    }
}
Status ListEmpty(List L)
{
    if(L.length==0)
        return TRUE;
    else
        return FALSE;
}


```

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2023-03-25 23:21
    关注

    在主函数里,添加表Lc的长度初始值,如下:
    List La,Lb,Lc;
    La.length=0;
    Lb.length=0;
    Lc.length=0; // 修改 添加表 Lc的长度初始化
    MergeList()函数里:while(i<=La_len && j<=Lb_len) //while(i<=La_len&&i<=Lb_len) 修改
    整体修改如下,改动处见注释,供参考:

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    #define MAXSIZE 20
    typedef int Status;
    typedef int ElemType;
    typedef struct
    {
        ElemType data[MAXSIZE];//存储数组元素
        int length;//表当前长度
    }List;//数组存储类型名
    int ListLength(List L);
    Status GetElem(List L,int i,ElemType *e);
    Status ListInsert(List *L,ElemType i,ElemType e);
    void MergeList(List La, List Lb,List *Lc);
    Status ListEmpty(List L);
    int main()
    {
        int i;
        char ch;
        List La,Lb,Lc;
        La.length=0;
        Lb.length=0;
        Lc.length=0;  // 修改
        for(i=0;;i++)
        {
            scanf("%d%c",&La.data[i],&ch);
            La.length++;
            if(ch=='\n')
                break;
        }
        for(i=0;;i++)
        {
            scanf("%d%c",&Lb.data[i],&ch);
            Lb.length++;
            if(ch=='\n')
                break;
        }
        if(!ListEmpty(La)&&!ListEmpty(Lb))
            MergeList(La,Lb,&Lc);
        for(i=0;i<Lc.length;i++)
            printf("%d ",Lc.data[i]);
        return 0;
    }
    
    //返回L中数据元素个数
    int ListLength(List L)
    {
        return L.length;
    }
    
    //用e返回L中第i个数据元素的值
    Status GetElem(List L,int i,ElemType *e)
    {
        if(L.length==0||i<1||i>L.length)
            return ERROR;
        *e=L.data[i-1];
        return OK;
    }
    
    //L中第i个位置之前插入定的数据元素e,L的长度+1
    Status ListInsert(List *L,ElemType i,ElemType e)
    {
        int k;
        if(i==L->length+1)
            L->data[i-1]=e;
        else
        {
            for(k=L->length-1;k>=i-1;k--)
            {
                L->data[k+1]=L->data[k];
            }
            L->data[i-1]=e;
        }
        L->length++;
    }
    
    //归并LaLb得到新的表Lc,Lc的数据元素也按值非递减排列
    void MergeList(List La, List Lb,List *Lc)
    {
        int i=1,j=1,k=0;
        int La_len,Lb_len,Lc_len;
        int ai,bj;
        La_len=ListLength(La);
        Lb_len=ListLength(Lb);
        Lc_len=ListLength(*Lc);
        while(i<=La_len && j<=Lb_len)
        //while(i<=La_len&&i<=Lb_len)修改
        {
            GetElem(La,i,&ai);
            GetElem(Lb,j,&bj);
            if(ai<=bj)
            {
                ListInsert(Lc,++k,ai);
                ++i;
            }
            else
            {
                ListInsert(Lc,++k,bj);
                ++j;
            }
        }
        while(i<=La_len)       //La非空且表Lb空
        {
            GetElem(La,i++,&ai);
            ListInsert(Lc,++k,ai);
        }
        while(j<=Lb_len)      //Lb非空且表La空
        {
            GetElem(Lb,j++,&bj);
            ListInsert(Lc,++k,bj);
        }
    }
    Status ListEmpty(List L)
    {
        if(L.length==0)
            return TRUE;
        else
            return FALSE;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月26日
  • 已采纳回答 3月26日
  • 创建了问题 3月25日