プロが教えるわが家の防犯対策術!

 C言語で自己参照構造体(beforeとnextで繋げてます)で名簿をつくり、年齢で昇順ソートをしようと考えています。
 そこで、ソート関数の「qsort」というものを使ってソートしたいのですが、どのように使ったらいいのでしょうか?

 参考例などがありましたら、教えていただけますか?
 よろしくお願いします。

A 回答 (3件)

標準関数のqsortを使用するのですよね?


qsortには配列を渡してあげなきゃいけないので
ノードで持っているのを配列に作り直してからqsortをかけて
最後にノードの再構築をしなくてはならないと思います。


struct person{
 struct person* before;
 struct person* next;
 int age
};

/* 比較関数 */
int compare(const void *e1, const void *e2)
{
 struct person* p1 = *((person**)e1);
 struct person* p2 = *((person**)e2);
 return p1->age - p2->age;
}

struct person* sort(struct person* top)
{
 int i,count;
 struct person *new_top;
 struct person *p;
 struct person *prev;
 struct person** array;

 /* 要素数をカウント */
 for(count=0,p=top;p;p=p->next) count++;

 /* 配列を作成 */
 array = (struct person**)malloc(count*sizeof(struct person*));
 for(i=0,p=top;p;p=p->next) array[i++]=p;

 /* qsort */
 qsort(array,count,sizeof(struct person*),compare);

 /* nodeを作り直す */
 prev = new_top = array[0];
 new_top->before = null;
 new_top->next = null;
 for(i=1;i<count;i++){
  prev->next = p = array[1];
  p->before = prev;
  p->next = null;
  prev = p;
 }

 //配列の開放
 free(array);
 return new_top;
}

基本的に考え方はこうなります。
実際にコンパイルして確かめたわけじゃないので、エラー等おきるかもしれませんが(^^;

この回答への補足

試してみたのですが、エラーがおきてしまいました。error C2018:文字'0x81'は認識できません。と error C2018:文字'0x40'は認識できません。というようなエラーが出てしまったのですが、これはどういったことなんですか?教えていただけますか?よろしくお願いします。

補足日時:2002/01/25 13:14
    • good
    • 0

>試してみたのですが、エラーがおきてしまいました。



カットアンドペーストしたのなら空白を全角スペースで入れてるので
全角スペースをタブなり半角スペースに変えてみて下さい。
    • good
    • 0
この回答へのお礼

参考になりました。ありがとうございます。また何かありましたら、よろしくお願いします。ではでは

お礼日時:2002/01/30 16:12

標準関数のqsort()は配列に収められたデータをソートするものですから、


おっしゃるような構造のデータには適用できないと思います。
アルゴリズム自体はそれほど難しいものではなく、再帰的アルゴリズムの
練習によく使われたりするものですから、自作されてはいかがでしょう。
検索サイトでクイックソートを検索すると、いくつも紹介しているサイトが
見つかります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!