在C中创建pop()函数堆栈实现

在C中创建pop()函数堆栈实现,c,char,stack,scanf,singly-linked-list,C,Char,Stack,Scanf,Singly Linked List,我的程序从用户输入创建一个字符堆栈,以星号结尾。PopAll()可以完美地逐个弹出每个元素,但重复使用pop()则不行。我不明白这是怎么回事,因为popAll()只是在引擎盖下使用pop() 谁能告诉我出了什么问题吗 #include <stdio.h> #include <stdlib.h> struct NODE { char value; struct NODE *prev; }; void push(char); void pop(); voi

我的程序从用户输入创建一个字符堆栈,以星号结尾。PopAll()可以完美地逐个弹出每个元素,但重复使用pop()则不行。我不明白这是怎么回事,因为popAll()只是在引擎盖下使用pop()

谁能告诉我出了什么问题吗

#include <stdio.h>
#include <stdlib.h>

struct NODE {
    char value;
    struct NODE *prev;
};

void push(char);
void pop();
void popAll();

int checkTerminator(char);

struct NODE *TOP = NULL;

int main()
{
    char input;
    
    while(checkTerminator(input) == 0){
        scanf("%c", &input);
        if(checkTerminator(input) == 0){
            push(input);
        }
    }
    
    printf("\nOutput:\n");

    // Doesn't pop three elements
    pop();
    pop();
    pop();

    // Succesfully pops all elements
    // popAll();

}

int checkTerminator(char value){
    switch(value){
        case '*':
            return 1;
        default:
            return 0;
    }
}

void push(char value){
    struct NODE *CURRENT = (struct NODE*) malloc(sizeof(struct NODE));

    CURRENT->value = value;
    CURRENT->prev = TOP;
    TOP = CURRENT;
}

void pop(){
    printf("%c", TOP->value);
    TOP = TOP->prev;
}

void popAll(){
    while(TOP != NULL){
        pop();
    }
}

#包括
#包括
结构节点{
字符值;
结构节点*prev;
};
无效推送(char);
void pop();
void popAll();
int校验终止符(char);
结构节点*TOP=NULL;
int main()
{
字符输入;
while(检查终止符(输入)==0){
scanf(“%c”,&input);
如果(检查终止符(输入)==0){
推(输入);
}
}
printf(“\n输出:\n”);
//不流行三种元素吗
pop();
pop();
pop();
//成功地弹出所有元素
//popAll();
}
int校验终止符(字符值){
开关(值){
案例“*”:
返回1;
违约:
返回0;
}
}
无效推送(字符值){
结构节点*当前=(结构节点*)malloc(sizeof(结构节点));
当前->值=值;
当前->上一个=顶部;
TOP=电流;
}
void pop(){
printf(“%c”,顶部->值);
TOP=TOP->prev;
}
void popAll(){
while(TOP!=NULL){
pop();
}
}

对于启动器,while循环具有未定义的行为,因为变量
输入未初始化且具有不确定的值

char input;

while(checkTerminator(input) == 0){
在调用
scanf

scanf(" %c", &input);
      ^^^^
否则,您将读取空白字符,例如新行字符
'\n'

函数
pop
产生内存泄漏,因为它不释放分配的节点

void pop(){
    printf("%c", TOP->value);
    TOP = TOP->prev;
}
函数
checkTerminator
可以编写得更简单。比如说

int checkTerminator( char c )
{
    return c == '*';
}

除了弗拉德指出的问题外,我发现:

void pop(){
    printf("%c", TOP->value);
    TOP = TOP->prev;
}
如果
TOP
为空或不为空,则不进行检查。最后,它变为NULL,您最终访问NULL ponter,这将给您带来分段错误。(如果只调用pop()多次)