2012-02-09 2 views
1

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!!!

+1

ne pas convertir le résultat de malloc en C. Seulement en C++. – Lefteris

Répondre

2

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

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

Il y a plusieurs autres problèmes:

  1. pop() mémoire de fuites.
  2. show() ne fonctionnera pas si la liste est vide (c'est-à-dire tail est NULL).
  3. Lorsque la liste n'est pas vide, show() ne parvient pas à imprimer l'un de ses éléments.
+0

Je vais devoir regarder le code plus maintenant mais je pense qu'il est initialisé à l'intérieur de la poussée. Puisqu'il accepte un pointeur de double pile et le place dans celui-ci – Lefteris

+0

@Lefteris: Croyez-moi, ce n'est pas le cas. – NPE

+0

oui vous avez raison car il n'initialise pas les deux poitners à 0 au début. Si c'est le cas, ils devraient être initialisés à l'intérieur de la poussée. – Lefteris

2

À la sortie de la porte, head et tail ne sont pas initialisés. Cela va être un non-aller depuis le début.

0

j'ai changé votre code pour

1) Initialiser les deux poitners à l'intérieur principal à 0 pour, car ils peuvent être affectés par la fonction push

2) Suppression de la coulée de malloc c'est C et il est non requis.

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

#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; 
} 
Questions connexes