2016-08-27 12 views
-1

このコードを試しましたが、セグメント化エラーが発生しました。このエラーを修正するにはどうすればよいですか?ノードのリンクを変更せずにリンクされたリストを逆転する

void rev() 
{ 
    struct node *p,*q; 
    p=start; 
    q=start; 

    int count=0,temp,i,j; 

    while(p!=0) 
    { 
     p=p->next; 
     count++; 
    } 
    for(i=0; i<(count/2); i++) 
    { 
     p=start; 
     for(j=0; j<(count-i); j++) 
      p=p->next; 

     temp=q->data; 
     q->data=p->data; 
     p->data=temp; 

     q=q->next; 
    } 
} 

ここpqはポインタです。最初は両方ともスタートを指しています。 次に、2つのループを使用して、最初と最後のノードの値を入れ替え、次に2番目と最後のノードの値を入れ替えました。

+1

'(count-i)' - > '(count-i-1)' – BLUEPIXY

+0

ありがとう...コードが動作しています –

答えて

1

オフに1つのエラーがあります。リスト内のcount要素を数え、forリストの最初の反復でiを超えるリストにはpからcount - 0のリンクがあります。それは実際にあなたが決定を終えたので、NULLになります。 p->dataを評価すると、未定義の動作が発生します。

実行からcount/2 - 1の代わりに、iから1 count/2までを実行してください。

1

あなたのfor(i=0; i<(count/2); i++)を紙に貼り付けてください。

リンクリストの最後のノードに到達すると、qとpの両方が最後のノードを指しています。

p = p -> next //is NULL so p goes NULL; 

あなたのループは1回以上の反復を実行しています。 ので、あなたの内側のループがcount -i - 1

に更新し、p -> data = temp //どのNULL割り当てるとき - >データ=一時を、何の意味

プログラムがクラッシュをしないとセグメンテーションフォールトを与えます。

関連する問題