9
votes

C liste liée à l'insertion de nœud à la fin

J'ai des problèmes avec ma méthode d'insertion pour une liste liée à C. Il semble que ajouter uniquement au début de la liste. Toute autre insertion que je fais échoue. Et ce débogueur de codeBocks est si difficile à comprendre que je ne l'obtiens toujours pas. Cela ne me donne jamais de valeur, il suffit de s'adresser à la mémoire. Quoi qu'il en soit, c'est ma fonction. Voyez-vous une raison pour laquelle cela échoue? xxx pré>

puis dans la principale, seul 929 est ajouté. P>

   //testing addNodeBottom function
    addNodeBottom(929, head);
    addNodeBottom(98, head);
    addNodeBottom(122, head);
    addNodeBottom(11, head);
    addNodeBottom(1034, head);


5 commentaires

Il n'enfère toujours que le premier si je définis NEWNODE-> à côté de NULL


Après actuel-> suivant = newnode; faire une pause ;


Pouvez-vous mettre à jour le code avec la définition de structure pour nœud et la nouvelle ligne? De plus, comment savez-vous que c'est le cas?


Vous pouvez également garder un pointeur de queue pour rendre votre insertion à la fin de la liste simple et ne pas avoir à marcher sur la liste.


+1 d'accord, gardez le pointeur de la queue pour faire ajouter l'annexe O (1)


6 Réponses :


2
votes

Après que vous masloc code> a nœud code> Assurez-vous de définir nœud-> suivent = null code>.

int addNodeBottom(int val, node *head)
{    
    node *current = head;
    node *newNode = (node *) malloc(sizeof(node));
    if (newNode == NULL) {
        printf("malloc failed\n");
        exit(-1);
    }    

    newNode->value = val;
    newNode->next = NULL;

    while (current->next) {
        current = current->next;
    }    
    current->next = newNode;
    return 0;
}    


1 commentaires

Mais ce n'est pas la seule erreur, f.e. Il y a une pause manquante; dans le pendant boucle aussi.



12
votes

Ce code fonctionnera. La réponse de SampleBias est presque correcte, mais vous avez besoin d'un troisième changement:

  node *current = head;
  while (current->next != NULL) {
    current = current->next;
  }
  current->next = newNode;
  printf("added later\n");


2 commentaires

Pourquoi utilisons-nous Malloc? Pourquoi ne pas simplement créer une nouvelle variable du nœud type, obtenir son pointeur et la définir comme suivant.


@AbhinavmanChanda Malloc attribue de l'espace sur le tas qui est persistant parmi les appels de fonction. Si nous allions », créez simplement une nouvelle variable du nœud type, obtenez son pointeur et définissez-le comme suit." L'espace a été attribué dans le cadre de la pile de la fonction, de sorte que le pointeur signalait quelque part Dans le cadre de la pile de cette fonction. Une fois que nous avons appuyé sur la déclaration de retour, le cadre de la pile est distribué, nous laissant avec un pointeur qui pointe nulle part en sécurité.



0
votes

Je voudrais mentionner la clé avant d'écrire le code pour votre considération.

// clé

TEMP = adresse du nouveau nœud attribué par la fonction MALLOC (Membre OD Alloc.h Bibliothèque en C)

ADRESSE DU NOUVEAU DE LA LISTE DE LIEN. .

Suivant = contient l'adresse du nœud suivant xxx


0 commentaires

0
votes

Le nouveau nœud est toujours ajouté après le dernier nœud de la liste liée donnée. Par exemple, si la liste liée donnée est de 5-> 10-> 15-> 20-> 25 et que nous ajoutons un élément 30 à la fin, la liste liée devient alors 5-> 10-> 15-> 20-> 25- > 30. Étant donné qu'une liste liée est typiquement représentée par la tête de celui-ci, nous devons traverser la liste jusqu'à la fin, puis modifier le prochain nœud en dernier nœud.

/* Given a reference (pointer to pointer) to the head
   of a list and an int, appends a new node at the end  */


    void append(struct node** head_ref, int new_data)
    {
    /* 1. allocate node */
         struct node* new_node = (struct node*) malloc(sizeof(struct node));

        struct node *last = *head_ref;  /* used in step 5*/

    /* 2. put in the data  */
        new_node->data  = new_data;

    /* 3. This new node is going to be the last node, so make next 
          of it as NULL*/
        new_node->next = NULL;

    /* 4. If the <a href="#">Linked List</a> is empty, then make the new node as head */
        if (*head_ref == NULL)
        {
       *head_ref = new_node;
       return;
        }  

    /* 5. Else traverse till the last node */
        while (last->next != NULL)
        last = last->next;

    /* 6. Change the next of last node */
        last->next = new_node;
        return;    
}


0 commentaires

0
votes

Cela fonctionne bien: xxx

exemple d'utilisation: xxx


0 commentaires

1
votes

Je sais que c'est un ancien post mais juste pour référence. Voici comment ajouter sans contrôle spécial pour une liste vide, bien que, au détriment du code de recherche plus complexe.

void Append(List * l, Node * n)
{
    Node ** next = &list->Head;
    while (*next != NULL) next = &(*next)->Next;
    *next = n;
    n->Next = NULL;
}


0 commentaires