C语言链表插入操作异常 printNodes无法打印前两个节点问题求助
问题根因
你的代码核心错误出在insertEnd函数的返回值逻辑:
- 该函数声明的返回值类型为
struct node *,但仅在head == NULL(链表为空,插入第一个节点)的分支返回了新建节点指针 - 当链表非空完成尾插操作后,没有主动返回任何值,此时你调用
head = insertEnd(xxx, head)赋值时,写入head的是内存中的不确定野值,直接把原合法头指针覆盖为非法地址,导致前面的节点地址丢失,自然无法打印前两个节点的信息。
修复方法
仅需要在insertEnd函数的非空分支末尾,补充返回原头指针即可,修改后的代码如下:
struct node *insertEnd(int data, struct node *head) { struct node *temp = makeNode(data); if (head == NULL) { return temp; } struct node *loop = head; while (loop->next) { loop = loop->next; } loop->next = temp; return head; // 补充返回原头指针 }
额外优化建议
- 可以在
makeNode函数中对malloc的返回值做判空处理,避免内存申请失败时的空指针访问风险 - 程序结束后可以遍历链表释放所有申请的堆内存,避免内存泄漏
修改后重新运行即可正常输出所有节点信息,末尾打印头节点数据的语句也能正常输出5。
内容的提问来源于stack exchange,提问作者user15959888
相关产品推荐
相关产品推荐

