2012-01-15 11 views
1

私は現在、宿題にCとしてリンクリストをソートしようとしています。私は答えとしてコードスニペットを探しているわけではありません。私は自分自身を理解する価値があると理解しています。私は以下の関数を使ってsegfaultを受け取りました。なぜ誰かが私になぜそれを伝えることができたら本当に感謝します。私が把握できた最高のは、次の行に到達したときに、それが失敗しているということです。リンクされたリストを並べ替える(ミステリーセグメンテーション)

(頭部>値>頭部>ネクスト>値){

EDITがあれば:この行を変更(head-> next!= NULL & & head-> value> head-> next-> value){とsegfaultsを受け取りません。しかし、私の出力ヘッドポインタは私にリンクリストの最後のノードを与えています。ハルプ。

は、私はここから行くことがどこ全くわからないんだけど、右方向に少しでもナッジは非常に高く評価されるだろう。

struct node *sort_list(struct node *head) { 
    bool swapped ; 
    struct node * tmp , * orig ; 
    orig = head ; 

    if (head == NULL || head->next == NULL) return head ; 
    else { 
      do { 
        swapped = false ; 
        if (head->next != NULL && head->value > head->next->value) { 
          tmp = head ; 
          head = head->next ; 
          tmp->next = head->next ; 
          head->next = tmp ; 

          swapped = true ; 
        } 
        head = head->next ; 
      } while (swapped == true && head != NULL) ; 
    } 
    return orig ; 
} 
+1

私はあなたの問題ではありませんが、私があなただったら私はスワップコードを取り、独自の関数に入れて 'swap(...)'関数を作成します。その後、あなたはそれが動作すると確信するまで、その機能をテストすることができます。一度それを持っていると、ソートロジックに集中することができます。それが現れているときは、それがあなたのソートロジックかスワップロジックかどうかを最初に突き止めなければなりません。 – corsiKa

+1

デバッガの使い方を学ぶには、時間を費やすことになります。このような質問をする必要がなくなり、より多くの時間を短縮できます。 –

+0

デバッガを習得するのではなく、私はそれをより良くする必要があります。私は私の前に長い道があります! – mmmeff

答えて

1

ヘッドがリンクリストの最後の要素になったら、セグメンテーション違反を取得します。
私は宿題なのでコードを書いてはいけませんが、head-> nextがnullかどうかを確認する条件を付け加えてください。そうであれば、頭をリストの先頭に戻したいと思うでしょう。

バブルソートでは、ソートするためにリンクされたリストを複数回通過する必要があります。リンクされたリストを5,4,3,2,1の値で初期化し、頭部を印刷し、頭と頭を印刷するとします。あなたはおそらく5,4,5,3,5,2,5,1 segfaultを見るでしょう

また、あなたの並べ替えの式はちょっとしたようです。 2,3,1などのデータがある場合。あなたはコードが2と3を見ると、スワップされるとtrueになり、関数はtrueを返します。

内側のループを使用して、外側のループを繰り返すたびにリンクされたリストを1回通過するようにすることができます。リンクされたリスト全体を通過した後にスワップがない場合、データはソートされます。

do{ 
    for 1 pass through linked list (this can be a for or while loop) 
     swap if necessary; set swapped to true 
}while(swapped is true) 

希望します。

tmp = head; 

編集

は、あなたがあなたの頭のポインタを維持する必要が

head = head->next 
if(tmp == orig) 
    orig = head; 

を追加します。
5,4,3,6の場合。
4,5,3,6
4,3,5,6
3,4,5,6-
に従いますが、あなたの原点復帰ポインタが更新されなかったので、あなたの出力は切り捨てられますように、それはそれをソートします4,5,6に。

+0

lmkこれはソートバグを修正した場合です。 segの不具合が修正されたようです。 – JustinDanielson

+0

私はこれに私のアルゴリズムを書き直しましたが、私はまだ不適切な出力を得ています。並べ替えの後、最初のノードへのポインタにどのようにぶら下がっているのですか? – mmmeff

+0

編集を確認するには、コード内にorigポインタを維持する必要があります。 – JustinDanielson

3

あなたはhead->nextNULLではないことを知っているが、何次回のラウンドについて、またはあなたが最後の項目に達したときdoループを入力してください?最後の項目は後に何もありません。

EDIT:

あなたは3列内の項目、ABChead == Bを持っている、とあなたがアイテムBCを交換するとします。 A->next = Cもする必要があることを考慮していません。 NULLポインタ参照によって最も可能性の高い原因だ

+0

編集されたオリジナル。私はまだ不適切な出力を受けています。 OPを参照してください。 – mmmeff

1

あなたはhead->nextは、あなたのループ内でNULLであるかどうかをチェックしていません。 1回目の繰り返し後にheadhead->nextになり、条件(if (head->value > head->next->value))が逆参照headになり、valuenext->valueの両方にアクセスします。

+0

編集されたオリジナル。私はまだ不適切な出力を受けています。 OPを参照してください。 – mmmeff

1

head->nextはおそらくnullです。ループの前であるかどうかをチェックしていますが、whileの条件ではチェックが行われません。

そして、あなたはgdbチュートリアルを見つける必要がありますが、それはこのようなことのために非常に強力なツールです。

+0

編集されたオリジナル。私はまだ不適切な出力を受けています。 OPを参照してください。 – mmmeff

+0

gdbは素晴らしいですが、彼は別の学期から離れているかもしれません – JustinDanielson

+1

先週私の最初のgdb講義を実際にしました。それでもかなり新しい。 – mmmeff

関連する問題