• ベストアンサー

構造体のソートの記述について

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

質問者が選んだベストアンサー

  • ベストアンサー
  • akinori_s
  • ベストアンサー率60% (21/35)
回答No.2

標準関数の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; } 基本的に考え方はこうなります。 実際にコンパイルして確かめたわけじゃないので、エラー等おきるかもしれませんが(^^;

1976no12ri29
質問者

補足

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

その他の回答 (2)

  • akinori_s
  • ベストアンサー率60% (21/35)
回答No.3

>試してみたのですが、エラーがおきてしまいました。 カットアンドペーストしたのなら空白を全角スペースで入れてるので 全角スペースをタブなり半角スペースに変えてみて下さい。

1976no12ri29
質問者

お礼

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

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

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

関連するQ&A