2017-06-07 8 views
0

私はリンクされたリストをコーディングしようとしています。私がデバッグする場合、または私はこのようなprint文を1つ追加します。C++リンクされたリスト奇妙な出力

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

これは細かい印刷物です。

5 
7 
5 
7 
8 

しかし、私はその文を削除した場合、それは3つしかエイトを印刷します。同じことがデバッグのために行く、それは動作しているようだが、私はちょうどそれを実行しない場合。私は何が間違っているのか分からなかった。 私のメインです。

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; 
} 

header;

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; 
}; 

ヘッダーのソースファイル。

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

あなたのprint_listにバグがあります。なぜ、ノードを割り当てて、次のステートメントで割り当てられたメモリを漏らしているのですか? – drescherjm

答えて

3

あなたadd_node機能は次のようになります。

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; 
    } 
} 

あなたは頭だけを参照するように求めているので、新しいNodeオブジェクトを作成する必要はありません。 delete tempは、実際にはリストの最後の要素であるtempによって指し示されたアドレスの内容を削除します。

+0

そのメモリリークを削除するのは良いことですが、OPの質問には答えません。 –

+1

おそらく私はそれを得ていないかもしれませんが、削除されたノードのデータにアクセスできなくなったので、この削除によって間違いなく印刷が中断されます。 – SIben

+0

ありがとうございます。それはうまくいった:) – Berk