Pouvez-vous me dire ce que j'ai fait de mal? J'obtiens une erreur SIGSEGV (Segmentation fault). La liste chaînée unique est-elle le meilleur moyen d'implémenter un type de données abstrait de pile? J'essaie de ne pas utiliser de variables globales, c'est pourquoi j'ai utilisé des doubles pointeurs.Empiler le type de données abstrait dans C
#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)
{
if(tail!=NULL)
{
printf("From tail to head:\n");
while(tail!=NULL)
{
printf("%d\n",tail->data);
tail=tail->next;
}
}
else
{
printf("The stack is empty!\n");
}
}
void pop(STACK **head,STACK *tail)
{
STACK *x;
if(*head!=tail)
{
x=*head;
while(tail->next->next!=NULL)
tail=tail->next;
printf("pop: %d\n",(*head)->data);
*head=tail;
free(x);
}
else
{
printf("pop: %d\n",(*head)->data);
free(*head);
*head=NULL;
}
}
int main()
{
STACK *head = NULL;
STACK *tail = NULL;
push(&head,&tail,4);
pop(&head,tail);
push(&head,&tail,7);
push(&head,&tail,9);
show(tail);
return 0;
}
J'ai édité le code, maintenant cela fonctionne. Merci tout le monde!!!
ne pas convertir le résultat de malloc en C. Seulement en C++. – Lefteris