ページ 1 / 1
自己参照型とソートについて
Posted: 2010年1月03日(日) 12:28
by マングース
[1] 質問文
[1.1] 確保した領域にno,nameをリスト構造を使用し登録する。
領域に登録したデータは、昇順に置き換えられファイルとして出力する。
[1.2] 一通り自分なりに調べソースコードを領域確保→入力まで作成しました。
[1.4] 確保した領域にデータを入れてソートをかけようとしたが、
ソートをせず、同じ出力結果が出てしまう。
[2] 環境
[2.1] OS : WindowsXP ProfessionalSP3
[2.2] コンパイラ名 : VC++ 2008EE
[3] その他
・C言語は、初心者です。標準出力、構造体、配列系までは普通にできます。
・#include <stdlib.h> #include <stdio.h>
[4] 求める出力結果
入力内容
no = 3 name = kitarou
no = 2 name = mangusu
no = 1 name = ikarosu
結果(ソートの置き換え結果)
no = 1 name = ikarosu
no = 2 name = mangusu
no = 3 name = kitarou
*ソースコード
#include <stdio.h>
#include <stdlib.h>
struct order{
int no;
char name[10];
struct order *new;
};
int main(){
struct order *main,*on=NULL;
while(i < 3){
/* 領域確保 */
if((main = (struct order *)malloc(sizeof(struct order)) == NULL){
exit(EXIT FAILURE);
}
/* 入力処理 */
printf("no:");
scanf("%d",main->no);
printf("name:");
scanf("%s",main->name);
main->new= on;
on = main;
i++;
}
/* 昇順にソートを行う */
sample sort(on);
}
int sample_sort(struct order_print *on2){
struct order_print *on3;
int menber_no;
char menber_name[10];
/* メモリー確保 */
if((y = (struct order*)malloc(sizeof(struct order))) == NULL) {
exit(EXIT_FAILURE);
}
on3 = on2->new;
while(on2!=NULL)
{
/* ここからがよく分からないです ↓は自分なりに考えてみました。 */
/* no を基準にソートを行う */
if (on2->no > on3->no)
{
menber_no = on->no3;
printf("%d\n",menber_no);
on2->no = on3->no;
on3->no = menber_no;
}
}
}
Re:自己参照型とソートについて
Posted: 2010年1月03日(日) 12:46
by MNS
ソースコード内に、多くの打ち間違いや定義のない変数等が見られます。
そちらではビルドが出来ているようなので、間違いのない正しいコードを提示してください。

Re:自己参照型とソートについて
Posted: 2010年1月03日(日) 13:15
by box
リスト構造をソートするときは、
リストに格納してからソートするよりも、
ソートしながら格納していく方が楽だと思います。
Re:自己参照型とソートについて
Posted: 2010年1月03日(日) 13:26
by マングース
すみません。
以下にコンパイル済みのソースを記載いたします。
以上、宜しくお願い致します。
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable : 4996)
int sample_sort();
struct order{
int no;
char name[10];
struct order *new;
};
int main(){
struct order *main,*on=NULL;
int i = 0;
while(i < 3){
/* 領域確保 */
if((main = (struct order*)malloc(sizeof(struct order))) == NULL){
exit(EXIT_FAILURE);
}
/* 入力処理 */
printf("no:");
scanf("%d",main->no);
printf("name:");
scanf("%s",main->name);
main->new= on;
on = main;
i++;
}
/* 昇順にソートを行う */
sample_sort(on);
}
int sample_sort(struct order *on2){
struct order *on3;
int menber_no;
char menber_name[10];
/* メモリー確保 */
if((on3 = (struct order*)malloc(sizeof(struct order))) == NULL) {
exit(EXIT_FAILURE);
}
on3 = on2->new;
while(on2!=NULL)
{
/* ここからがよく分からないです ↓は自分なりに考えてみました。 */
/* no を基準にソートを行う */
if (on2->no > on3->no)
{
menber_no = on3->no;
printf("%d\n",menber_no);
on2->no = on3->no;
on3->no = menber_no;
}
}
return 0;
}
Re:自己参照型とソートについて
Posted: 2010年1月03日(日) 13:59
by non
boxさんが仰るとおり、リスト構造を繋ぐときに並び替えた方が楽ですし、普通です。
でも、どうしても、後でやりたいなら不可能ではありません。
ただ、マングースさんがやろうとしている方法は理解できません。
学校の課題で、なんらかの指示があるのでしょうか?
なぜ、そう思うのかと言いますと、
sample_sortでメモリを確保してありますが、目的がわからず、
>ここからがよく分からないです
と書かれてありますので、メモリ確保部分は課題として与えられているのかと
思う次第です。
1 作成する条件が何もないなら、リスト構造を繋ぐときに並び替える
2 どうしても後で並び替えをしなければいけないのなら、いろんな方法が
あるので、並び替えの方法を指定する。
3 どんな方法でも良いのなら、その旨を記する。
Re:自己参照型とソートについて
Posted: 2010年1月03日(日) 16:21
by マングース
課題内容はこのような指示を受けています。
1.order(no,name)を入力し、noで昇順にソート後、CSVファイルを作成する。
2.CSVファイルはExcelに入力して確認するものとする。
3.orderは構造体とし、領域は動的に確保/解放する
4.ソートはそれのみを行う関数を作成し、その関数をCallすることで実現する.
5.orderは最低10件は登録を行うこと
上記の指示どおりに作成するにも勉強不足なのでよく分からないです。
以上、宜しくお願いします。

Re:自己参照型とソートについて
Posted: 2010年1月03日(日) 19:36
by non
>4.ソートはそれのみを行う関数を作成し、その関数をCallすることで実現する.
この条件からすると、後でソートしなければいけないのですね。
ソートの方法は大きく分けると2つに分類できるかな。
1 繋ぎ換えは変えずに、メンバーの値を交換する。
2 ノードの繋ぎ換えを行う。
さて、どっち?
Re:自己参照型とソートについて
Posted: 2010年1月12日(火) 23:40
by マングース
返信が送れて申し訳ないです。
>ソートの方法は大きく分けると2つに分類できるかな。
>1 繋ぎ換えは変えずに、メンバーの値を交換する。
>2 ノードの繋ぎ換えを行う。
>
>さて、どっち?
「2 ノードの繋ぎ換えを行う。」で行いたいです。
上記のような事ができるのであればご教授お願いいたします。
以上、宜しくお願いします。
Re:自己参照型とソートについて
Posted: 2010年1月26日(火) 12:06
by マングース
回答がないようなので「解決」ということで閉めます。
ご教授ありがとうございました。