アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
}

A 回答 (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 で初期化されているとは思います。
    • good
    • 0
この回答へのお礼

返事ありがとうございます。

>>>buf->next=p->next;
>>で、(DATA *)NULL->next が実行されます。

ここで問題が発生するかもしれませんね。2で回答していただいた答えを使うことにして、whileループは使わないようにします。

ありがとうございました。

お礼日時:2004/05/23 01:32

>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が入ってくる可能性があるのですか?
そういうことですとエラーチェックがないんで問題ありですけど。
    • good
    • 0
この回答へのお礼

返事ありがとうございます。

>>buf=malloc(sizeof(DATA));
>>buf->next=sitei->next;
>>sitei->next=buf;
>>buf->data=x;

としたところ無事に動作しました。このプログラムでは不正な値は入ってこないので、エラーチェックの必要は
ありません。よくよく考えてみるとwhileループを回す必要はありませんでしたね。
ご回答ありがとうございました。

お礼日時:2004/05/23 01:28

>topの初期値が不定になるのが問題と思い、topをNULLで初期化して実行してみたのですが、



DATA top;
top.next=NULL;
としてみたということでしょうか?これは必須ですね。
あと最後の方は、
buf->data=x;
のタイプミスですよね?

他には見たところおかしそうなところは無いので、呼び出し側の問題かもしれません。
後はデバッガを使うか要所要所にprintfを入れてみるかですね。
    • good
    • 0
この回答へのお礼

返事ありがとうございます。

>>後はデバッガを使うか要所要所にprintfを入れて
>>みるかですね。

printfで表示させるといった手段は手軽にできますし、有効ですね。最後の方はご指摘通りにタイプミスです。アドバイスありがとうございました。

お礼日時:2004/05/23 01:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!