我这个栈系统为什么显示不了出栈不了最后一个元素【c语言】

#include<stdio.h>
#include<malloc.h>
#define MAXSIEZE
typedef int DataType;
typedef struct stacknode
{
	DataType data;
	struct stacknode *next;
} LinkStack ;

LinkStack *InitStack()
{
	LinkStack *S;
	S=NULL;
	return S;
}

int EmptyStack(LinkStack *S)
{
	if(S==NULL)
	return 1;
	else
	return 0;
}

LinkStack *Push(LinkStack *S,DataType x)
{
	LinkStack *p;
	p=(LinkStack *)malloc(sizeof(LinkStack));
	p->data=x;
	p->next=S;
	S=p; 
	return S;	
}

LinkStack *Pop(LinkStack *s,DataType *x)
{
	LinkStack *p;
	if(EmptyStack(s))
	{
		printf("栈空,不能出栈");
		return NULL; 
	}
	else
	{
		*x=s->data;
		p=s;
		s=s->next;
		free(p);
		return s;
	}
}

int GetTop(LinkStack *s,DataType *x)
{
	if(EmptyStack(s))
	{
		printf("栈空");
		return 0; 
	}
	else
	{
		*x=s->data;
		return 1;
	}
 } 


void ShowStack(LinkStack *s)
{
	LinkStack *p=s;
	if(p==NULL)
	printf("\t栈空");
	else
	{
		printf("从栈顶元素起栈中元素为; ");
		while(p!=NULL)
		{
			printf("%d",p->data) ;
			p=p->next;
		}
	 } 
}


void DB(LinkStack *s ,DataType x)
{
	while(x)
	{
		s=Push(s,x%2);
		x/=2;
	}
	printf("转换后的二进制数为; ");
	while(!EmptyStack(s))
	{
		s=Pop(s,&x);
		printf("%d",x);
	}
}

void menu()
{
	printf("\n[             栈子系统                ]");
	printf("\n=======================================");
	printf("\n[          1 初始化栈                 ]");
	printf("\n[          2 入栈操作                 ]");
	printf("\n[          3 出栈操作                 ]");
	printf("\n[          4 求栈顶元素               ]");
	printf("\n[          5 显示栈中元素             ]");
	printf("\n[          6 十,二进制转换           ]");
			printf("\n请输入菜单号(0--6)");	
}




main()
{
	int i,n,flag;
	LinkStack *s;
	DataType x;
	char ch1,ch2,a;
	ch1='y';
	while(ch1=='y'||ch1=='Y')
	{
		menu();
		scanf("%c",&ch2);
		getchar();
		switch(ch2)
		{
			case'1':
			s=InitStack();
			printf("栈的初始化完成");
			break;
			case'2':
				printf("请输入要入栈的元素个数");
				scanf("%d",&n);
				printf("请输入%d个整数进行入栈",n);
				for(i=0;i<n;i++)
			{
				
				scanf("%d",&x);
				s=Push(s,x);
			}
			printf("入栈成功");
			break;
			case'3':
			printf("请输入要进行出栈的元素个数;");
			scanf("%d",&n);
			printf("出栈的元素为:"); 
				for(i=0;i<n;i++)
			{
				s=Pop(s,&x);
				if(s!=NULL)
				printf("%5d",x);
			}
			break;
			case'4':
				if(flag=GetTop(s,&x))
				printf("当前栈顶元素为%d",x);
				break;
			case'5':
			ShowStack(s);
			break;
			case'6':
			s=InitStack();
			printf("请输入整数:");
			scanf("%d",&x);
			DB(s,x);
			break;
			case'0':
				ch1='n';
				break;
				default:
				printf("请重新输入整数(0-5)");
		 } 
		 if(ch2!='0') 
		 {
		 	printf("\n按回车继续,任意键返回主菜单\n");
		 	a=getchar();
		 	if(a!='\xA')
		 	{
		 		getchar();
		 		ch1='n';
			 }
		 }
	}
}

出栈到最后一位时不显示

入栈3个元素1 2 3

出栈3个元素 只能看见3 2

结果难道不应该是3 2 1 吗?

再出栈一个发现栈空

 

怎么才能显示出栈的所有元素

int EmptyStack(LinkStack *S)
{
    if(S==NULL)
    return 1;
    else
    return 0;
}

LinkStack *Push(LinkStack *S,DataType x)
{
    LinkStack *p;
    p=(LinkStack *)malloc(sizeof(LinkStack));
    p->data=x;
    p->next=S;
    S=p; 
    return S;    
}

LinkStack *Pop(LinkStack *s,DataType *x)
{
    LinkStack *p;
    if(EmptyStack(s))
    {
        printf("栈空,不能出栈");
        return NULL; 
    }
    else
    {
        *x=s->data;
        p=s;
        s=s->next;
        free(p);
        return s;
    }
}

这是其他输入输出的代码

你好,我是有问必答小助手。为了技术专家团更好地为您解答问题,烦请您补充下(1)问题背景详情,(2)您想解决的具体问题,(3)问题相关代码图片或者报错信息。便于技术专家团更好地理解问题,并给出解决方案。

您可以点击问题下方的【编辑】,进行补充修改问题。