• ベストアンサー

ポインタを使った連結リストへの挿入

siteiで指定されているポインタの直後に要素xを挿入する関数insertをポインタの連結リストを用いて作成したのですが、実行するとセグメンテーション違反がでて上手く動きません。何処に問題があるのでしょうか?topの初期値が不定になるのが問題と思い、topをNULLで初期化して実行してみたのですが、結果は変わりませんでした。 宜しければ回答または問題点を指摘していただけますでしょうか?宜しくお願いします。 typedef struct{ int data; struct DATA *next; }DATA; DATA top; int insert(int x,DATA *sitei) { DATA *p,*buf; p=⊤ while( p!=NULL && p!=sitei) p=p->next; buf=malloc(sizeof(DATA)); buf->next=p->next; p->next=buf; buf2->data=x; return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>while( p!=NULL && p!=sitei) >p=p->next; なんでループまわすんですか? siteiの次なんですよね。新しい要素の挿入位置は。 buf=malloc(sizeof(DATA)); buf->next=sitei->next; sitei->next->next=buf; buf->data=x; これだけで問題ないような。 で、siteiに不正な値やNULLが入ってくる可能性があるのですか? そういうことですとエラーチェックがないんで問題ありですけど。

linuxbeginner
質問者

お礼

返事ありがとうございます。 >>buf=malloc(sizeof(DATA)); >>buf->next=sitei->next; >>sitei->next=buf; >>buf->data=x; としたところ無事に動作しました。このプログラムでは不正な値は入ってこないので、エラーチェックの必要は ありません。よくよく考えてみるとwhileループを回す必要はありませんでしたね。 ご回答ありがとうございました。

その他の回答 (2)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.3

>while( p!=NULL && p!=sitei) >p=p->next; このループは p == NULL で抜けますが,その時 >buf->next=p->next; で、(DATA *)NULL->next が実行されます。 もっとも、#2の回答の方の言う通り、 そもそもループしなければこの問題が起きませんが。 ただ、指定の次にいれるなら、 >sitei->next->next=buf; は sitei->next = buff; だと思いますが。 top自体は、グローバルかスタティック変数に見えますので, 多分 0 で初期化されているとは思います。

linuxbeginner
質問者

お礼

返事ありがとうございます。 >>>buf->next=p->next; >>で、(DATA *)NULL->next が実行されます。 ここで問題が発生するかもしれませんね。2で回答していただいた答えを使うことにして、whileループは使わないようにします。 ありがとうございました。

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.1

>topの初期値が不定になるのが問題と思い、topをNULLで初期化して実行してみたのですが、 DATA top; top.next=NULL; としてみたということでしょうか?これは必須ですね。 あと最後の方は、 buf->data=x; のタイプミスですよね? 他には見たところおかしそうなところは無いので、呼び出し側の問題かもしれません。 後はデバッガを使うか要所要所にprintfを入れてみるかですね。

linuxbeginner
質問者

お礼

返事ありがとうございます。 >>後はデバッガを使うか要所要所にprintfを入れて >>みるかですね。 printfで表示させるといった手段は手軽にできますし、有効ですね。最後の方はご指摘通りにタイプミスです。アドバイスありがとうございました。

関連するQ&A

専門家に質問してみよう