チェインの繋ぎ方……?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シュウ

チェインの繋ぎ方……?

#1

投稿記事 by シュウ » 16年前

初めまして、シュウといいます。

現在、とあるC言語入門書に載っている下記の『自己参照構造体(チェイン)』のプログラムが理解できず、
悩んでいます。
ポインタによるアドレス・関数の受け渡しや制御文の意味などは理解でき、実際に記述してコンパイル→実行もできたのですが、どうしてもこのプログラムの41行目にある

  for(wp=start; wp->next != NULL; wp = wp->next)

という部分が理解できません。
wp は start のアドレスを示しており、start->next は NULL の筈なのに、どうしてこの for文 が何の問題もなく実行されるのでしょうか?

何方か、分かりやすい説明をお願いします。



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct person {
    char name[30];
    int age;
    struct person *next;
};

main()
{
    struct person dmy;
    struct person *start=&dmy;
    struct person *wkdata;
    struct person *wp;
    char name[30]=" ",buf[10];
    int  tosi;

    start=&dmy;
    start->next=NULL;

    while(1){
        printf("名前=");
        gets(name);
        if(strcmp(name,"") == 0) break;
        printf("年齢=");
        gets(buf); tosi=atoi(buf);

        wkdata=(struct person *)malloc(sizeof(struct person));
        if(wkdata==NULL){
            printf("メモリ確保できません.\n");
            exit(1);
        }

    strcpy(wkdata->name,name);
    wkdata->age = tosi;

    for(wp=start; wp->next != NULL; wp = wp->next){
        if(tosi < wp->next->age){
            wkdata->next = wp->next;
            wp->next = wkdata;
            break;
        }
    }

    if(wp->next == NULL){
        wkdata->next = NULL;
        wp->next = wkdata;
        }
    }

    for(wp = start->next; wp != NULL; wp = wp->next){
        printf("%s %d\n",wp->name,wp->age);
    }
}

toyo

Re:チェインの繋ぎ方……?

#2

投稿記事 by toyo » 16年前

start->nextがNULLなのは1回目だけです
1回目はNULLなので最初のfor文の中はもちろん実行されません
if(wp->next == NULL){
        wkdata->next = NULL;
        wp->next = wkdata;
        }
    }
のところでwp(=start)->nextにwkdataが代入されますので2回目からはforの中が実行されます

御津凪

Re:チェインの繋ぎ方……?

#3

投稿記事 by 御津凪 » 16年前

> for(wp=start; wp->next != NULL; wp = wp->next)
一番最初に呼ばれる時、このfor文では、
最初の条件で( wp->next が NULL でないかをチェックしているため)偽となり、
for文の中身を実行せずにスルーします。
(for文に書かれている処理の実行順序は分かりますか?)

シュウ

Re:チェインの繋ぎ方……?

#4

投稿記事 by シュウ » 16年前

>>toyo様

一回目は if文 を実行した後、上の for文 に二回目として戻る……ということですか?
喉まで出掛かってる感じ……あと一押しで理解できそうなのに、何故か理解できない……。


>>御津凪様

for(最初だけ初期化して; こうなら実行; その後こうしてまた判定) ……ですよね?
一番上の for文 をスルーした後、下の if文 を経て、更にその下の for文 へと移る訳ではないのですか?

シュウ

Re:チェインの繋ぎ方……?

#5

投稿記事 by シュウ » 16年前

toyo様と御津凪様のお二人の返答を吟味してもう一度プログラムを読み解いていった結果、漸く理解することができました。

一人以下なら whileループ 後のプログラムが実行されるのは一度だけで、二人以上の場合はそれが複数回実行されるということだったのですね!

懇切丁寧な説明、どうもありがとうございました。
これからも、どうしても理解できない問題が出てきたときは頼りにさせていただきたく思います。

閉鎖

“C言語何でも質問掲示板” へ戻る