You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:24:30