- ベストアンサー
構造体のソートの記述について
C言語で自己参照構造体(beforeとnextで繋げてます)で名簿をつくり、年齢で昇順ソートをしようと考えています。 そこで、ソート関数の「qsort」というものを使ってソートしたいのですが、どのように使ったらいいのでしょうか? 参考例などがありましたら、教えていただけますか? よろしくお願いします。
- みんなの回答 (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; } 基本的に考え方はこうなります。 実際にコンパイルして確かめたわけじゃないので、エラー等おきるかもしれませんが(^^;
その他の回答 (2)
- akinori_s
- ベストアンサー率60% (21/35)
>試してみたのですが、エラーがおきてしまいました。 カットアンドペーストしたのなら空白を全角スペースで入れてるので 全角スペースをタブなり半角スペースに変えてみて下さい。
お礼
参考になりました。ありがとうございます。また何かありましたら、よろしくお願いします。ではでは
- ranx
- ベストアンサー率24% (357/1463)
標準関数のqsort()は配列に収められたデータをソートするものですから、 おっしゃるような構造のデータには適用できないと思います。 アルゴリズム自体はそれほど難しいものではなく、再帰的アルゴリズムの 練習によく使われたりするものですから、自作されてはいかがでしょう。 検索サイトでクイックソートを検索すると、いくつも紹介しているサイトが 見つかります。
補足
試してみたのですが、エラーがおきてしまいました。error C2018:文字'0x81'は認識できません。と error C2018:文字'0x40'は認識できません。というようなエラーが出てしまったのですが、これはどういったことなんですか?教えていただけますか?よろしくお願いします。