

C语言单链表尾插法,如果链表一开始为空的情况下,这段代码要怎么改才能正确,cpp编译是正确的,但是C编译不对
关注引自免费微信小程序:皆我百晓生
首先,让我们解决您在C语言中的代码问题。在您提供的代码中,有几个问题需要修复:
InsertTail函数中,检查链表是否为空的语句有误。您应该使用if (L == NULL)而不是if (L = NULL)。#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; // 将新节点添加到链表的末尾
}
}
现在您可以使用此修复后的代码进行编译和运行。这段代码实现了单链表的尾插法,当链表为空时也能正确工作。