C言語関係掲示板

過去ログ

No.423.リストのソート

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

並び変えたいです
投稿者---009(2002/10/14 14:55:22)


ここのHPのhttp://www9.plala.or.jp/sgwr-t/c/sec15-5.htmlを参照させて
もらい、個数を指定してランダムな値をリストに入れるというのを作りました。
更にランダムな値をソートして表示したいのですが、お手上げ状態になってしまいました…。
自分が考えたところまでのプログラムを下にUPしました。よければ、
添削していただけないでしょうか。どうかよろしくお願いします

http://www005.upp.so-net.ne.jp/New-type/tensaku.c

No.2938

Re:並び変えたいです
投稿者---かずま(2002/10/14 23:22:28)


> http://www005.upp.so-net.ne.jp/New-type/tensaku.c

void sort_list(struct list *p,int a) の中で、p に i や t を足していますが、
p が配列を指しているわけではないので、p+i は意味がありません。

sort_list を次のように書き直せばよいでしょう。
struct list *sort_list(struct list *p)
{
    struct list *head, *cur, *prev;

    if (p == NULL)
        return NULL;
    head = p;
    p = p->next;
    head->next = NULL;
    while (p) {
        cur = p;
        p = p->next;
        if (cur->key < head->key) {
            cur->next = head;
            head = cur;
        } else {
            for (prev = head; prev->next; prev = prev->next)
                if (cur->key < prev->next->key)
                    break;
            cur->next = prev->next;
            prev->next = cur;
        }
    }
    return head;
}

呼び出しは、head = sort_list(head); です。


No.2941

Re:並び変えたいです
投稿者---かずま(2002/10/15 17:28:57)


> sort_list を次のように書き直せばよいでしょう。

もう少し、簡単になります。
struct list *sort_list(struct list *p)
{
    struct list head, *cur, *prev;

    head.next = NULL;
    while (p) {
        cur = p;
        p = p->next;
        for (prev = &head; prev->next; prev = prev->next)
            if (cur->key <= prev->next->key) break;
        cur->next = prev->next;
        prev->next = cur;
    }
    return head.next;
}


No.2942

Re:並び変えたいです
投稿者---009(2002/10/15 21:51:28)


プログラムありがとうございます。
今晩じっくり考えさせてもらいます。

かずまさん、ほんとにありがとうございました。