0
                if(tmpPtr->number<tmpPtr->next_number->number)
                {
                    int tmpV1=tmpPtr->next_number->number;
                    int tmpV2=tmpPtr->number;
                    tmpPtr->next_number->number=tmpV2;
                    tmpV2=tmpPtr->number=tmpV1;
                }

これは私がこれまでに試したことです。これは、メンバーが毎回追加されているため、リンクされたリストをソートすることになっています。しかし、2 番目のノードを挿入しようとすると、コンパイラがクラッシュします。ブレーク ポイントは if ステートメントですif(tmpPtr->number<tmpPtr->next_number->number)。私は何が問題なのかを理解しようと一生懸命努力しましたが、できませんでした。

4

2 に答える 2

2

あなたの問題は、2回目の実行で、値tmpPtrを持つ最初の要素を指すことです。したがって、逆参照しようとするとすぐに、基本的にそれ自体がポインターになり、.next_numberNULLNULLSIGSEGV

最初の実行後

n->number = input
n->next_number = NULL
h = n
t = n
counter2 = 1

2番目の入力から始めます

n->number
n->next_number = NULL
tmpPtr = h // which is the previous n and therefor h->next_number = NULL
tmpPtr->next_number == NULL // this is your problem since you do not check if next_number is a valid pointer

更新: https://gist.github.com/sahne/c36e835e7c7dbb855076に (ハックっぽい) バージョンのソリューションをアップロードした場合

于 2013-03-12T23:25:26.313 に答える
1

2 番目の加算では、h->next_number が NULL であるため、内側の while ループの最初の繰り返しで、NULL を逆参照します (h->next_number->number のエイリアス)。

編集
2 番目の項目を挿入する場合:
head == tail なので、head->next == NULL です。
内側のループを開始します:
head->number == 最初に挿入されたアイテム。
頭 -> 次 == NULL。
head->next->number == 逆参照 NULL。

于 2013-03-12T23:25:43.153 に答える