みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

[C言語]ソート関数の作成

現在受け取った構造体を受け取ってソートしてポインタで書き換える関数を作成しています。

構造体の配列
typedef struct{
char name[50];
int age;
}member;

member seito[10]

strcpy(seito[0].name,"yamada")
seito[0].age = 15;

strcpy(seito[2].name,"ito")
seito[2].age = 17;

strcpy(seito[3].name,"saito")
seito[3].age = 19;

こちらの構造体は例です。

seito[2]の情報を[1]に
seito[3]の情報を[2]に移動させたいのですが、上手くいきません。

構造体配列を、1引いてあげれば良いと思ったのですが、そうすると[0]までマイナスしてしまい上手く判定が出来ません。
どうかアドバイスお願いいたします。

投稿日時 - 2008-06-29 15:59:38

QNo.4138216

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

構造体のコピーで悩んでいるのでしょうか?

seito[2]をseito[1]にコピーしたいなら、
seito[1]=setito[2];
ですみますが・・・

入れ替えしたいのなら、
member temp;
temp=seito[1];
seito[1]=seito[2];
seito[2]=temp;

はずしてたらすいません。

投稿日時 - 2008-06-30 19:49:13

ANo.5

> 期待していた結果は、他の関数で[0][1][2][3]と入っていた配列が
> [0][2][3]と書き換えられ(削除されその削除された[1]を埋めるために
> [2]のデータを[1]として入れるという結果でした。

ソート関係ないやん! と突っ込んでみました。
これって「リスト」とか「リンクリスト」と呼ばれるデータ構造で対応すべき話ですよね。「アルゴリズムとデータ構造」をキーワードにググってみてください。


http://www.geocities.jp/ky_webid/algorithm/010.html
http://tdweb.cssa.chs.nihon-u.ac.jp/ds/ds06.html
http://ja.wikipedia.org/wiki/%E9%80%A3%E7%B5%90%E3%83%AA%E3%82%B9%E3%83%88

投稿日時 - 2008-06-29 20:17:08

ANo.4

1.上手くいかない、というのは具体的にはどうなってしまうのでしょうか?
2.そのソートする関数では、受け取った構造体の配列を「何の順に」ソートするのですか? (年齢? 名前?)

参考までに、年齢の若い順に並べ替える例を書いておきます。

/**
 sort_member_by_age
 member構造体の配列を年齢の若い順に並べ替える。

 引数 [in/out] mem    member構造体配列の先頭アドレス
 引数 [in]   mem_count member構造体配列の要素数
 戻り値    -1     並べ替え失敗
        0      並べ替え成功

 備考:もっとも簡単なバブルソートの例です。
*/
int sort_member_by_age(member mem[], int mem_count)
{
 int i, j;

 /* 入力引数に対するエラー処理 */
 memがNULLなら return -1;
 みたいな感じで。

 /* mem年齢の順に並べ替える。 */
 バブルソートそのもの。
 for(i=0; i<mem_count-1; i++){
  for(j=mem_count-1; j<i; j--){
   mem[j]とmem[j-1]のageを比較して、mem[j].ageの方が小さかったら中身を入れかえる;
  }
 }

 return 0; /* 成功 */
}

中身を入れ替える方法は次の通りです。
入れ替える要素の番号を仮に a, b とします。
 member  swap; /* 一時退避用 */

 swap = mem[a];
 strcpy( swap.name, mem[a].name );

 mem[a] = mem[b];
 strcpy( mem[a].name, mem[b].name );

 mem[b] = swap;
 strcpy( mem[b].name, swap.name );
 // aとbの入れ替え完了。

位置合わせをするために全角スペースを入れてありますので、このままコピーしてもコンパイルが通りませんのでご注意ください。

投稿日時 - 2008-06-29 17:20:14

ANo.3

 どういう環境で、どういう結果を期待して、どういう作業をしたら、
どううまくいかなかったのか書かないと。
 
>seito[2]の情報を[1]に
>seito[3]の情報を[2]に移動させたい
seito[1] = seito[2];
seito[2] = seito[3];

投稿日時 - 2008-06-29 17:14:06

お礼

説明不足で申し訳ありません。
環境はボーランドのbcc32 ***.cでコンパイラしています。
エディタはサクラエディタです。

期待していた結果は、他の関数で[0][1][2][3]
と入っていた配列が[0][2][3]と書き換えられ(削除され
その削除された[1]を埋めるために[2]のデータを[1]として入れるという結果でした。

失敗した結果は[1]を表示させようとしてもnameは無表示 ageは0と出てしまいました。

投稿日時 - 2008-06-29 17:44:21

ANo.2

> 構造体を受け取ってソートして
例題の場合、なにでソートしようとしていますか?
名前ですか?年齢ですか?

> ポインタで書き換える
おっしゃっている意味がよくわかりません。

> 構造体配列を、1引いてあげれば良いと思った
ソートとは関連性がない話です。

投稿日時 - 2008-06-29 16:48:43

ANo.1

まずソートのアルゴリズムを整理して、
プログラミング方法はその後です。

色々な方法がありますが、初心者に分かり易いのは、
まず、配列要素のポインタの作業配列を作り、
最小値を検索し、その要素を別の配列に先頭から
ポインタを入れていけばいいでしょう。
使ったポインタはNULLを入れます。

出来上がった配列を返す仕組みですね。
説明が自分でもヘタとは思いますが、分かるでしょう
か?

投稿日時 - 2008-06-29 16:08:44