Emstackr le type de données abstrait en C

Pouvez-vous s’il vous plaît me dire ce que j’ai mal fait? Je reçois une erreur SIGSEGV (erreur de segmentation). La liste chaînée unique est-elle le meilleur moyen d’implémenter un type de données abstrait de stack? J’essaie de ne pas utiliser de variables globales, c’est pourquoi j’ai utilisé des doubles pointeurs.

#include  #include  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 ça marche. Merci tout le monde!!!

Le problème le plus immédiat est que vous n’initialisez jamais la head et la tail dans main() :

 STACK *head = NULL; STACK *tail = NULL; 

Il y a plusieurs autres problèmes:

  1. pop() perd de la mémoire.
  2. show() ne fonctionnera pas si la liste est vide (ie la tail est NULL ).
  3. Lorsque la liste n’est pas vide, show() ne parvient pas à imprimer l’un de ses éléments.

Dès la sortie, la head et la tail sont pas initialisées. Ce sera un non-départ dès le début.

J’ai changé ton code en

1) Initialiser à 0 les deux poisortingnes à l’intérieur de main afin qu’ils puissent être atsortingbués par la fonction push

2) Suppression du casting de malloc puisqu’il s’agit du C et que ce n’est pas obligatoire.

3) Vous devriez également noter les lacunes du code, comme indiqué par aix. (Je ne les ai pas corrigés dans l’exemple ci-dessous)

 #include  #include  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; }