请各位朋友帮我看看这段程序!!改了好多遍就是不知道问题到底出在哪了

请各位朋友帮我看看!!我这段代码到底是哪出了问题。
我在实现出栈的时候为什么会失败啊

#include
#include
#include

    typedef int datatype;
    typedef struct stackline
    {
        struct stackline * next;
        datatype data;
    }stack;
    
    void initstack(stack * top)
    {
        top = NULL;
    }
    void push(stack * top, datatype x )
    {
        stack * s = (stack *)malloc(sizeof(stack));
        s -> data = x;
        s -> next = top;
        top = s;
        
    }
    int pop(stack * top, datatype * ptr)
    {
        stack * p = top;
        if (top == NULL)
        {
            printf("faled");
            return 0;
        }
        * ptr = top -> data;
        top = top -> next;
        free(p);
        return 1;
    }
    
    int main()
    {
        datatype a = 15,b = 16,c = 17;
        stack * top = NULL;
        datatype *ptr = 0;
        initstack(top);
        push(top, a);
        
        pop(top, ptr);
        
        return 0;
    }
    ****
  • 代码改了下,这版可以运行

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
 
typedef int datatype;
typedef struct stackline
{
    struct stackline * next;
    datatype data;
} stack;

void initstack(stack * top)
{
    top = NULL;
}
stack * push(stack * top, datatype x )
{
    stack * s = (stack *)malloc(sizeof(stack));
    s -> data = x;
    s -> next = top;
    top = s;
    return top;
}
int pop(stack * top, datatype * ptr)
{
    stack * p = top;
    if (top == NULL)
    {
        printf("faled");
        return 0;
    }
    * ptr = top -> data;
    top = top -> next;
    free(p);
    return 1;
}

int main()
{
    datatype a = 15,b = 16,c = 17;
    stack * top;
    datatype *ptr;
    //initstack(top);
    top = push(top, a);
    printf("%d", pop(top, ptr));
    
    return 0;
}

题主的代码修改如下,供参考:

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

typedef int datatype;
typedef struct stackline
{
    struct stackline* next;
    datatype data;
}stack;

void initstack(stack** top)  //修改  void initstack(stack* top)
{
    (*top) = NULL;  //修改 top = NULL;   
}
void push(stack** top, datatype x) //修改  void push(stack* top, datatype x)
{
    stack* s = (stack*)malloc(sizeof(stack));
    s->data = x;
    s->next = (*top); //修改 s->next = top;
    (*top) = s;       //修改 top = s; 

}
int pop(stack** top, datatype* ptr)  //修改 int pop(stack* top, datatype* ptr)
{
    stack* p = (*top);  //修改 stack* p = top;
    if ((*top) == NULL)
    {
        printf("faled");
        return 0;
    }
    *ptr = (*top)->data; //修改 *ptr = top->data;
    (*top) = (*top)->next;//修改 top = top->next;
    free(p);
    return 1;
}

int main()
{
    datatype a = 15, b = 16, c = 17;
    stack* top = NULL;
    datatype ptr = 0;  //datatype* ptr = 0; 修改

    initstack(&top); //修改  initstack(top); 

    push(&top, a);    //修改  push(top, a);  
    push(&top, b);
    push(&top, c);

    pop(&top, &ptr);   //修改  pop(top, ptr); 
    printf("%d\n", ptr); //修改 

    pop(&top, &ptr); 
    printf("%d\n", ptr);

    pop(&top, &ptr);   
    printf("%d\n", ptr);

    return 0;
}