2017-06-07 1 views
0

So habe ich versucht, eine verkettete Liste zu codieren. Wenn ich debugge oder wenn ich eine weitere print-Anweisung wie diese einstelle;C++ verkettete Liste seltsame Ausgaben

intlist.add_node(7); 
intlist.print_list(); 
intlist.add_node(8); 

Es funktioniert feine Drucke;

5 
7 
5 
7 
8 

Aber wenn ich diese Aussage entferne, druckt es nur drei Achten. Das gleiche gilt für das Debugging, es scheint zu funktionieren, aber wenn ich es nur laufe, tut es nicht. Ich habe nicht verstanden, was falsch ist. Hier ist meine Hauptsache;

int main(){ 
    Linked_list intlist; 
    intlist.add_node(5); 
    intlist.add_node(7); 
    intlist.print_list(); 
    intlist.add_node(8); 
    intlist.print_list(); 
    return 0; 
} 

Kopfzeile;

class Linked_list{ 
public: 
    Linked_list(); 

    void add_node(int data); 
    void remove_node(int data); 
    int get_data(int index); 
    void print_list(); 

    struct Node { 
     int data; 
     Node* next; 
    }; 

    Node* head; 
    int lenght; 
}; 

Und Header-Quelldatei;

Linked_list::Linked_list(){ 
    head = 0; 
    lenght = 0; 
} 

void Linked_list::add_node(int data){ 
    Node* newnode = new Node; 
    newnode->data = data; 
    newnode->next = NULL; 
    if (head == 0) {head = newnode; lenght = 1; return;} 
    else{ 
     Node* temp = new Node; 
     temp = head; 
     while (temp->next != NULL){ 
      temp = temp->next; 

     } 
     lenght++; 
     temp->next = newnode; 
     delete temp; 
    } 
} 


void Linked_list::remove_node(int data){ 
    return; 
} 

int Linked_list::get_data(int index){ 
    return 0; 
} 

void Linked_list::print_list(){ 
    if (head == 0) {std::cout << "List is empty!!" << std::endl; 
    return;} 
    else{ 
     Node* ptr = new Node; 
     ptr = head; 
     for (int i = lenght; i > 0; i--){ 
      std::cout << ptr->data << std::endl; 
      ptr = ptr->next; 
     } 
    } 
} 
+0

Sie haben einen Fehler in Ihrer print_list. Warum ordnen Sie einen Knoten zu und geben den zugewiesenen Speicher bei der nächsten Anweisung frei. – drescherjm

Antwort

3

Ihre add_node Funktion sollte sein:

void Linked_list::add_node(int data) { 

    Node* newnode = new Node; 
    newnode->data = data; 
    newnode->next = NULL; 

    if (head == 0) { 
     head = newnode; 
     lenght = 1; 
     return; 
    } else { 
     //Node* temp = new Node; 
     Node *temp = head; 
     while (temp->next != NULL) { 
      temp = temp->next; 
     } 

     lenght++; 
     temp->next = newnode; 
     //delete temp; 
    } 
} 

Sie benötigen keine neue Node-Objekt zu erstellen, da Sie nur den Kopf zu verweisen suchen. delete temp löscht tatsächlich den Inhalt der Adresse, auf die zuvor von temp verwiesen wird, die das letzte Element Ihrer Liste ist.

+0

Es ist gut, dieses Speicherleck zu entfernen, aber das beantwortet die Frage des OP nicht. –

+1

Vielleicht habe ich es dann nicht bekommen, aber dieses Löschen bricht definitiv das Drucken, da die Daten für den gelöschten Knoten nicht mehr zugänglich sind. – SIben

+0

Danke. Das hat funktioniert :) – Berk