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

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

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

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

Q&A

解決済

1回答

660閲覧

Cで思い通りの出力が出ません...

aardvark

総合スコア17

C

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

0グッド

0クリップ

投稿2020/04/20 13:42

入力:2つの非負整数列
・1つの列中の値は全て異なり、小さい順に並んでいる
・列の最後は-1が入っている
・標準入力から与えらえる
出力:2つの数列に共通して現れる値を小さい順に標準出力
・末尾に-1をつける

以上のようなプログラムを書こうとしています。

例えば、
入力:
1 2 3 4 5 -1
2 4 6 7 -1
出力:
2 4 -1

という具合です。

ところが、以下のようなコードを実行すると、なぜか後ろに2番目に入力した数列が逆の順番で並ぶのが付いてしまいます。先程の例だと、"2 4 -1"ではなく"2 4 7 6 4 2 -1"という具合です。

色々試してみましたが、どうしてもうまく直せません。
どなたか間違いを指摘していただければ幸いです。宜しくお願いします。

C

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5#define NEW(p, n){p = malloc((n)*sizeof(p[0]));} 6 7typedef struct slobj_{ 8 int v; 9 struct slobj_* next; 10}* slobj; 11 12typedef struct{ 13 slobj head; 14}* slist; 15 16slist slist_new(void) 17{ 18 slist L; 19 NEW(L, 1); 20 L -> head = NULL; 21 return L; 22} 23 24slobj slobj_new(int x) 25{ 26 slobj p; 27 NEW(p, 1); 28 p -> v = x; 29 p -> next = NULL; 30 return p; 31} 32 33void slist_insert_head(slist L, slobj p){ 34 p -> next = L -> head; 35 L -> head = p; 36} 37 38slist slist_join(slist L1, slist L2){ 39 slist L3; slobj p3; 40 slobj p1 = L1 -> head; slobj p2 = L2 -> head; 41 while (p1 != NULL && p2 != NULL){ 42 if(p1->v == p2->v){ 43 slobj p3 = slobj_new(p1->v); 44 slist_insert_head(L3, p3); 45 p1 = p1->next; 46 p2 = p2->next; 47 }else if(p1->v > p2->v){ 48 p1 = p1->next; 49 }else if(p1->v < p2->v){ 50 p2 = p2->next; 51 }else{ 52 break; 53 } 54 } 55 return L3; 56} 57 58void slist_print(slist L) 59{ 60 slobj p; 61 p = L->head; 62 while (p != NULL){ 63 printf("%d ", p -> v); 64 p = p-> next; 65 } 66} 67 68int main(){ 69 slist L1 = slist_new(); 70 slist L2 = slist_new(); 71 slist L3 = slist_new(); 72 slobj p1, p2; 73 int temp1, temp2; 74 scanf("%d", &temp1); 75 while(temp1 >= 0){ 76 slobj p1 = slobj_new(temp1); 77 slist_insert_head(L1, p1); 78 scanf("%d", &temp1); 79 } 80 scanf("%d", &temp2); 81 while(temp2 >= 0){ 82 slobj p2 = slobj_new(temp2); 83 slist_insert_head(L2, p2); 84 scanf("%d", &temp2); 85 } 86 L3 = slist_join(L1, L2); 87 slist_print(L3); 88 printf("%d\n", -1); 89 return 0; 90}

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

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

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

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

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

guest

回答1

0

ベストアンサー

slist_join()関数において、

c

1slist slist_join(slist L1, slist L2){ 2 slist L3; slobj p3;

のようにローカル変数として宣言したL3を、slist_new()を用いて初期化していないからではないでしょうか。

宣言しただけで内容不定のL3にslist_insert_head()で値を挿入してしまっているために、不定なところに値を挿入している上に、終端も正常に行われていないので、思い通りの結果が得られないように思います。

投稿2020/04/20 14:38

keicha_hrs

総合スコア6768

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

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

aardvark

2020/04/20 14:51

解決しました!! ありがとうございます。
keicha_hrs

2020/04/20 14:58

malloc()で確保したメモリをfree()で返却していないのは構造としてよろしくないので、その辺りも改修をされた方が良いかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問