1

リンクリストを並べ替えようとしています。頭というノードがあり、次のノードなどを指しています。

しかし、ノードが持つ値でノードを並べ替えようとすると、ifステートメントの内容が出力されるので、並べ替えが機能しますが、リンクリストが返されません。どこで私は間違えましたか?

Node* head;
void sortlist(){

Node * runner = head;
Node * runner2;

for(runner = head; runner->next != NULL; runner = runner->next){
    for(runner2 = runner->next; runner2->next != NULL; runner2 = runner2->next){
        if(runner->freq < runner2->freq){
            cout<< runner->freq<< " is LT "<<runner2->freq<< endl;
            Node * temp = runner;
            runner = runner2;
            runner2 = temp;
        }
    }
}

head = runner;
} 

最初のノードのみを取得しています。

4

2 に答える 2

3

リンクリスト内の2つの要素を交換するには、何を変更する必要があるかを検討してください。たとえば、

Head -> First -> Second -> (NULL)

Head -> Second -> First -> (NULL)

を更新する必要がありますHead.next、、。ノードを交換しようとするときにこれらのことを変更しないので、期待どおりに実行できない可能性があります。First.next Second.next


を交換する(つまりswap(runner->freq, runner2->freq))だけの方がはるかに簡単です。

于 2013-03-26T16:04:47.680 に答える
2

runner->next == NULL;最後の要素であると思われるときに停止します。次に、を設定 しますhead = runner;。これは、ヘッドが常にこのルーチンの後の最後の要素になることを意味します。さらに、私はこのスワッピングを信用していません。

漠然と挿入ソートをしたいようです。リンクリストで簡単な並べ替えを行う場合は、selection sortを使用することをお勧めします。別の空のリストを作成l2し、最初のリストから最小要素を削除するたびに、それをの先頭として追加しますl2。2番目のリストのコードは単純です。

void prepend(Node* node, Node** list){
   //null checks if you want
   node->next = *list;
   *list=node->next;
}
于 2013-03-26T15:56:35.653 に答える