『啦啦啦』~~~ 2024-07-03 23:32 采纳率: 42.9%
浏览 6

C语言单链表尾插法当链表为空时

img

img

C语言单链表尾插法,如果链表一开始为空的情况下,这段代码要怎么改才能正确,cpp编译是正确的,但是C编译不对

  • 写回答

4条回答

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-07-03 23:32
    关注

    引自免费微信小程序:皆我百晓生

    首先,让我们解决您在C语言中的代码问题。在您提供的代码中,有几个问题需要修复:

    1. 在定义结构体时,您使用了“日”而不是标准的“typedef”。请更正此错误并使用正确的关键字。
    2. InsertTail函数中,检查链表是否为空的语句有误。您应该使用if (L == NULL)而不是if (L = NULL)
    3. 在分配新节点时,确保正确分配内存并设置新节点的值。此外,还要正确地将新节点插入链表的末尾。以下是修复后的代码:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct ListNode {
        int val;
        struct ListNode* next;
    } ListNode;
    
    void printList(ListNode* L) {
        ListNode* cur = L;
        while (cur != NULL) {
            printf("%d ", cur->val); // 注意这里应该是cur->val而不是cur->next->val
            cur = cur->next;
        }
    }
    
    void InsertTail(ListNode** L, int v) { // 注意这里使用二级指针来修改链表头指针
        if (*L == NULL) { // 检查链表是否为空
            *L = (ListNode*)malloc(sizeof(ListNode)); // 正确分配内存
            if (*L == NULL) { // 检查内存分配是否成功
                exit(EXIT_FAILURE); // 如果分配失败,则退出程序
            }
            (*L)->val = v; // 设置新节点的值
            (*L)->next = NULL; // 新节点是链表的最后一个节点,所以next指针为NULL
        } else { // 如果链表不为空,将新节点添加到链表的末尾
            ListNode* cur = *L; // 从链表头开始遍历
            while (cur->next != NULL) { // 找到链表的最后一个节点
                cur = cur->next;
            }
            ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); // 分配新节点的内存
            if (newNode == NULL) { // 检查内存分配是否成功
                exit(EXIT_FAILURE); // 如果分配失败,则退出程序
            }
            newNode->val = v; // 设置新节点的值
            newNode->next = NULL; // 新节点是链表的最后一个节点,所以next指针为NULL
            cur->next = newNode; // 将新节点添加到链表的末尾
        }
    }
    

    现在您可以使用此修复后的代码进行编译和运行。这段代码实现了单链表的尾插法,当链表为空时也能正确工作。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月3日