2017-09-20 2 views
-1

J'essaye d'implémenter une liste chaînée en C. Voici ma définition d'une structure de noeud, suivie d'une fonction pour ajouter un noeud à la fin de la liste liée.C- Essayer d'ajouter un noeud à la fin d'une liste chaînée provoque un plantage

struct Node{ 
    char *name; 
    struct Node *next; 
}; 
typedef struct Node Node; 

void addNode(Node *head, char n[100]){ 
    if(head->next == NULL){ 
     Node new; 
     new.name = n; 
     new.next = NULL; 
     head->next = &new; 
    } 
    else{ 
     addNode(head->next, n); 
    } 
} 

Je peux créer un nœud de tête et passer un pointeur pour dans la fonction addNode très bien d'ajouter un deuxième noeud à la liste chaînée. (Il vaut également la peine de mentionner que lorsque je crée un noeud head, je place son pointeur "next" sur NULL pour représenter la fin de la liste chaînée) Le problème semble être avec l'appel récursif à addNode dans la branche else de la fonction addNode, comme mon programme fonctionne sans s'écraser quand je le commente. Pourquoi est-ce que mon programme plante, et comment puis-je le réparer?

+2

Vous utilisez une variable locale dans 'addNode'. Il sort de la portée lorsque vous revenez de la fonction. Ainsi, la prochaine fois que vous appelez la fonction, cela peut provoquer un crash. Et plus loin, vous devez allouer de la mémoire séparée pour 'name' et utiliser strcpy pour copier' n' à 'name' – Karthick

+0

' Node new; -> Node * new = malloc (sizeof * new); '(changer d'autres affectations en conséquence), aussi vérifier si' head' lui-même est 'NULL'. –

Répondre

1
if(head->next == NULL){ 
    Node new; 
    new.name = n; 
    new.next = NULL; 
    head->next = &new; 
} 

Votre problème est en fait ici. La variable new a durée de stockage automatique, ce qui signifie qu'elle cesse d'exister à la fin du bloc dans lequel elle a été déclarée - dans ce cas, à l'accolade de fermeture à la fin de ce if().

Le pointeur que vous avez enregistré dans head->next pointe désormais vers un objet qui n'existe plus - ce que l'on appelle un "pointeur flottant". Lorsque vous utilisez plus tard le pointeur dangling, le comportement de votre programme n'est plus défini.

Vous voulez plutôt que d'allouer une Node qui perdurera au-delà de l'invocation de la fonction qui l'a créé - c'est ce que malloc() est utilisé pour:

if(head->next == NULL) { 
    Node *new = malloc(sizeof *new); 

    if (new) { 
     new->name = n; 
     new->next = NULL; 
     head->next = new; 
    } else { 
     /* malloc failed */ 
    } 
} 

L'objet créé avec malloc() a une durée de vie qui se prolonge jusqu'à ce que vous passez un pointeur vers free(), ce que vous feriez si vous supprimiez le nœud de la liste chaînée et que vous le supprimiez.