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;
}
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 で初期化されているとは思います。
返事ありがとうございます。
>>>buf->next=p->next;
>>で、(DATA *)NULL->next が実行されます。
ここで問題が発生するかもしれませんね。2で回答していただいた答えを使うことにして、whileループは使わないようにします。
ありがとうございました。
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が入ってくる可能性があるのですか?
そういうことですとエラーチェックがないんで問題ありですけど。
返事ありがとうございます。
>>buf=malloc(sizeof(DATA));
>>buf->next=sitei->next;
>>sitei->next=buf;
>>buf->data=x;
としたところ無事に動作しました。このプログラムでは不正な値は入ってこないので、エラーチェックの必要は
ありません。よくよく考えてみるとwhileループを回す必要はありませんでしたね。
ご回答ありがとうございました。
No.1
- 回答日時:
>topの初期値が不定になるのが問題と思い、topをNULLで初期化して実行してみたのですが、
DATA top;
top.next=NULL;
としてみたということでしょうか?これは必須ですね。
あと最後の方は、
buf->data=x;
のタイプミスですよね?
他には見たところおかしそうなところは無いので、呼び出し側の問題かもしれません。
後はデバッガを使うか要所要所にprintfを入れてみるかですね。
返事ありがとうございます。
>>後はデバッガを使うか要所要所にprintfを入れて
>>みるかですね。
printfで表示させるといった手段は手軽にできますし、有効ですね。最後の方はご指摘通りにタイプミスです。アドバイスありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大学で出されたc言語の課題に...
-
C言語 リスト
-
InvokeMemberメソッドとは何を...
-
リスト構造
-
C言語のfor文です。 繰り返しの...
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
Enterキーを押されたら次の処理...
-
*をユーザーが入力した数字の数...
-
fgetsなどのときのstdinのバッ...
-
C言語で%を使わない余りの出し方
-
C言語
-
プログラムでの数字につく”f”の...
-
break文でループを一気に抜ける...
-
マイナスからプラスへ転じた時...
-
#define _CRT_SECURE_NO_WARNIN...
-
既定のコンストラクタがありま...
-
ある商品のロス率を5%見込み、...
-
ガンマ変換 C言語でプログラ...
-
printf で二進表示を行いたい。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
InvokeMemberメソッドとは何を...
-
構造体のリスト削除
-
C# ref引数のnull判定
-
双方向リストのバブルソートに...
-
コールバック関数はnullになら...
-
今度はdoubly linked listの問...
-
C♯ 2段構造のcontextMenuStrip?
-
空のカラムを挿入
-
C#でのEXCEL出力に関して
-
「Nz」は何て読むのでしょうか?
-
ソートを自作
-
ばばぬきプログラムについて
-
バブルソートを使って文字列を...
-
ポインタを使った連結リストへ...
-
C言語 dequeue
-
API 録音 MCI
-
マイナスからプラスへ転じた時...
-
Enterキーを押されたら次の処理...
-
2÷3などの余りについて
-
C言語での引数の省略方法
おすすめ情報