c语言实现链栈的基本操作


#include<stdio.h>
#include<stdlib.h>
#define max 6
typedef struct linkstack
{
    int val;
    struct linkstack *next;
}stack;
stack *p,*head;
stack* init(stack *p)
{
    p=NULL;
    return p;
}
void push(stack *p,int data)
{
    p->val=data;
}
int empty(stack *p)
{
    return p==NULL;
}
int pop(stack *p)
{
    if(empty(p))
    exit(0);
    else
    {
        return p->val;
    }
}
int main()
{
    int i;
    int data;
    head=(stack*)malloc(sizeof(stack));
    head=init(head);
    for(i=0;i<max;i++)
    {
        p=(stack*)malloc(sizeof(stack));
        scanf("%d",&data);
        push(p,data);
        head->next=p;
        head=p;
    }
    int t;
    for(i=0;i<max;i++)
    {
        t=pop(head);
        head=head->next;
        printf("%d ",t);
    }    
}

链栈的基本操作,初始化,入栈、判空、出栈、为什么没有输出结果?

供参考:

#include<stdio.h>
#include<stdlib.h>
#define max 6
typedef struct linkstack
{
    int val;
    struct linkstack *next;
}stack;
stack *p=NULL,*head=NULL;      //修改

//stack* init(stack *p) 这个函数多余
//{
//    p=NULL;
//    return p;
//}
stack* push(stack *head,int data) //void push(stack *p,int data)//修改
{
    stack* p=(stack*)malloc(sizeof(stack));  //修改
    p->val=data;                             //修改
    p->next=head;                            //修改
    head=p;                                  //修改
    return head;
}
int empty(stack *p)
{
    return p==NULL;
}
int pop(stack**p)    //修改
{
    int data;
    if(empty((*p)))        //修改
       return 0;  //exit(0); 修改
    else
    {
        stack* pt=(*p);    //修改
        (*p)=(*p)->next;   //修改
        data=pt->val;      //修改
        free(pt);          //修改
        return data;       //修改
    }
}
int main()
{
    int i;
    int data;
    //head=(stack*)malloc(sizeof(stack)); 多余
    //head=init(head);                    多余
    for(i=0;i<max;i++)
    {
        scanf("%d", &data);
        head=push(head,data);            //修改
    }
    int t;
    for(i=0;i<max;i++)
    {
        t=pop(&head);  //修改
        if (t)             //head=head->next; //修改
            printf("%d ",t);
        else                                  //修改
            printf("栈已空!\n");             //修改
    }
    return 0;
}