2016-08-26 5 views
-4

これはかなり単純なプロジェクトで、私は約20時間を円で旅行中に何も進まずに過ごしました。私は最初に正しい方向に向かっているようだったが、私はそれを私に説明しようとしました、そして、それは私の脳を歪めて、私を正方形に戻しました。このC++シンプルリンクリスト実装の問題点は何ですか?

私はそれが最も単純なエラーであることを知っていますので、私は説明と同様にコードを投稿します。注:CPPは

void Intset::insert(int key) 
{ 
    Node * current; 
    current->num = key; 
    current->next = NULL; 
    assert (!find(key)); 
    if(head == NULL) 
    { 
     head = current; 
    } 
    else if(head->num >= key) 
    { 
     head->next = head; 
     head = current; 
    } 
    else if(head->num < key) 
    { 
     head->next = current; 
    } 

ファイルしたがって、この機能の背後にある私の思考プロセスは、(ソートされたリンクリストにキーを挿入)を作成することです

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

Hファイル内の関数は問題ではありません

をアサート新しいノードの現在の値を返し、そのnumフィールドにユーザーが入力したキーを入力し、次のフィールドをNULLにします。私の最初のチェックは、頭が空で、それが現在の内容をコピーしているかどうかを確認することです。私の2番目のチェックは、headのnumフィールドにユーザーが入力したキー以上の数値が含まれているかどうかを確認することです。

もしそうなら、私はヘッドノードを次のノードに移動し、それを現在のノードに置き換えます(前の小さな番号)。私の3番目のチェックは、頭の中の数字がユーザが入力したキーよりも小さいかどうかを調べ、もしそうなら、頭の次のフィールドを現在のもの(小さい番号が最初にくる)で埋めます。これまで私はsegフォールトエラーに遭遇しました。私は何が間違って割り当てられているのか分かりません。ここ

+0

新しいノードのメモリを宣言する必要があります。そう簡単に挿入することはできません。 – Shravan40

+1

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+2

リンクされたリストを把握する最も良い方法は、鉛筆と紙です。リスト内のノードを引き出します。ノード間の接続を描画します。次に、リストや他の関与するノードを操作して挿入や削除などの操作を行います。 – user4581301

答えて

3

スタート:

Node * current; 
current->num = key; 
current->next = NULL; 

currentポイントしていますか?初期化されていないポインタを逆参照しています。これは、undefined behaviorです。これは、segフォルトが発生する可能性があります。

+0

感謝の気持ちでBenは新しい機能が必要ですか、それとも1行にまとめるべきでしょうか? – Riossm

+0

@Riossm、Im申し訳ありませんが、私の答えに基づいて、そのコメントは私には意味がありません、どういう意味ですか? –

+0

ex。 current =新しいノード(key、NULL); – Riossm

関連する問題