ページ 1 / 1
構造体、ノードに関して質問があります
Posted: 2017年12月19日(火) 12:11
by Codecode
C言語初心者です。
最近、構造体やノードについて学んだのですが以下の問題が解けなくて困っております
新しいノードをリストの最後に追加するように修正しなさい。このとき変数tailは使いません。リストの末尾のノードは次のプログラムで見つけることができます。
struct node *q;
q = head;
while(q->next != NULL) q = q->next;
なのですが途中まで考えたのですが思った通りに動かなくて困っています
例えば、
1
2
3
と入力したら
1
2
3
と出力されるようにしたいです
入力しても一つも出力されない状態です
以下の書きかけのプログラムで申し訳ないですが教えて頂けると幸いです
具体的には、リストの末尾に要素を追加、の後を教えてください
よろしくお願いします
コード:
#include <stdio.h>
#include <stdlib.h>
struct node {
int num;
struct node *next;
};
main()
{
struct node *head, *p, *q;
int x;
head = NULL;
while(scanf("%d",&x) != EOF) {
p = (struct node *)malloc(sizeof(struct node));
head ->num = x;
/* リストの末尾に要素を追加 */
}
/* リストの要素のnumの値を先頭から順に表示する */
head = p;
while(p) {
printf("%d\n",p->num);
p = p->next;
}
}
Re: 構造体、ノードに関して質問があります
Posted: 2017年12月19日(火) 14:34
by usao
> 途中まで考えたのですが思った通りに動かなくて困っています
> 以下の書きかけのプログラムで
そりゃ,途中までしか考えてなくて書きかけなのであれば思った通りに動かないでしょう.
まず,最後まで考えたらいかがでしょうか.
・最初,head=NULLであり(line11),その状態で head->num に値を代入する(line14) のは間違っていると思います.
→つまり,どうにかしてheadをNULLでない状態に移行させる必要があるでしょう.どうすべきでしょうか?
・せっかく作ったノード(line13)を誰も使いません.目的があって作ったのでしょうから使うべきでは?
→新しく作ったノードの内容{num,next}はどうすべきでしょうか.
→新しく作ったノードをリストの末尾に連結するには何をすればよいのでしょうか.
Re: 構造体、ノードに関して質問があります
Posted: 2017年12月19日(火) 14:37
by usao
> ・せっかく作ったノード(line13)を誰も使いません.
おおっと,コードを良く見るとline18にて参照されていますね.
(まぁ個人的にはline18は間違いだと思うけども)
Re: 構造体、ノードに関して質問があります
Posted: 2017年12月19日(火) 18:08
by Codecode
返信ありがとうございます。
以下のようにプログラミングしなおしましたが最後の数字しか出力されない状態です
教えていただけると幸いです。
コード:
#include <stdio.h>
#include <stdlib.h>
struct node {
int num;
struct node *next;
};
main()
{
struct node *head, *p, *q;
int x;
head = NULL;
while(scanf("%d",&x) != EOF) {
p = (struct node *)malloc(sizeof(struct node));
if(head == NULL) head = p;
else{
p ->num =x;
p ->next = NULL;
head ->next = p;
}
}
/* リストの要素のnumの値を先頭から順に表示する */
head = p;
while(p) {
printf("%d\n",p->num);
p = p->next;
}
}
Re: 構造体、ノードに関して質問があります
Posted: 2017年12月19日(火) 18:28
by usao
(1)コードに変化があった部分に関して:
このコードだと,最初のノードの要素が設定されないと思います.
headがNULLか否かで変えるべき処理は,新規生成したノードをリストに加える方法だけであって,
新規に生成したノードの要素{num,next}を適切に設定することは常に行わねばならないでしょう.
(2)最後の数字しか出力されないことに関して:
先にも書きましたが,line24の head = p; は間違いでしょう.(右辺と左辺が逆なのでは?)
headはリストの最初のノードを指さなければならないのに,それを書き換えてしまったら,
せっかく作ったリストを先頭から走査して表示することができなくなってしまいます.
Re: 構造体、ノードに関して質問があります
Posted: 2017年12月19日(火) 18:38
by Codecode
何度も申し訳ございません。
ご指摘いただいた箇所につきまして訂正いたしましたところ最初に入力した数字と最後に入力した数字の二つが出力されるようになり、
間の数字(例の場合:2)が出力されませんでした。
ご協力のほどよろしくお願いいたします。
コード:
#include <stdio.h>
#include <stdlib.h>
struct node {
int num;
struct node *next;
};
main()
{
struct node *head, *p, *q;
int x;
head = NULL;
while(scanf("%d",&x) != EOF) {
p = (struct node *)malloc(sizeof(struct node));
if(head == NULL) {
head = p;
head ->num = x;
head ->next = p ;
}else{
p ->num =x;
p ->next = NULL;
head ->next =p;
}
}
/* リストの要素のnumの値を先頭から順に表示する */
p = head;
while(p) {
printf("%d\n",p->num);
p = p->next;
}
}
Re: 構造体、ノードに関して質問があります
Posted: 2017年12月19日(火) 20:36
by usao
2つ出力されるのは,リストの要素が2つしかないからでしょう.
line23が原因でしょう.
headとはリストの先頭の要素ですから,これだと,何個目の入力であっても常に「リストの2つ目として」リストに連結してしまうことになります.
新しいノードは常に「リストの末尾」に追加するべきです.
あと,line19で head->next = p; とするのはまずいですね.
最初のノードがリストに追加された時点で,「head自体がpであり,そのnextもp」という状態になります.
これだと入力が1つだけの場合に後段の表示が無限ループになってしまいますね.
Re: 構造体、ノードに関して質問があります
Posted: 2017年12月19日(火) 20:41
by usao
末尾に追加する際,当然,現在の末尾ノードを知る必要があるわけですが,
> このとき変数tailは使いません。リストの末尾のノードは次のプログラムで見つけることができます。
という制約条件?があるようですから,
その時々における末尾要素を記憶しておく方法を取ってはいけないのかもしれませんね.
Re: 構造体、ノードに関して質問があります
Posted: 2017年12月20日(水) 10:17
by Codecode
返信が遅くなり申し訳ございません。
ご指摘通りに書き直したところ、無事作動いたしました。
何度も丁寧な返信を送っていただき、本当にありがとうございました。
また何かありましたら教えていただけると幸いです。
このたびは誠にありがとうございました。