为什么咱的链栈长度为0呢

为什么链栈长度出来为0

#include
#include
typedef int ElemType;
typedef struct liStackNode
{
    ElemType data;
    struct liStackNode *next;
}  liStack;
liStack * InitStack(liStack *Q){
     Q=(liStack*)malloc(sizeof(liStack));                     
     Q->next = NULL;                     
        return Q;
}
int StackLength(liStack *s){
    int i=0;   //统计长度变量
    liStack *p;
     p=s->next;                     //从头结点的下一个结点开始
    while(p!=NULL){
         i++;                
         p=p->next;                
    }
    return(i);
}
bool StackEmpty(liStack *Q){
    return(Q->next==NULL);
}
void Push(liStack *s,char e){
    liStack *p;
     p=(liStack *) malloc(sizeof(liStack));                          //建立新结点
     p->data = e;                          //数据放入新结点
     p->next = s->next;                          //修改结点指针
     p->next = p;                      
}
char Pop(liStack *s,char e){
    liStack *p;
    if(s->next==NULL)
        return 0;
     p=s->next;                
     e=p->data;                      //取值
     s->next=p->next;                
     free(p);                     //释放空间
    return e;
}
char GetTop(liStack *s,char e){
    if(s->next==NULL)
        return 0;
    e=s->next->data;
    return e;
}
void DispStack(liStack *s){
    liStack *p=s->next;
    while(p!=NULL){
        printf("%c ",p->data);
        p=p->next;
    }
    printf("\n");
}
liStack * ClearStack(liStack *s){
    liStack *p=s->next;
    while(p!=NULL){
        free(s);
         s=p;              
         p=p->next;
         }
       s->next=NULL;
    return s;
    }
    void DestoryStack(liStack *&s)
{  
    liStack *pre=s,*p=s->next;
    while (p!=NULL)
    {    
        free(pre);
        pre=p;
        p=pre->next;
    }
    free(pre);
    free(p);
    free(s);
}
main(){
    char e;
    liStack *s;
    printf("(1)初始化栈stack\n");
    s=InitStack(s);
    printf("(2)栈为%s\n",(StackEmpty(s)?"空":"非空"));
    printf("(3)依次进栈元素: A, B, C, D, E\n");
    Push(s,'A');
    Push(s,'B');
    Push(s,'C');
    Push(s,'D');
    Push(s,'E');
    printf("(4)栈为%s\n",(StackEmpty(s)?"空":"非空"));
    printf("(5)栈长度:%d\n",StackLength(s));
    printf("(6)显示从栈顶到栈底元素(不删除):");
    DispStack(s);
    printf("(7)出栈序列:");
    while(!StackEmpty(s)){
        e=Pop(s,e);
        printf("%c ",e);
    }
    printf("\n");
    printf("(8)栈为%s\n",(StackEmpty(s)?"空":"非空"));
    printf("(9)依次进栈元素: P, T, U\n");
    Push(s,'P');
    Push(s,'T');
    Push(s,'U');    
    printf("(10)清空栈!\n");
    s=ClearStack(s);
    printf("(11)栈为%s\n",(StackEmpty(s)?"空":"非空"));
    printf("(12)销毁栈!\n");
    DestoryStack(s);
}     

运行结果长度为0

和别人比对过后和自己审查也没发现错误

结果应该是5,大家可以帮忙看看吗

第一,进栈的元素类型错误,应该用int型或者直接改typedef char ElemType 更方便,另外进栈有误,应该改为p->next=s->next; s->next=p

img

Push函数里都没有用到s指针,你传了个寂寞啊
p->next=s->next是要干啥,你能解释解释吗