C语言栈实现代码中第二个while循环无法运行的原因排查
你的栈实现问题分析与修复方案
嘿,我一眼就瞅到问题出在哪了——pop函数的返回值逻辑完全搞反了,这直接导致第二个while循环根本没法正常执行!咱们一步步来捋清楚:
核心问题:pop函数的返回值错误
你定义的pop函数返回类型是int,但当前代码里的返回逻辑完全不符合主循环的预期:
- 当栈不为空、成功弹出元素时,你返回了
0——而主函数的while(pop(...))会把0当成“假”,直接跳过循环体,所以你看不到任何输出; - 当栈为空时,你返回了
NULL——这是个指针常量,会被隐式转换成非0的int值,反而会让循环继续执行,但这时候栈已经空了,逻辑完全混乱。
修复步骤
1. 修正pop函数的返回逻辑
把pop函数里的返回值全部调整为符合int类型的逻辑:
- 栈为空时,输出提示后返回0(表示弹出失败,终止循环);
- 成功弹出元素后返回1(表示弹出成功,让循环继续执行)。
2. 修正后的完整代码
#include <stdio.h> #include<stdlib.h> typedef struct STK_S{ char name[100]; struct STK_S *next; }STK; int push(STK **ppS, STK *pD); int pop(STK **ppS, STK *pD); int main(){ STK *pS, d; pS = NULL; while (1){ printf_s("Ime "); gets_s(d.name, 100); if (d.name[0] == 0) break; push(&pS, &d); } while (pop(&pS, &d)) printf_s("\n%s", d.name); return 0; } int push(STK **ppS, STK *pD){ STK *pt; pt = (STK *)malloc(sizeof(STK)); if (pt == NULL) return 0; *pt = *pD; pt->next = *ppS; *ppS = pt; return 1; } int pop(STK **ppS, STK *pD){ STK *pt; if (*ppS == NULL){ printf("Empty stack.\n"); return 0; // 栈空返回0,终止循环 } *pD = **ppS; pt = *ppS; *ppS = pt->next; free(pt); return 1; // 弹出成功返回1,继续循环 }
额外小提示
- 你的
push函数逻辑是对的,通过*pt = *pD;把传入的结构体值完整拷贝到新分配的栈节点里,没问题; - 使用
gets_s的时候要注意,输入的字符串长度不要超过99(因为name数组大小是100,需要留一个位置给字符串结束符\0)。
内容的提问来源于stack exchange,提问作者pollux552
相关产品推荐
相关产品推荐

