C语言栈的实现,显示栈元素的时候输出是这样的,有谁能看一下吗?

img

#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct LinkStack {
datatype data;
struct LinkStack* next;
}LinkStack;
LinkStack* InitStack() {
LinkStack* top;
top = NULL;
printf("初始化成功\n");
return top;
}
int EmptyStack(LinkStack* top) {
if (top == NULL)
return 1;
else
return 0;
}
void GetTop(LinkStack* top) {
LinkStack* p;
p = (LinkStack*)malloc(sizeof(LinkStack));
p = top;
if (EmptyStack(p)) {
printf("栈空\n");
}
else {
printf("栈顶元素为%d\n", p->data);
}
}
LinkStack* Push(LinkStack top) {
LinkStack
p;
p = (LinkStack*)malloc(sizeof(LinkStack));
if(p){
printf("请输入数据:\n");
scanf_s("%d", &p->data);
p->next = top;
top = p;
printf("进栈成功\n");
GetTop(top);
return top;
}
}
LinkStack* Pop(LinkStack* top) {
LinkStack* p;
if (EmptyStack(top)) {
printf("栈空\n");
return NULL;
}
else {
p = top;
top = top->next;
free(p);
printf("出栈成功\n");

    return top;
}

}
void ShowStack(LinkStack* top) {
LinkStack* p;
if (EmptyStack(top)) {
printf("栈为空\n");
}
else {
p = top;
printf("栈顶到栈底元素为:\n");
while (p) {
printf("%d ",p->data);
p = p->next;
}
}
}
int main() {
LinkStack* top;
top = (LinkStack*)malloc(sizeof(LinkStack));
InitStack();
EmptyStack(top);
Push(top);
Push(top);
ShowStack(top);
EmptyStack(top);
Pop(top);
ShowStack(top);
return 0;
}

修改处见注释,供参考:

#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct LinkStack {
    datatype data;
    struct LinkStack* next;
}LinkStack;
LinkStack* InitStack() {
    LinkStack* top;
    top = NULL;
    printf("初始化成功\n");
    return top;
}
int EmptyStack(LinkStack* top) {
    if (top == NULL)
        return 1;
    else
        return 0;
}
void GetTop(LinkStack* top) {
    LinkStack* p;
    //p = (LinkStack*)malloc(sizeof(LinkStack)); //修改
    p = top;
    if (EmptyStack(p)) {
        printf("栈空\n");
    }
    else {
        printf("栈顶元素为%d\n", p->data);
    }
}
LinkStack* Push(LinkStack* top) {
    LinkStack* p;
    p = (LinkStack*)malloc(sizeof(LinkStack));
    p->next = NULL;   //修改
    if (p) {
        printf("请输入数据:\n");
        scanf_s("%d", &p->data);
        p->next = top;
        top = p;
        printf("进栈成功\n");
        GetTop(top);
        return top;
    }
}
LinkStack* Pop(LinkStack* top) {
    LinkStack* p;
    if (EmptyStack(top)) {
        printf("栈空\n");
        return NULL;
    }
    else {
        p = top;
        top = top->next;
        free(p);
        printf("出栈成功\n");

        return top;
    }
}
void ShowStack(LinkStack* top) {
    LinkStack* p;
    if (EmptyStack(top)) {
        printf("栈为空\n");
    }
    else {
        p = top;
        printf("栈顶到栈底元素为:\n");
        while (p) {
            printf("%d ", p->data);
            p = p->next;
        }
    }
}
int main() {
    LinkStack* top;
    //top = (LinkStack*)malloc(sizeof(LinkStack));//修改
    top = InitStack(); //修改
    EmptyStack(top);  
    top = Push(top);   //修改
    top = Push(top);   //修改
    ShowStack(top);
    EmptyStack(top);
    top = Pop(top);// Pop(top);//修改
    ShowStack(top);
    return 0;
}