2016-10-25 5 views
1

Kann nicht scheinen, was ich hier vermisse. Ich weiß, wie man richtig einen neuen Knoten am Anfang meiner verkettete Liste einzufügen:Endknoten zur verketteten Liste hinzufügen

void InsertBeginning(int val) { 
     Node *n = new Node(); 
     n->data = val;    
     n->next = A;   

     A = n;  
     DisplayList(); //prints list 
} 

Und nun wünsche ich das Gleiche zu tun, aber am Ende meiner Liste, so dann ich dies gemacht:

void AddNode(int val) { 
     Node *n = new Node(); 
     n->data = val; 
     n->next = A; 

     //finds last empty node 
     while (n->next != NULL) { 
      n = n->next; 
     } 

     A = n; 

     DisplayList(); 
} 

Aber das alles löscht alles außer meinem ersten Knoten.

Antwort

4

Gehen Sie die Liste herunter und fügen Sie den neuen Knoten hinzu. Beachten Sie, dass die A, die vermutlich auf den Kopf der Liste verweist, nicht geändert werden muss, da sie sich nicht ändert.

void AddNode(int val) { 
    Node *n = new Node(); 
    n->data = val; 
    n->next = NULL; 
    Node *pnt = A; 

    // If list is empty, new node becomes first node 
    if (!pnt) { 
     A = n; 
     return; 
    } 

    //finds last empty node 
    while (pnt->next != NULL) { 
     pnt = pnt->next; 
    } 

    pnt->next = n; 

    DisplayList(); 
} 
+2

folgt tut das Bearbeiten nicht einmal kompilieren , geschweige denn das Richtige tun. E: Da gehst du. ;) –

+0

Vielleicht kann auch die DisplayList() aufgerufen werden, bevor Sie zur leeren Liste zurückkehren. ;) –

+0

Wenn Sie den "Tail" -Knoten der Liste verfolgen, werden die Einfügungen am Ende viel schneller und effizienter, da Sie die Liste nicht mehr durchlaufen müssen: 'void AddNode (int val) {Node * n = neuer Knoten(); n-> Daten = Wert; n-> next = NULL; if (! Kopf) {Kopf = n; } if (tail) {tail-> next = n; } Schwanz = n; DisplayList(); } ' –

0

Ein gemeinsames Idiom, das eine gleichmäßig alle Fälle zu behandeln erlaubt (dh spezielle Verarbeitung für den „ersten Knoten in der Liste“ Situation zu vermeiden) arbeitet als

void AddNode(int val) 
{ 
    Node *n = new Node(); 
    n->data = val; 
    // Assuming that `n->next` is already null 

    Node **pnext = &A; 
    for (; *pnext != NULL; pnext = &(*pnext)->next); 

    *pnext = n; 

    DisplayList(); 
} 
Verwandte Themen