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

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

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

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

Q&A

解決済

3回答

1644閲覧

連結リストから条件を満たしたセルの削除方法

koumon_mito

総合スコア1

C

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

0グッド

0クリップ

投稿2020/06/02 07:46

編集2020/06/02 08:01

前提・実現したいこと

連結リストから、先頭の値の倍数になる値を持つセルを削除する関数を作りたいのですが、わかりません。
この関数をどのように手直しすればよいですか?

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

該当のソースコード

C

1struct _list 2{ 3 int value; 4 struct _list* next; 5} 6 7typedef struct _list* List; 8 9void remove_multple(List xs) { 10 List ys = xs->next; 11 List temp; 12 int p = xs->value; 13 14 15 while(ys != NULL){ 16 if(p%ys->value == 0) 17 { 18 temp=ys; 19 ys=ys->next; 20 xs=xs->next; 21 free(temp); 22 } 23 else 24 { 25 ys=ys->next; 26 xs=xs->next; 27 } 28 29 } 30} 31 32

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

e-watt

2020/06/02 09:32

(回答がついている内容とは別途、) 「先頭の値の倍数になる値を持つセルを」判定する式はソースと逆ではありませんか? if (ys->value % p == 0) ... // 先頭の値で割り切れたらそいつは倍数だ、消せ!
guest

回答3

0

ベストアンサー

diff

1void remove_multple(List xs) { 2- List ys = xs->next; 3 List temp; 4 int p = xs->value; 5 6- while (ys != NULL) { 7+ while (xs->next != NULL) { 8- if (p % ys->value == 0) 9+ if (xs->next->value % p == 0) 10 { 11- temp = ys; 12+ temp = xs->next; 13+ xs->next = temp->next; // xs->nextを消すので、その次を指すよう更新 14- ys = ys->next; 15- xs = xs->next; 16 free(temp); 17 } 18 else 19 { 20- ys = ys->next; 21 xs = xs->next; 22 } 23 } 24}

投稿2020/06/02 09:27

編集2020/06/02 10:10
SHOMI

総合スコア4079

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

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

koumon_mito

2020/06/02 10:01

具体的なコードのよる回答ありがとうございました。
SHOMI

2020/06/02 10:11

2つ連続して先頭の値の倍数の要素がある場合に残してしまうバグがあったのでコード修正しました。
guest

0

単方向であれば、前のノードの後に消すノードの次のノードを接続すれば良いです。

投稿2020/06/02 08:23

amiya

総合スコア1218

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

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

koumon_mito

2020/06/02 08:31

つまり、ifの中身は下のようにすればよいということでしょうか? xs->next=ys->next; temp=ys; ys=ys->next; free(temp);
amiya

2020/06/02 08:38

何をしているのか、何の為にある記述なのか、 意図を言語化すると必要な物、不要な物、どうしたら良いかが、見えてくると思います。
koumon_mito

2020/06/02 10:00

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

0

c

1void remove_multple(List xs) { 2 List ys = xs->next; 3 int p = xs->value; 4 5 while(ys != NULL){ 6 if(ys->value%p == 0) 7 { 8 9 xs->next=ys->next; 10 free(ys); 11 ys=xs->next; 12 13 }else{ 14 xs=xs->next; 15 ys=xs->next; 16 } 17 } 18}

投稿2020/06/02 10:03

編集2020/06/02 11:04
koumon_mito

総合スコア1

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

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

SHOMI

2020/06/02 10:24

要素の削除を行った場合ysが削除した要素の2つ後の要素を指すため、先頭の値の倍数の要素が2つ連続してあると2つ目を残してしまいますね。
koumon_mito

2020/06/02 11:05

本当ですね。気づきませんでした。ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問