链栈的基本操作,进栈出现问题


//定义头文件
#include<stdio.h>
#include<malloc.h>
//定义元素类型
typedef char ElemType;
//定义链栈结点类型
typedef struct linknode
{
    ElemType data;
    struct linknode* next;
}LinkStNode;


//初始化链栈
int InitStack(LinkStNode*& s)
{
    //创建头结点
    s = (LinkStNode*)malloc(sizeof(LinkStNode));
    s->next = NULL;
}


//销毁栈
void ClearStack(LinkStNode*& s)
{
    //P指向栈顶元素
    LinkStNode* pre = s, * p = s->next;
    //循环到p为空
    while (p != NULL)
    {    //释放头结点
        free(pre);
        // P指针后移
        pre = p;
        p = pre->next;
        //此时pre指向尾结点,释放其空间
        free(pre);
    }
}


//求栈的长度
int StackLength(LinkStNode* s)
{    //P指向栈顶元素
    LinkStNode* p = s->next;
    int n;
    while (p != NULL)
    {   //长度加1
        n++;
        // P指针后移
        p->next = p;
    }
    //返回栈的长度
    return(n);
}


//判断栈是否为空
int StackEmpty(LinkStNode* s)
{
    return(s->next == NULL);
}


//进栈
void Push(LinkStNode*& s, ElemType e)
{
    //创建结点p
    LinkStNode* p;
    p = (LinkStNode*)malloc(sizeof(LinkStNode));
    // 给P数据域赋值
    p->data = e;
    //插入*p结点,使P作为第一个数据结点
    p->next = s->next;
    s->next = p;
}


//出栈
int Pop(LinkStNode*& s, ElemType& e)
{
    LinkStNode* p;
    //栈空的情况
    if (s->next == NULL)
        return false;
    //p指向第一个数据结点
    p = s->next;
    //保存出栈节点p的数据
    e = p->data;
    //删除p节点
    s->next = p->next;
    //释放p节点
    free(p);
    return 1;
}


//输出链栈
void DispStack(LinkStNode* s)
{
    LinkStNode* p;
    //p指向第一个数据结点
    p = s->next;
    while (p != NULL)
    {
        //输出P结点的数据
        printf("%c", p->data);
        //p后移
        p->next = p;
    }
    printf("\n");
}


int main()
{
    LinkStNode* s;
    ElemType e, a;
    int i;
    //调用InitStack()初始化栈
    printf("<1>初始化链栈\n");
    InitStack(s);
    printf("初始化链栈成功!\n");
    //调用StackEmpty()判断链栈是否为空
    printf("<2>栈为%s\n", (StackEmpty(s) ? "空" : "非空"));
    printf("<3>请输入%d个进栈元素:\n", 10);
    for (i = 0; i < 10; i++)
    {
        scanf("%c", &a);
        //调用Push()进栈
        Push(s, a);
    }

    //调用DispStack()输出栈
    DispStack(s);
    //调用StackEmpty()判断链栈是否为空
    printf("<4>栈为%s\n", (StackEmpty(s) ? "空" : "非空"));
    //调用StackLength()求链栈长度
    StackLength(s);
    printf("<5>出栈序列:");
    //调用Pop()使栈中元素出栈
    while (!StackEmpty(s))
    {
        Pop(s, e);
        printf("%c", e);
    }
    printf("\n");
    printf("<6>栈为%s\n", StackEmpty(s) ? "空" : "非空");
    printf("释放栈\n");
    ClearStack(s);
    return 1;
}

运行错误显示,忽略scanf返回值