2016-04-07 18 views
1

次のナイーブなコードは、リンクされたリストを実装していますが、main関数のすべての要素を出力せずにすべて正常です。しかし、LinkedList::printll関数はセットフォルト(Gcc 5.3.0)を引き起こします。この問題は、私が想定しているヘッドノードの適切な処理に関連しています...リンクされたリストのヘッドノード

このコードを使用する方法はありますかprintllの機能は少なくとも変更しましたか?

#include <iostream> 

using namespace std; 

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

struct LinkedList{ 
    Node* head= NULL ; 
    void append(int); 
    void printll(); 
}; 

void LinkedList::append(int data){ 
    Node* cur = head; 
    Node* tmp = new Node; 
    tmp->value = data; 
    tmp->next = NULL; 

    if(!cur){ 
     cur = tmp;      // cur-> head 
    } 
    else{ 
     while(cur->next != NULL){ 
     cur = cur->next; 
     } 
     cur->next = tmp; 
    } 
    std::cout<<cur->value<<std::endl; // cur-> temp 
    delete tmp;       // comment out 
} 

void LinkedList::printll(){ 
    Node* cur = head; 
     while(cur->next != NULL){  // 
     std::cout<<cur->value<<std::endl; 
     cur = cur->next; 
     } 
} 


int main(){ 
    LinkedList LL; 
    LL.append(5); 
    LL.append(6); 
    LL.append(7); 
    LL.printll(); // --without this, the program is fine 
    return 0; 
} 

答えて

3

あなたはappendにいくつかのバグを持っている:ローカルコピーへ

if(!cur){ 
    cur = tmp; 
} 

これだけ割り当てを。私はここにheadを設定しようとしていると仮定しますので、それを実行してください:head = tmp;。この場合、設定していないので、curは印刷できません。あなたはtmp->valueを印刷することができます。その後

delete tmp; 

あなただけそれを作成し、所定の位置に割り当てられて - なぜあなたはそれを削除していますか? にはまだポインタがあることがわかっています。あなたがそれを済ませたらリストをクリーンアップするときには、それはただdeleteです(あなたは現時点ではまったく行いません)。

A -> B -> C -> NULL 

それはノードCに停止しますが、決してCの値を印刷する:それは停止する時期を考える - それ以外

、あなたのprintllは最後の要素を印刷されません。あなただけ置き換えることができます。

while(cur->next != NULL){ 

while(cur != nullptr){ 

で(また、私はendlが好きではありません)。

See here for these changes running

#include <iostream> 

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

struct LinkedList{ 
    Node* head = nullptr ; 
    void append(int); 
    void printll(); 
}; 

void LinkedList::append(int data){ 
    Node* cur = head; 
    Node* tmp = new Node; 
    tmp->value = data; 
    tmp->next = nullptr; 

    if(!cur){ 
     head = tmp; 
    } 
    else{ 
     while(cur->next != nullptr){ 
      cur = cur->next; 
     } 
     cur->next = tmp; 
    } 
} 

void LinkedList::printll(){ 
    Node* cur = head; 
    while(cur != nullptr){ 
     std::cout << cur->value << '\n'; 
     cur = cur->next; 
    } 
} 


int main(){ 
    LinkedList LL; 
    LL.append(5); 
    LL.append(6); 
    LL.append(7); 
    LL.printll(); 
} 
+0

@BoBTFishが言うように、あなたはTMPを削除する '削除する必要があります;'あなたがコードから(あなたが '' node'追加したDELETE'されている理由'print'の' while'ループを変更してください: 'while(cur)' –

+0

@BoBTFishで提案されているものをすべて変更しましたが、GCC 5.3.0を使ってコンパイルしています、それはまだsegfault .. "cur-> next"で問題が発生すると思います – lorniper

+0

@lorniper私が提案した変更を行ったとき、私は正しくコンパイルして実行することができました。あなたはまだsegfaultingであるあなたの正確なコードを投稿できますか? – BoBTFish

0

1.you望めない

delete tmp; 

原因tmpがポインタ、あなたはTMPを削除する実行すると、オブジェクトを削除します。

2.印刷機能はこれを好む必要があります。

void LinkedList::printll(){ 
    Node* cur = head; 
     while(cur->next != NULL){  // -> problems is here 
     std::cout<<cur->value<<std::endl; 
     cur = cur->next; 
     } 
     std::cout<<cur->value<<std::endl; 
} 
関連する問題