0

ポインターを使用してリンクされたリストを実装しています。
リンクされたリストを逆にする必要があるので、rotate(List &l) と書き
ましたが、期待する結果が得られません。
入力は
0 1 2 3 4 5 6 7 8 9 であるため、結果として 9 8 7 6 5 4 3 2 1 0
が期待されますが、 0 9 8 7 6 5 4 3 2 1が得られます。



どこが間違っていたのかわからないので、どこが間違っているのか指摘してもらえますか? 問題はここから始まるようです:(回転)

while(end->next !=0){
       end = end->next;
    }

最初のノードが最後のノードであることがわかります (cout << end->d; は 9 ではなく me0 を返すため)

#include<iostream>

using namespace std;

typedef class Node *List;
struct Node{ 
    int d;
    List next;
};
//update : renamed
void reverse(List &l){
/*
start :
a b c d e

b c d e **a**
c d e **b** a
d e **c** b a
Result:
e **d** c b a
    */

    // get last node
    List end = l;
    while(end->next !=0){
       end = end->next;
    }
    //insert first node directly after the original last node
    while(l!=end){
        List hulp = l;
        l = hulp->next;
        hulp->next = end->next;
        end->next=hulp;
    }
}
int main(){
    List l = new Node();
    int i = 0;
    List k = l;
    while (i < 10)
    {
        k->d = i;
        k->next = new Node();
        k = k->next; 
        i++;
    }
    List m = l;
    while ( m->next !=0 )
    {
        cout << m->d << endl;
        m = m->next;
    }
    reverse(l);
     m = l;
    while ( m->next !=0 )
    {
        cout << m->d << endl;
        m = m->next;
    }
}
4

2 に答える 2

3

これは、リンクされたリストを反復処理する一般的な方法ではありません。

while (m->next != 0) {
    cout << m->d << endl;
    m = m->next;
}

代わりに、次のことを行う必要があります。

while (m != 0) {
    cout << m->d << endl;
    m = m->next;
}

これを行うと、最初に作成したリンク リストが実際には次のようになっていることがわかります。

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0

印刷ロジックは、次のように印刷します。

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

あなたの逆はおそらく正しく機能し、次のリストを生成します:

0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0

次のように印刷します。

0, 9, 8, 7, 6, 5, 4, 3, 2, 1 
于 2013-01-25T01:41:48.970 に答える
1

リストを誤って初期化しました。d=9 の最後のノード。 null を持つ必要がありますnextが、実際にはnew Node. これを修正するには、リストの初期化を次のように変更します。

for (int i = 0; ; ++i)
{
    k->d = i;
    if (i >= 9) {
        break;
    }
    k->next = new Node();
    k = k->next; 
}

それを変更した後、最初と最後の印刷も変更する必要があります(そうしないと、最後のノードを印刷しません)。印刷コードは次のようにする必要があります(コードの重複を避けるために、印刷関数に入れることをお勧めします):

for ( ; m; m = m->next)
{
    cout << m->d << endl;
}
于 2013-01-25T01:44:35.690 に答える