m0_73644674 2023-03-26 20:15 采纳率: 20%
浏览 33

这段代码到底哪里错了啊,为什么输出为空啊?

题目为:实现两个有序表合并后仍然有序的功能
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;

struct LNode
{
    ElemType data;
    struct LNode *next;
};
typedef struct LNode*LinkList;

LinkList Create_Link()/*创建链表的函数,返回的是头指针*/
{
    char ch;
    struct LNode *head=NULL,*p1,*p2;
    while(1)
    {
        p1=(struct LNode*)malloc(sizeof(struct LNode));
        p1->next=NULL;
        scanf("%d%c",&p1->data,&ch);
        if(head==NULL)
        {
            head=p1;
            p2=p1;
        }
        else
        {
            p2->next=p1;
            p2=p1;
        }
        if(ch=='\n')
            break;
    }
    return (head);
}

Status ListLength(LinkList L)/*计算链表长度的函数*/
{
    int length=0;
    struct LNode *p1;
    p1=L;
    while(p1!=NULL)
    {
        length++;
        p1=p1->next;
    }
    return length;
}

Status GetElem(LinkList L,int i,ElemType*e)/*该函数取第i个元素赋给e,e用于后续比较*/
{
    int j=1;
    LinkList p=L;
    while(p&&j<i)/*while(p!=NULL&&j<i),找到第i个数据*/
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)/*if(p=NULL||j>i),如果已经退出了循环,说明在循环中没有找到数据*/
        return ERROR;
    *e=p->data;
    return OK;
}

void ListInsert(LinkList **L,int j,ElemType e)/*在链表中插入数据*/
{
    int i=0;
    struct LNode *p1,*p2,*p;
    p1=**L;
    p2=**L;
    p=(struct LNode*)malloc(sizeof(struct LNode));
    p->next=NULL;
    p->data=e;
    if(j==ListLength(**L)+1)
    {
        while(p1!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        p2->next=p;
    }
    else
    {
        if(j-1==0)
        {
            p->next=p1;
            **L=p;
        }
        else
        {
            while(i<j)
            {
                p2=p1;
                p1=p1->next;
            }
            p->next=p1;
            p2->next=p;
        }
    }
}

Status ListEmpty(LinkList L)/*判断是否为空表*/
{
    if(L->next)
        return FALSE;
    else
        return TRUE;
}

void MergeList (LinkList La,LinkList Lb,LinkList *Lc)
{
    int i=1,j=1,k=0;
    int La_len,Lb_len;
    int a,b;
    La_len=ListLength(La);
    Lb_len=ListLength(Lb);
    while(i<=La_len&&j<=Lb_len)
    {
        GetElem(La,i,&a);
        GetElem(Lb,j,&b);
        if(a<=b)
        {
            ListInsert(&Lc,++k,a);
            ++i;
        }
        else
        {
            ListInsert(&Lc,++k,b);
            ++j;
        }
    }
    while(i<=La_len)
    {
        GetElem(La,i++,&a);
        ListInsert(&Lc,++k,a);
    }
    while(j<=Lb_len)
    {
        GetElem(Lb,j++,&b);
        ListInsert(&Lc,++k,b);
    }
}

int main()
{
    struct LNode *p1;
    LinkList La,Lb,Lc;
    La=Create_Link();
    Lb=Create_Link();
    if(!ListEmpty(La)&&!ListEmpty(Lb))
    {
        MergeList(La,Lb,&Lc);
    }
    p1=La;
    while(p1!=NULL)
    {
        printf("%d ",p1->data);
        p1=p1->next;
    }
    return 0;
} 
  • 写回答

3条回答 默认 最新

  • IT_service_mesh 2023-03-26 20:39
    关注

    参考GPT和自己的思路:该代码中的问题在于,在主函数中打印链表La的元素时,没有将指针p1指向链表Lc,而是仍然指向了链表La,因此输出为空。解决方法是将指针p1指向链表Lc。修改后的代码如下:

    int main()
    {
        struct LNode *p1;
        LinkList La,Lb,Lc;
        La=Create_Link();
        Lb=Create_Link();
        if(!ListEmpty(La)&&!ListEmpty(Lb))
        {
            MergeList(La,Lb,&Lc);
        }
        p1=Lc; // 将指针p1指向链表Lc
        while(p1!=NULL)
        {
            printf("%d ",p1->data);
            p1=p1->next;
        }
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 修改了问题 3月26日
  • 创建了问题 3月26日