C语言链表显示问题:访问节点时出现段错误
链表添加节点失败问题分析与修复
你遇到的问题核心是**add函数没有正确将新节点链接到链表尾部**,仅修改了局部临时指针的指向,新节点并未真正加入链表,导致后续无法访问这些节点——内存没有被释放,只是变成了无法追踪的游离内存。
错误点解析
在add函数中,你通过while循环遍历到temp1为NULL(链表尾部之后的位置),然后执行temp1 = new。但temp1是局部变量,这个赋值只会改变temp1自身的指向,不会修改原链表最后一个节点的nextNode指针。原链表尾部节点的nextNode依然是NULL,新节点和链表完全没有关联。
修复后的代码
#include <stdio.h> #include <stdlib.h> struct node { int data; struct node *nextNode; }; struct node *head; void add(int data) { struct node *new = (struct node *)malloc(sizeof(struct node)); new->data = data; new->nextNode = NULL; // 处理链表为空的边界情况 if (head == NULL) { head = new; return; } struct node *temp1 = head; // 遍历到链表最后一个节点(而非遍历到NULL) while (temp1->nextNode != NULL) { temp1 = temp1->nextNode; } // 将最后一个节点的nextNode指向新节点,完成链接 temp1->nextNode = new; } void printList() { int i = 1; struct node *tempP = head; while (tempP != NULL) { printf("第%d个元素的数据是:%d\n", i, tempP->data); tempP = tempP->nextNode; i++; } } // main函数标准返回类型为int int main() { head = (struct node *)malloc(sizeof(struct node)); head->data = 10; head->nextNode = NULL; add(20); add(30); add(40); printList(); // 释放链表内存,避免内存泄漏 struct node *temp; while (head != NULL) { temp = head; head = head->nextNode; free(temp); } return 0; }
额外优化说明
- 打印指针地址时,应使用
%p格式符而非%d,%d仅用于打印整数,指针地址用%p才符合标准。 main函数的标准返回类型是int,而非void,程序正常结束时需返回0。- 修复代码添加了链表内存释放逻辑,避免长期运行导致内存泄漏。
内容的提问来源于stack exchange,提问作者kuwira
相关产品推荐
相关产品推荐

