C言語関係掲示板

過去ログ

No.389.自己参照構造体を昇順表示

[戻る] [ホームページ]
No.2632

15章構造体のところで
投稿者---かん(2002/09/07 01:56:53)


(3)の自己参照構造体の例題なんですが、
自己参照構造体を基本から学習しようと
例題では、打ち込んだ順番の最後から逆順にリスト表示されているのを、
トップから順番に表示する仕様に変えようと頑張ってみたのですが、
参考書にも自己参照構造体は載っていなくて、
息詰まってしまいました。

headポインタのつなぎかえのところを直しているのですが、
最初から表示するように渡せませんでした。
考え方が間違っているのでしょうか?

すみませんが、どなたかアドバイスお願いいたします。

No.2633

Re:15章構造体のところで
投稿者---TDa(2002/09/07 19:47:19)


>headポインタのつなぎかえのところを直しているのですが、
>最初から表示するように渡せませんでした。
>考え方が間違っているのでしょうか?

例題ではheadに新たな要素を追加していますがリストの最後に追加するように
しましょう。線形リストでは頭からたどっていかなくてはならないので効率は
よくありません。効率を考えたら最後の要素も記憶しておくと言う方法もあります。

このヒントでわかるでしょうか?

No.2647

Re:15章構造体のところで
投稿者---かずま(2002/09/09 02:52:26)


> 自己参照構造体を基本から学習しようと
> 例題では、打ち込んだ順番の最後から逆順にリスト表示されているのを、
> トップから順番に表示する仕様に変えようと頑張ってみたのですが、
struct list *reverse_list(struct list *head)
{
    struct list *next, *prev = NULL;

    if (head == NULL) return NULL;
    for (;;) {
        next = head->next;
        head->next = prev;
        prev = head;
        if (next == NULL) return head;
        head = next;
    }
}
このような、リストを反転する関数を用意して、

    head = reverse_list(head);

とするのもひとつの手です。

既にヒントが出ている、リストの末尾に追加するやり方では、add_list を
次のように変更すればできます。

struct list *add_list(int key, char *name, struct list *tail)
{
    struct list *p = malloc(sizeof *p);
    if (p == NULL) printf("out of memory\n"), exit(1);
    p->key = key;
    strcpy(p->name, name);
    p->next = NULL;
    if (tail != NULL) tail->next = p;
    return p;
}

呼び出しは次のようになります。

    struct list *head = NULL; /* 先頭ポインタ */
    struct list *tail = NULL; /* 末尾ポインタ */
    
    while (scanf("%d %s", &key, name) == 2) {
        tail = add_list(key, name, tail);
        if (head == NULL) head = tail;
    }


No.2660

Re:15章構造体のところで
投稿者---かん(2002/09/09 20:44:10)


>TDaさん かずまさん

お二人とも丁寧な解説ありがとうございました。
おかげで大変参考になり勉強なりました。

どうもありがとうございました。