C语言链表实现栈的display函数重复打印最后节点无法停止如何解决
链表栈display函数死循环问题修复方案
问题根因
出现无限重复打印最后一个节点的核心原因是第一次插入节点时链表形成自环,执行逻辑冲突点如下:
- 调用
create()创建第一个新节点时,因为全局变量first初始为NULL,create()内部会直接将first、last都赋值为当前新节点 - 回到
push()函数后,执行newnode->next = first,此时first已经是当前新节点本身,导致第一个节点的next指针指向自己 - 后续插入新节点时,旧的首节点(自环节点)的
next指针始终指向自己,display遍历到该节点后永远无法遇到NULL结束条件,就会无限循环打印该节点的值
修复方法
删除create()函数中处理first、last初始化的逻辑即可,栈采用头插法实现,push逻辑本身已经能正确处理首节点初始化,不需要create()额外操作:
修正后的create函数代码
struct node * create() { newnode = (struct node *) malloc(sizeof(struct node)); if (newnode == NULL) { printf("Memory is not allocated\n"); return NULL; // 补充malloc失败时的返回值,避免未定义行为 } printf("Enter data: "); scanf("%d", &newnode->data); newnode->next = NULL; // 移除原有if (first == NULL) { first = last = newnode; }逻辑 return newnode; }
补充push函数的空指针判断
为了避免create返回空指针时出现非法访问,建议补充判断逻辑,如果需要保留last全局变量也可以在这里统一初始化:
void push() { newnode = create(); if (newnode == NULL) { return; } newnode->next = first; first = newnode; // 保留last指针的情况下补充首节点初始化逻辑 if (last == NULL) { last = newnode; } }
其他可选优化建议
- 将遍历用的
temp指针改为display函数的局部变量,避免全局变量被多函数修改导致异常 pop操作时补充free调用释放被弹出节点的内存,避免内存泄漏- 将
main函数返回值改为int,结束时return 0,符合C语言标准规范
内容的提问来源于stack exchange,提问作者EpycZen
相关产品推荐
相关产品推荐

