2017-03-03 4 views
-2

so habe ich natürlich durch viele verknüpfte Liste Hilfe und alles, aber ich kann nicht scheinen, herauszufinden, was mit mir schief geht. Ich denke, ich verstehe die Logik anderer Codes, aber etwas ist mit mir und ich kann es nicht richtig funktionieren.verknüpfte Liste, wo ist meine Logik fehlerhaft?

-Code der Funktion:

void SparseM_list::newTerm(valueType newValue, int row, int column) 
MatrixTerm *n = new MatrixTerm; 
     n->next = NULL; 
     n->column = column; 
     n->row = row; 
     n->value = newValue; 
     if (head != NULL) 
     { 
      cur = head;  
      while (cur->next != NULL) 
      { 
       cur = cur->next; 
       cout << "does it ever get inside the while loop? cur and curnext -> " << cur << " " << cur->next << endl; <-- never outputs 
      } 
      cur->next = n; 
     } 
     else //if head is null, n will be the starting point 
     { 
      head = n; 
     } 
     delete n; 

    } 

und unterhalb der private Struktur ist/Variablen meiner Sparse Matrix ist meine Logik verknüpft Liste mit

struct MatrixTerm { 
     valueType value; //store value of matrix element 
     int column; //store column position 
     int row; //store row position 
     MatrixTerm *next; //point to next node in the linked list 
    }; 

    MatrixTerm *head; //head point for the linked list 
    MatrixTerm *cur, *prev; 

Also im Grunde diese

  1. Neue Terminformationen werden dem Matrix Term n dynamisch zugewiesen.
  2. Wenn der Kopf leer ist (die durch das Standard-Konstruktor gesetzt ist), dann Kopf = n
  3. zweiter Satz von Daten geht in. Kopf! = Null, so dass ich gesetzt Köter Zeiger gleich den Kopf
  4. die while-Schleife wird für die zweiten Daten übersprungen, weil head-> next null sein sollte und so cur-> next sollte null sein. Ich setze die cur-> nächste gleich n
  5. 3. Daten geht in. Cur-> nächste hat n von der vorherigen, so dass es in die While-Schleife eintritt. Der aktuelle Wert wird als nächster eingestellt. Es prüft die while-Schleife, und dieses Mal sollte cur-> next null sein, also geht es zur Einstellung cur-> next = n (3. Datensatz).

Es tritt jedoch nie die While-Schleife ein. Wo mache ich was kaputt? Die While-Schleife wird verwendet, um die verknüpfte Liste zu durchlaufen.

Antwort

1

Diese Aussage

delete n; 

macht keinen Sinn. Entfernen Sie es.

Ich hoffe, dass zunächst das Datenelement head tatsächlich auf NULL (oder nullptr) gesetzt ist.

Eine alternative Implementierung der Funktion aussehen kann

void SparseM_list::newTerm(valueType newValue, int row, int column) 
{ 
    MatrixTerm *n = new MatrixTerm { newValue, column, row, nullptr }; 

    MatrixTerm **current = &head; 

    while (*current) current = &(*current)->next; 

    *current = n; 
} 

Wenn die Liste neue Knoten anhängen kann es hilfreich sein, wäre auch ein Mitglied mehr Daten tail zu erklären. In diesem Fall wird dem Tail ein neuer Knoten hinzugefügt, der effizienter ist als jedes Mal, wenn die Schleife ausgeführt wird.

Denken Sie auch daran, die Datenelemente cur und prev zu entfernen und sie als lokale Variablen der Methoden zu verwenden.

+0

Sie ordnen den Zeiger tatsächlich zu und löschen ihn dann jedes Mal, wenn cur-> next auf NULL zeigt – Kochoba

0

Sie sollten nicht delete n;, weil es den Speicher Ihrer Liste Knoten freigeben wird. Du siehst, du schiebst deinen Schlüssel in ein Schloss, aber bevor du die Tür öffnest, ziehst du den Schlüssel heraus ... Kannst du ins Haus kommen?

ps, ​​löschen Sie die Knoten sollten in der destrector des Listenobjekts gehalten werden.