質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

4回答

1847閲覧

c言語による双方向連結リストの実装

sss09

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/12/16 06:05

編集2020/12/16 06:13

前提・実現したいこと

c言語によって特定の値を持つノードを削除することができる双方向連結リストを実装しようとしています。

発生している問題・エラーメッセージ

対象となるノードが存在しない場合には「存在しない」と返したいのですが、segmetation faultと出てしまいます。

該当のソースコード

#include<stdio.h> #include<stdlib.h> struct list{ int key; struct list *next,*prev; }; struct list *root; struct list *p; struct list *list; //ノードを作成し、先頭につなげる void insert(int x){ p=malloc(sizeof(struct list)); if(p!=NULL){ p->key=x; p->next=root;//それまでrootが指していた内容 p->prev=NULL; p->next->prev=p; root=p; } } //入力された値を探索し、発見すれば削除する void delete(int x){//探索して、一致すれば削除 list=root; printf("delete %d\n",x); while(list->key!=x && list!=NULL){ list=list->next; } //対象のノードが存在しなかった場合 if(list==NULL){ printf("キーは存在しない"); } //対象のノードが存在した場合 list->prev->next=list->next; list->next->prev=list->prev; } int main(){ int i,k; //先頭ノード(ダミー)作成 p=malloc(sizeof(struct list)); p->next=NULL; p->prev=NULL; root=p; //先頭にノードを追加 for(i=0;i<10;i++){ insert(i); } for(i=0;i<10;i++){ printf("削除するキーを選択:"); scanf("%d",&k); delete(k); list=root; while(list->next!=NULL){ printf("%d",list->key); list=list->next; } printf("\n"); } return 0; }

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/16 06:10

C# のタグをつけるのは不適切なので外してください。
sss09

2020/12/16 06:13

すいません。誤ってつけていたようです。
guest

回答4

0

C

1//対象のノードが存在しなかった場合 2if(list==NULL){ 3 printf("キーは存在しない"); 4} 5 6//対象のノードが存在した場合 <----- いやノードが存在しなくてもこのコード実行されますけども 7list->prev->next=list->next; 8list->next->prev=list->prev; 9

投稿2020/12/16 07:03

ozwk

総合スコア13528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/12/16 07:23 編集

ソレダ! ...しかしそれだと 「キーは存在しない」出力のあと segmentation-fault となるはずで、 質問に示された問題と挙動が異なる。
guest

0

これでは先頭の"prev"と最後の"next"の値がNULLになっています。
ポインタをつなぎ変える前に、NULLチェックが必要です。

後、keyが見つからなかったときのも、同じです。

投稿2020/12/16 06:23

akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

c

1void delete(int x){//探索して、一致すれば削除 2 list=root; 3 printf("delete %d\n",x); 4 while(list->key!=x && list!=NULL){ 5 list=list->next; 6 }

while文で、listがNULLになったら抜けるようになっていますが、同時にメンバー変数keyも評価してしまうからではないでしょうか。

投稿2020/12/16 06:11

hero1000

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sss09

2020/12/16 06:21

listがNULLの場合(対象となる値が存在しなかった場合)またはlistが対象の値を持つノードを指した場合にwhile文を抜けるようにしたのですがこれでは問題がありますか?
hero1000

2020/12/16 06:23

別々にすべきです。while内でAND判定していますが、判定順序は記述順とは限りません。 listがNULLなら問答無用で抜ける、を第一段階として、そのあとにkeyの判定をすべきです。
ozwk

2020/12/16 07:05

> 判定順序は記述順とは限りません &&演算子は短絡評価されるのでは?
hero1000

2020/12/16 07:14 編集

あー、そうかもしれません。 まあ結局言いたかったのは、まずヌルチェックをして、そうでないならkeyを見るように明確に記述した方が良いでしょう、ということです。
guest

0

while(list->key!=x && list!=NULL){

判定の順が逆じゃない?
listがNULLだったら list->key に意味がないんだから。

投稿2020/12/16 06:08

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sss09

2020/12/16 06:17

判定の順番を逆にしてみましたが同じようにエラーが出てしまいます。
episteme

2020/12/16 06:37

list = list->next を繰り返したら(末尾の次は)必ずNULLに到達しますか? そうならないんじゃないですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問