Я изменил ваш код на
1) Инициализировать два poitners внутри main в 0, чтобы они могли быть распределены функцией push
2) Удалено приведение от malloc, так как это C, и оно не требуется.
3) Вы должны также отметить недостатки кода, как указано в aix. (Я не исправил их в примере ниже)
#include <stdio.h>
#include <stdlib.h>
typedef struct stack{
int data;
struct stack *next;
}STACK;
void push(STACK **head,STACK **tail,int n)
{
STACK *x;
if(*head==NULL)
{
(*head)=malloc(sizeof(STACK));
(*head)->data=n;
(*head)->next=NULL;
*tail=*head;
}
else
{
x=malloc(sizeof(STACK));
x->data=n;
x->next=NULL;
(*head)->next=x;
(*head)=(*head)->next;
}
}
void show(STACK *tail)
{
while(tail->next!=NULL)
{
printf("%d\n",tail->data);
tail=tail->next;
}
}
void pop(STACK **head,STACK *tail)
{
while(tail->next->next!=NULL)
tail=tail->next;
printf("pop: %d\n",(*head)->data);
*head=tail;
}
int main()
{
STACK *head = 0;
STACK* tail = 0;
push(&head,&tail,4);
push(&head,&tail,7);
push(&head,&tail,2);
pop(&head,tail);
show(tail);
return 0;
}