春风吹又生.c 2023-10-21 19:47 采纳率: 54.8%
浏览 3

为什么链表二没有输入就结束程序了


#include<stdio.h>
#include<malloc.h>
typedef int  elemtype;

typedef struct LNode
{
    elemtype data;
    struct Lnode* next;
}LNode,*LinkList;

void InitList(LinkList  L)
{
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;

}

void CreatList(LinkList L,int n)
{
    LinkList p,r;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    r = L;

    for (int i = 0; i < n; i++)
    {
        p=(LinkList)malloc(sizeof(LNode));
        printf("请输入链表的元素%d:",i);
        scanf_s("%d",&(p->data));
        p->next = NULL;
        r->next = p;
        r =p;

    }
}




void merge_L(LinkList LA, LinkList LB, LinkList LC )
{
    LinkList pa, pb,pc;
    pa = LA->next;
    pb = LB->next;
    LC = LA;
    pc = LC;
    while (pa&&pb)
    {
        if (pa->data <= pc->data)
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else
        {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }

    }
    pc->next = pa ? pa : pb;
    free(LB);

}

        


void printfList(LinkList L)
{
    for (int i = 0; i < 10; i++)
    {
        printf("  %d",L->data);
    }
}

int main()
{
    LinkList  L, L1, L2, L3;
    L = L1 = L2 = L3 = NULL;
    InitList(L);
    
    

    printf("链表L1的数据为:\n");
    CreatList(L1, 4);
    printfList(L1);

    printf("链表L2的数据为:\n");
    CreatList(L2, 6);
    printfList(L2);

    merge_L(L1, L2, L3);
    printf("合并后的有序链表的数据为:\n");
    printfList(L3);

    return 0;

}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-21 23:16
    关注

    【以下回答由 GPT 生成】

    问题的关键在于CreatList函数中对于链表L的初始化的方式不正确。在CreatList函数中,你尝试给链表L赋值,但是由于L是形参,它的改变并不会影响到实参L1,所以实际上L1并没有被正确初始化。

    解决这个问题的方法是将CreatList函数中的形参L改为指针的指针类型(即LinkList* L),同时修改调用CreatList函数的地方。

    以下是修改后的代码:

    #include<stdio.h>
    #include<malloc.h>
    
    typedef int elemtype;
    
    typedef struct LNode
    {
        elemtype data;
        struct LNode* next;
    }LNode, *LinkList;
    
    void InitList(LinkList* L)
    {
        *L = (LinkList)malloc(sizeof(LNode));
        (*L)->next = NULL;
    }
    
    void CreatList(LinkList* L, int n)
    {
        LinkList p, r;
        *L = (LinkList)malloc(sizeof(LNode));
        (*L)->next = NULL;
        r = *L;
    
        for (int i = 0; i < n; i++)
        {
            p = (LinkList)malloc(sizeof(LNode));
            printf("请输入链表的元素%d:", i);
            scanf_s("%d", &(p->data));
            p->next = NULL;
            r->next = p;
            r = p;
        }
    }
    
    void merge_L(LinkList LA, LinkList LB, LinkList LC)
    {
        LinkList pa, pb, pc;
        pa = LA->next;
        pb = LB->next;
        LC = LA;
        pc = LC;
        while (pa&&pb)
        {
            if (pa->data <= pc->data)
            {
                pc->next = pa;
                pc = pa;
                pa = pa->next;
            }
            else
            {
                pc->next = pb;
                pc = pb;
                pb = pb->next;
            }
        }
        pc->next = pa ? pa : pb;
        free(LB);
    }
    
    void printfList(LinkList L)
    {
        LinkList p = L->next;
        while (p != NULL)
        {
            printf("  %d", p->data);
            p = p->next;
        }
    }
    
    int main()
    {
        LinkList L, L1, L2, L3;
        L = L1 = L2 = L3 = NULL;
        InitList(&L1);
    
        printf("链表L1的数据为:\n");
        CreatList(&L1, 10);
        printfList(L1);
    
        return 0;
    }
    

    这样修改后,链表L1应该就不会出现没有输入就结束程序的问题了。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月21日

悬赏问题

  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥15 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?