viency13 2023-03-10 08:21 采纳率: 68.8%
浏览 24
已结题

为什么输出链表为空啊,调试了一下,好像是插入那里有问题


#include <iostream>

using namespace std;

typedef struct Lnode
{
    int data;
    struct Lnode *next;
}Lnode, *Linklist;

int creat ( Linklist &L )
{
    L = new Lnode;
    L->next = NULL;
    Linklist p, q = L;
    while (1)
    {
        p = new Lnode;
        cin >> p->data;
        if ( p->data == -1 )
        {
            return 0;
        }
        p->next = NULL;
        q->next = p;
        q = p;
    }
}
void cmp ( Linklist &L, int e )
{
    Linklist p, q;
    p = L;
    if ( e >= p->next->data )
    {
        q = new Lnode;
        q->data = e;
        q->next = 
        p->next = q;
        p = q;
    }
}

void Print (Linklist L)
{
    Linklist p = L->next;
    while ( p != NULL ) 
    {
        cout << p->data;
        if ( p->next != NULL)
        {
            cout << " ";
        }
        p = p->next;
    }
}

int main ()
{
    int t;
    Linklist L;
    creat (L);
    while ( 1 )
    {
        cin >> t;
        if ( t == -1 )
        {
            return 0;
        }
        else 
        {
            cmp (L, t);
        }
    }
    Print (L);
}
  • 写回答

4条回答 默认 最新

  • CodeBytes 2023-03-10 08:47
    关注

    该回答引用ChatGPT

    在函数 cmp 中,当链表 L 为空或 e 值小于 L 中第一个节点的值时,没有插入新的节点,导致最终输出的链表仍然是原始的输入链表。因此,需要增加一个判断链表 L 是否为空的条件,以及在需要插入新节点时,要修改新节点的 next 指针和前一个节点的 next 指针。同时,在 main 函数中需要将 Print(L) 函数调用语句放在 while 循环外面,否则在第一次输入 -1 后就会直接返回,无法输出链表。

    以下是修正后的代码:

    
    
    #include <iostream>
    
    using namespace std;
    
    typedef struct Lnode
    {
        int data;
        struct Lnode *next;
    } Lnode, *Linklist;
    
    int creat(Linklist &L)
    {
        L = new Lnode;
        L->next = NULL;
        Linklist p, q = L;
        while (1)
        {
            p = new Lnode;
            cin >> p->data;
            if (p->data == -1)
            {
                return 0;
            }
            p->next = NULL;
            q->next = p;
            q = p;
        }
    }
    
    void cmp(Linklist &L, int e)
    {
        Linklist p = L;
        if (p->next == NULL || e < p->next->data)
        {
            Linklist q = new Lnode;
            q->data = e;
            q->next = p->next;
            p->next = q;
        }
        else
        {
            while (p->next != NULL && e >= p->next->data)
            {
                p = p->next;
            }
            Linklist q = new Lnode;
            q->data = e;
            q->next = p->next;
            p->next = q;
        }
    }
    
    void Print(Linklist L)
    {
        Linklist p = L->next;
        while (p != NULL)
        {
            cout << p->data;
            if (p->next != NULL)
            {
                cout << " ";
            }
            p = p->next;
        }
    }
    
    int main()
    {
        int t;
        Linklist L;
        creat(L);
        while (1)
        {
            cin >> t;
            if (t == -1)
            {
                break;
            }
            cmp(L, t);
        }
        Print(L);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月18日
  • 已采纳回答 3月10日
  • 创建了问题 3月10日

悬赏问题

  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改