2

copyRev

void copyRev(node *head1, node *&head2)
{

    stack<int> dat;
    node* curr = head1;
    while(curr!=NULL){
        dat.push(curr->data);
        curr = curr->next;
    }
    while(!dat.empty()){
        append(head2,dat.top());
        dat.pop();
    }

}

追加

void append(node* &head, int data){

    if(head==NULL){
        head= new node;
        head->data = data;
        head->next = NULL;
    }
    else{

        node *curr = head;
        while((curr)->next!=NULL){
            (curr) = (curr)->next;
        }
        (curr)->next = new node;
        (curr) = (curr)->next;
        (curr)->data = data;
        (curr)->next = NULL;
    }
}

さて、私はリンクリストの逆を複製しようとしています。リストを元に戻す方法を知っています。しかし、このコードは私にを与えますBus error(code dumped)

これは私が関数を呼び出す方法ですmain()

node *head;

    for(int i = 0;i<9;i++){
        append(head,i*i);
    }
    node *revHead;
    printList(head);

    copyRev(head,revHead);
    printList(revHead);

関数では、headappend()をチェックし、NULLNULLの場合は新しいノードを作成します。さらに、append関数は、要素をリストに適切に追加します。copyRev問題が発生したのは、プロシージャを呼び出した後です。

インプレース反転を試しましたが、機能します。リンクリストの逆を複製する必要があります。反復ソリューションと再帰ソリューションの両方を歓迎します。また、上記のコードのエラーを指摘してください。

これは私自身の練習問題ですが、宿題の問題ではありません

4

2 に答える 2

1

ポインタを初期化していません:

node *head;
node *revHead;

結果として、値は不定になります (つまり、ランダムです)。

これらのポインターの値を何らかの方法で使用すると、未定義の動作になります。これはあなたのエラーになる可能性があります。

それらを初期化するだけです:

node*  head     = NULL;
node*  revHead  = NULL;

リンクされたリストの再帰的な逆:

void reverse(node*& head)
{
     head = reverse(head, NULL);
}
node* reverse(node* item, node* next)
{
     if (item == NULL)
     {    return next;
     }
     node*  iter = item->next;
     item->next  = next;
     return reverse(iter, item);
}
于 2012-07-28T08:46:42.320 に答える
0

一見すると、リスト ヘッドを初期化するのを忘れていました。

node *head = 0;

アランのおかげで編集:そしてrevHeadも

于 2012-07-28T08:43:33.337 に答える