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

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

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

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

Q&A

解決済

2回答

2231閲覧

2つの線形リストの差集合を表示するプログラムを作ったのですが、うまく出力されません。

apeirogon0813

総合スコア117

C

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

0グッド

0クリップ

投稿2019/08/08 21:44

編集2019/08/10 18:08

2つの線形リスト
a:1→3→6→10→NULL
b:3→7→NULL
の差集合
a-b = 1→6→10→NULL
の線形リストを返す関数を作って
mainで出力させたのですが、
10としか出力されず、リストが繋がっていませんでした。
再帰関数で返り値をtailに代入しているので、連結していると思ったのですが、どうして連結されていないのかわかりません。
ご教示願います。
尚、メモリ解放については今の段階では考慮していないので、ご了承ください。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4struct node { 5 int elm; 6 struct node *next; 7}; 8 9struct node *new(int e, struct node *n) { 10 struct node *p; 11 p = malloc(sizeof(struct node)); 12 p->elm = e; 13 p->next = n; 14 return p; 15} 16 17struct node *diff(struct node *a, struct node *b) { 18 struct node *head = new(0, NULL), *tail = head; 19 if(a==NULL || b== NULL) { 20 return a; 21 } 22 if(a->elm < b->elm) { 23 tail->next = new(a->elm, NULL); 24 tail= tail->next; 25 return tail->next = diff(a->next, b); 26 } 27 else if(a->elm == b->elm) { 28 return tail->next = diff(a->next, b->next); 29 } 30 else { 31 return tail->next = diff(a, b->next); 32 } 33} 34 35int main(void) { 36 struct node *a = new(1, new(3, new(6, new(10, NULL)))); 37 struct node *b = new(3, new(7, NULL)); 38 struct node *c = diff(a,b); 39 while(c!=NULL) { 40 printf("%d\n",c->elm); 41 c = c->next; 42 } 43 return 0; 44} 45

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

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

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

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

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

jimbe

2019/08/09 01:40

「リストボックス」タグは GUI 要素のことです. リスト構造とは関係ありませんので, 外されたほうが良いと思います.
tatsu99

2019/08/09 03:33

リストが昇順に並んでいることを前提にされているように見えますが、 昇順でなくてもよいのでしょうか。 例えばaが a:10→3→6→1→NULLの場合 a-bの結果は 10→6→1→NULL であってますか。 又、aに3が複数あるとき、結果はどうなりますか。 a:1→3→6→10→3→NULLの場合 a-bは 1→6→10→3→NULL ですか、それとも 1→6→10→NULL ですか。
apeirogon0813

2019/08/10 18:07

すみません、線形リストa,bは昇順に並んでいることが前提で考えてます。
guest

回答2

0

ベストアンサー

return tail->next = diff(a->next, b);

これは tail->next をreturnしていますが,意図した動作ではないのでは?
(他の分岐先のreturnも同様)

最終的に
10→NULL と NULL が引数に与えられた時点で return a; によって 10→NULLがreturnされ,
それが前記 return tail->next =...; で上へ上へと返されるため,その結果になるのでしょう.

投稿2019/08/09 02:03

編集2019/08/09 02:04
fana

総合スコア11632

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

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

apeirogon0813

2019/08/10 18:30

ありがとうございます。原因が理解できました! tail->next = diff(); return head->next; で動作しました。
guest

0

入力と出力とコードがあるのですから, コンピュータになったつもりで一行ずつ机上で実行してみては如何でしょうか.

投稿2019/08/09 01:51

jimbe

総合スコア12545

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

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

apeirogon0813

2019/08/10 18:31

繋がっていることだけ考えていたあまり、returnされる場所を見誤っていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問