アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (2件)

クイックソートもどきのコーディングをしてみました。


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

 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);
  }
 }
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/02/26 17:38

やっぱり「自信なし」で正解だったな。


ループの最後に抜けがありました。
 candidate = candidate->next;
    • good
    • 0

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