![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
参考書の次のプログラムで、どうしても分からないことがあります。
-------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct person {
char name[30];
int age;
struct person *next;
} Person;
void getsn(char *ss, int n); // gets()の代替関数
int main(void)
{
Person dmy = {"", 0, NULL}; // NULLを終端マークにする
Person *start = &dmy; // 先頭管理用の構造体を指す
Person *wkdtp; // 作業用の構造体を指す
Person *ip; // forループ制御用
char name[30], age_ss[10]; // データ入力用
while (1) {
/* キーボードからデータを入力する */
printf("名前 = ");
getsn(name, 80);
if (strcmp(name, "") == 0) break; // 改行だけなら入力の終了
printf("年齢 = ");
getsn(age_ss, 80);
/* 構造体1個分のメモリを確保する */
wkdtp = (Person *)malloc(sizeof(Person));
if (wkdtp == NULL) {
printf("メモリ確保できません。\n");
exit(EXIT_FAILURE);
}
/* 確保した構造体に名前と年齢を設定する */
strcpy(wkdtp->name, name);
wkdtp->age = atoi(age_ss);
/* 作成した構造体wkdtpを既存のチェーンにはめ込んでいく */
for (ip = start; ip->next != NULL; ip = ip->next) {
if (wkdtp->age < ip->next->age) {
wkdtp->next = ip->next;
ip->next = wkdtp;
break;
}
}
/* 最高齢だったらチェーンの最後につなぐ */
if (ip->next == NULL) {
ip->next = wkdtp;
wkdtp->next = NULL;
}
}
/* チェーンをたどって構造体の内容を表示する */
for (ip = start->next; ip != NULL; ip = ip->next)
printf("%s %d\n", ip->name, ip->age);
free(wkdtp);
return EXIT_SUCCESS;
}
void getsn(char *ss, int n)
{
fgets(ss, n, stdin);
if (ss[strlen(ss)-1] == '\n')
ss[strlen(ss)-1] = '\0';
}
-------------------------
【実行結果】
-------------------------
名前 = 田中一郎(キーボードから入力)
年齢 = 20(キーボードから入力)
名前 = 伊藤二郎(キーボードから入力)
年齢 = 40(キーボードから入力)
名前 = 鈴木三郎(キーボードから入力)
年齢 = 10(キーボードから入力)
名前 = 内田四郎(キーボードから入力)
年齢 = 30(キーボードから入力)
名前 = [Enter]のみ入力
鈴木三郎 10
田中一郎 20
内田四郎 30
伊藤二郎 40
-------------------------
これをトレースしていて、ポインタstartの中身がどうしても分からないので、プログラムの所々にprintf()を入れて、start->nextとip->nextを文字列として出力させたら、次のようになりました。
【改変したプログラムの実行結果】
-------------------------
whileループ1回目
名前 = 田中一郎
年齢 = 20
start->next = (null), ip->next = (null)
start->next = 田中一郎, ip->next = 田中一郎
whileループ2回目
名前 = 伊藤二郎
年齢 = 40
whileループ2回目中のforループ1回目:
start->next = 田中一郎, ip->next = 田中一郎
if文は偽
start->next = 田中一郎, ip->next = (null)
start->next = 田中一郎, ip->next = 伊藤二郎
whileループ3回目
名前 = 鈴木三郎
年齢 = 10
whileループ3回目中のforループ1回目:
start->next = 田中一郎, ip->next = 田中一郎
if文は真
start->next = 鈴木三郎, ip->next = 鈴木三郎
start->next = 鈴木三郎, ip->next = 鈴木三郎
start->next = 鈴木三郎, ip->next = 鈴木三郎
whileループ4回目
名前 = 内田四郎
年齢 = 30
whileループ4回目中のforループ1回目:
start->next = 鈴木三郎, ip->next = 鈴木三郎
if文は偽
whileループ4回目中のforループ2回目:
start->next = 鈴木三郎, ip->next = 田中一郎
if文は偽
whileループ4回目中のforループ3回目:
start->next = 鈴木三郎, ip->next = 伊藤二郎
if文は真
start->next = 鈴木三郎, ip->next = 内田四郎
start->next = 鈴木三郎, ip->next = 内田四郎
start->next = 鈴木三郎, ip->next = 内田四郎
whileループ5回目
名前 =
鈴木三郎 10
田中一郎 20
内田四郎 30
伊藤二郎 40
-------------------------
これでも、どうしても分からない疑問が残りました。
forループの第1項で、ip=start;が実行されるので、
ip->next = wkdtp;
が実行されるとstart->nextも変化することは理解できるのですが、それなのにそれ以降でstart->nextとip->nextが違う変化をするのはなぜでしょうか。プログラムを慎重にトレースしていっても、どうしても分かりません。
forループの第1項でip=start;とされたipとstartが、どうして同じ変化をしたり異なったりするのでしょうか。
どなたか解説をお願い致します。
No.2ベストアンサー
- 回答日時:
うん, そこ.
そこで ip と start が違う値になれば, 「start->nextとip->nextが違う変化をする」としてもおかしくないでしょ?
ありがとうございます。なんだか、あまりにも悩んだ割にあっさりと解決して拍子抜けしました。せっかくforループ1回ごとの中身を表示させているのに、そのループごとにip=start;で初期化されるように勘違いしていました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
入力した文字列から母音だけを...
-
プログラムで関数は使わない方...
-
UWSCにてある一定の動作を無限...
-
fortran 論理変数? true
-
C言語のfor文の{}について
-
VBScriptでSQLに接続し、CSV出...
-
猫でもわかる、がわかりません。
-
ループを途中で抜けたいのですが。
-
C言語forループが完結した場合...
-
PHPの否定文
-
break文でループを一気に抜ける...
-
C言語、whileループを抜け出す...
-
プログラムの『軽い』と『重い...
-
プログラミングで質問です。言...
-
どうしてもわからないC言語の問題
-
strstr()関数の実装内容について。
-
C言語 キーボードで入力された...
-
While文の終わりにセミコロンが...
-
C言語の関数の戻り値がおかしい?
-
プログラムの解説をお願いします。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
入力した数値を倍々するプログラム
-
For文の終了値を関数にしても問...
-
C言語forループが完結した場合...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
if文の中にfor文なのか、for文...
-
Excel VBAで年度をまたぐ期間の...
-
C言語、whileループを抜け出す...
-
for文while文の無限ループの違...
-
プログラムで関数は使わない方...
-
Cプログラムが終了しない
-
PIC のプログラムについて ど...
-
アルゴリズムです!四つの数字...
-
UWSCにてある一定の動作を無限...
-
繰り返し文の利点について
-
ループの特定入力終了
-
PAD図の書き方
おすすめ情報