2017-06-02 6 views
-1

Mein Code in int main ist:Knoten am Ende der verketteten Liste (C++) hinzufügen?

 node *run=NULL, *head=NULL, *temp=NULL; 

    for (int x = 1; x <= 10; x++) 
    { 
     temp = new node(); 
     temp->value = x*10; 
     temp->next = NULL; 
     temp -> prev = NULL; 
     if (head == NULL) 
     { 
      head = temp; 
     } 
     else 
     { 
      run = head; 
      while (run->next != NULL) 
      { 
       run = run->next; 
      } 
      temp -> prev = run; 
      run->next = temp; 
     } 
    } 
    run = head; 
    cout << "ORIGINAL:" << endl; 
    while (run != NULL) 
    { 
     printf("%d\n", run->value); 
     run = run->next; 
    } 
cout << endl << endl; 
//=============== ADD AT THE END ======================== 
int xb = 105; //Value I want to add 
run = head; 

while (run -> next -> value > xb) 
{ 
    run = run -> next; 
} 
    temp = new node(); 
    temp -> prev = run; 
    temp -> value = xb; 
    temp -> next = NULL; 

    run -> next = temp; 


run = head; 
cout << "ADDED 105:" << endl; 
while (run != NULL) 
{ 
    printf("%d\n", run->value); 
    run = run->next; 
} 

Ich habe das Hinzufügen des neuen Knotens, das Problem herauszufinden versucht (105) in meinem Code, aber nichts, was ich getan haben, scheint zu funktionieren. Das Original arbeitet völlig in Ordnung und Ausgänge

10 20 30 40 50 60 70 80 90 100 

aber der Code zum Einfügen gibt nur

10 105 

statt

10 20 30 40 50 60 70 80 90 100 105 
+0

Tun Sie sich einen Gefallen und vergeben Sie keinen neuen Knoten, bis Sie Ihre Verwaltungszeiger positioniert haben, wo der Knoten eingefügt werden soll. Ihr Setup von 'temp' unter der Schnittlinie ist einfach falsch und Sie verbinden' Temp-> next' nie richtig. Und fyi, Ihr Beitrag sollte das * erwartete * Sequenzergebnis sowie das gescheiterte Ergebnis enthalten. Das * vorherige * Ergebnis ist zwar interessant, aber nicht wirklich relevant. – WhozCraig

Antwort

1

Wenn Sie initialisieren Ihre new node, Sie setzen ihre next Zeiger auf NULL:

temp = new node(); 
temp -> prev = run; 
temp -> value = xb; 
temp->next = NULL; 

Anschließend suchen Sie in der vorhandenen Liste nach dem Speicherort für den neuen Knoten. Und dann legen Sie es:

run -> next = temp; 

Wenn Sie irgendeine Aufmerksamkeit zahlten, würden Sie sofort bemerken, dass temp ‚s next Zeiger immer noch ist, sehr viel, ein NULL. Nichts ist dagegen getan worden.

So geht der Zeiger auf den Rest der Liste verloren, aufgrund der Tatsache, dass der neu eingefügte Knoten immer NULL für seinen next Zeiger haben wird.

0

Nun, sollten Sie nicht zulassen, temp-> next = NULL wenn Sie ein Element in eine Linkliste einfügen, da Sie würden Ihre Knoten nach Platz verloren, wo Sie into.You diese benötigen einfügen temp-> next = run-> next um deinen Knoten nach dem Einfügen zu verbinden. Dies ist das Hauptproblem deines Programms. Ein weiteres Problem ist, nachdem Sie Ihren Code ändern, wurde die Antwort nicht von Ihnen erwartet:

10 20 30 40 50 60 70 80 90 100 105

Hier ist das Problem

while (run -> next -> value > xb) 
{ 
    run = run -> next; 
} 

Wie Sie sehen können, Run-> Weiter-> Wert> xb (20> 105?) war immer falsch, das ist dein sollte so tun

while (run->value < xb && run->next != NULL) 
{ 
    run = run -> next; 
} 

Ihr Initialisierungscode der Link-Liste ist ziemlich bad.If Sie einen Knoten im Schwanz Liste einfügen wollen, sollten Sie den letzten Knoten erinnern ea ch Zeit, anstatt die Liste zu reisen. Konsultieren Sie diesen Code:

node *run=NULL, *head=NULL, *temp=NULL, *last=NULL; 

    for (int x = 1; x <= 10; x++) 
    { 
     temp = new node(); 
     temp->value = x*10; 
     temp->next = NULL; 
     temp -> prev = NULL; 
     if (head == NULL) 
     { 
      head = temp; 
      last = temp; 
     } 
     else 
     { 
      /*run = head; 
      while (run->next != NULL) 
      { 
       run = run->next; 
      }*/ 

      temp->prev = last; 
      last->next = temp; 
      last = temp; 
     } 
    } 
0

Ich respektiere, wenn dies eine C-Trainingseinheit ist. Wenn ja, haben Sie eine hervorragende Unterstützung erhalten. Wenn Sie jedoch Produktionscode erstellen, sollten Sie stattdessen std :: list verwenden. Es kann Leistungseinbußen haben, aber Sie werden vom Debuggen befreit.

Wenn Sie den Trainingsmodus bevorzugen, würde ich Ihnen vorschlagen, einen Endzeiger einzufügen, um das langwierige while-to-end in jeder Iteration zu vermeiden. Dies wird insbesondere bei großen verketteten Listen die Performance deutlich verbessern.

+0

Während der stellare Ratschlag (mit den Standard-Bibliothekscontainern, anstatt ihre eigenen zu rollen, mit einer End-Pointer-Strategie für schnellere Einfügungen von Endpunkten), adressiert dies nicht das Problem, das das OP mit seinem Code hat, wie dargestellt . – WhozCraig

Verwandte Themen