OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 困ってます
  • 質問No.204731
  • 閲覧数959
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 29% (17/57)

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

 参考例などがありましたら、教えていただけますか?
 よろしくお願いします。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル8

ベストアンサー率 60% (21/35)

標準関数の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

お礼率 29% (17/57)

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

その他の回答 (全2件)

  • 回答No.1
レベル13

ベストアンサー率 24% (357/1463)

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

ベストアンサー率 60% (21/35)

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

カットアンドペーストしたのなら空白を全角スペースで入れてるので
全角スペースをタブなり半角スペースに変えてみて下さい。
お礼コメント
1976no12ri29

お礼率 29% (17/57)

参考になりました。ありがとうございます。また何かありましたら、よろしくお願いします。ではでは
投稿日時 - 2002-01-30 16:12:58
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ