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

構造体のあるメンバを基準にソートするには?

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

お礼率 67% (55/82)

以下のように定義した構造体(下の構造体は入れ子になっている)を必要な時に動的に割り当てた後(デー多数は不定)、たとえば、商品価格を基準に降順、昇順に並び替える機能を追加したいのですが、どのように解決したらよろしいでしょうか?
/* 現在の日時を格納する構造体 */
typedef struct time_type{
int year;
int month;
int day;
}time_type;

/* 商品の情報を格納する構造体 */

typedef struct shohin_type{
int code; /* 商品コード */
int price; /* 商品価格 */
char *name; /* 商品名 */
int flag; /* フラグ */
struct time_type date; /* 登録日 */
struct shohin_type *before; /* 前の構造体のアドレス */
struct shohin_type *next; /* 次の構造体のアドレス */
}shohin_type;
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.1
レベル13

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

クイックソートもどきのコーディングをしてみました。
考え方としては、データをある基準より前に来るものと後に来るものに
分けた上で、それぞれについて再帰的に同様の処理をします。
コンパイルも実行もしていませんので、「自信なし」としておきます。
なお、昇順のみです。降順への拡張はご自身で考えてみて下さい。

 void sort(struct shohin_type **first, struct shohin_type **last)
 {
  struct shohin_type *datum = *first;
  struct shohin_type *candidate;
  struct shohin_type *next;
  if (datum)
  {
   candidate = datum->next;
   while (candidate && (cadidate != *last))
   {
    next = candidate->next;
    if (datum->price > cadidate->price)
    {
     if (candidate->before)
     {
      candidate->before->next = candidate->next;
     }
     if (candidate->next)
     {
      candidate->next->before = candidate->before;
     }
     if (datum->before)
     {
      datum->before->next = candidate;
     }
     candidate->before = datum->before;
     datum->before = candidate;
     candidate->next = datum;
    }
   }
   sort(first, &datum->before);
   sort(&daum->next, last);
  }
 }
お礼コメント
kiroro302

お礼率 67% (55/82)

ranxさん、ご回答どうもありがとうございました。お礼が遅くなり大変申し訳ございません。これは商品管理プログラムで、商品の登録、更新、削除、検索、ソート、復旧(削除したものをもどす。)等の機能があり、登録したものをソートするのにどうすればよいのか悩んでおりました。ややこしいですが、なんとなくわかったようなわからないようなあやふやな感じなので、教えていただいた、ソースを参考に昇順にソートする関数を作ってみました。これを元に降順関数を作成してみます。ご指導ありがとうございました。またよろしくお願いいたします。
投稿日時 - 2002-02-26 17:38:51
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.2
レベル13

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

やっぱり「自信なし」で正解だったな。 ループの最後に抜けがありました。  candidate = candidate->next;
やっぱり「自信なし」で正解だったな。
ループの最後に抜けがありました。
 candidate = candidate->next;


このQ&Aのテーマ
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

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

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

特集


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

-PR-

ピックアップ

-PR-
ページ先頭へ