2012-07-20 3 views
5

私はいくつかの宿題で奇妙なエラーに遭遇しています。私のプログラムのすべての機能は、たとえ最初にノードがなくても、あるいは少数のものを削除しても、完璧に動作します。しかし、ノードを作成してそれらをすべて削除してゼロに戻すと、すべての関数がクラッシュします。私は問題を研究しようとしましたが、私が見つけた解決策はすでに得られたものとほぼ同じです。明らかに私が見ていない重要なことがあります。私のリンクリストノード削除機能により、私のプログラムの他の部分がクラッシュする

ここノード除去機能(私はすべてこの中に犯人であることを疑う1)

void remove(node** root) 
{ 
    node* temp = *root; 
    node* previous = 0; 
    if(*root) 
    { 
     while((*root)->next) 
     { 
      previous = *root; 
      *root = (*root)->next; 
     } 
     delete *root; 
     *root = temp; 
     if(previous) 
     { 
      previous->next = 0; 
     } 
    } 
    else 
    { 
     std::cout<<"cannot delete items from empty list\n"; 
    } 
} 

はここでノード挿入機能は、私は問題があることをかなり確信している

void insert(node** root) 
{ 
    node* temp = *root; 
    if(*root) 
    { 
     while((*root)->next) 
     { 
      (*root) = (*root)->next; 
     } 
     (*root)->next = new node; 
     (*root)->next->data = getnum(); 
     (*root)->next->next = 0; 
     *root = temp; 
    } 
    else 
    { 
     (*root) = new node; 
     (*root)->data = getnum(); 
     (*root)->next = 0; 
    } 

} 

だのですコードのどこかにリンクされていますが、そうでない場合は、ここで完全割り当てにペーストビンがありますhttp://pastebin.com/AWtG4qjD

+1

私は間違って表示されません。それはvalgrindの下でそれを実行するときに何をしますか?スタイルの問題:反復変数に '* root'を使わないでください、混乱します。特に、反復処理後に元の値にリセットする必要がある場合は、実行しないでください。 **特に**は、元の値 "temp"を呼び出すことはありません(一時的なものではなく、実際のリストが変更されています!)。また、なぜあなたはちょうど最後に挿入または削除するためにちょうど終わりまで反復していますか?逆の順序でリストを保存し、一定時間頭に直接操作してみませんか? –

+0

これは課題の一部です。あなたが提案したことは、より良い方法のように聞こえるが、これは私の最初のリンクされたリストの割り当てなので、私はそれをもっとうまく学ぶのを助ける意図的に複雑な方法をするように求められていると思う。私は実際にはかなり新しいプログラマーなので、きれいできちんとしたコードをどうやって作成するかは実際には分かっていないので、スタイルのアドバイスは非常に高く評価されています。その同じノートで、私は実際にvalgrindが何であるかを知っていませんが、私はそれをグーグルで調べていて、それは面白いです – kamstack

答えて

5

remove実装が正しくありませんリストには1つの要素があります。 delete *root; 実行した後、tempは "存在しないメモリ"を指しますが、*root = temp; このようにすると、無効なノードを指すようになります。 そして、これは奇妙な行動を起こし、あなたの実装が正しいようにする後で 可能な方法は次のとおりです。

void remove(node** root) 
{ 
    //TODO: your code here 
    node* temp = *root; 
    node* previous = 0; 
    if(*root) 
    { 
     while((*root)->next) 
     { 
      previous = *root; 
      *root = (*root)->next; 
     } 
     delete *root; 
     if(previous) 
     { 
      *root = temp; 
      previous->next = 0; 
     } 
     else { 
      *root = NULL; 
     } 
    } 
    else 
    { 
     std::cout<<"cannot delete items from empty list\n"; 
    } 
} 

しかし、私は、ルートポインタ.DEFINEでいくつかのイテレータを、リストを反復処理して終わりを探すためにあなたに助言 `tをそれは* rootを変更する代わりに

+0

あなたのヒントのおかげで問題になっているようです! – kamstack