自己参照型とソートについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マングース

自己参照型とソートについて

#1

投稿記事 by マングース » 15年前

[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;
    }
  }
}

MNS

Re:自己参照型とソートについて

#2

投稿記事 by MNS » 15年前

ソースコード内に、多くの打ち間違いや定義のない変数等が見られます。
そちらではビルドが出来ているようなので、間違いのない正しいコードを提示してください。 画像

box

Re:自己参照型とソートについて

#3

投稿記事 by box » 15年前

リスト構造をソートするときは、
リストに格納してからソートするよりも、
ソートしながら格納していく方が楽だと思います。

マングース

Re:自己参照型とソートについて

#4

投稿記事 by マングース » 15年前

すみません。
以下にコンパイル済みのソースを記載いたします。

以上、宜しくお願い致します。

#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;
}

non

Re:自己参照型とソートについて

#5

投稿記事 by non » 15年前

boxさんが仰るとおり、リスト構造を繋ぐときに並び替えた方が楽ですし、普通です。
でも、どうしても、後でやりたいなら不可能ではありません。
ただ、マングースさんがやろうとしている方法は理解できません。
学校の課題で、なんらかの指示があるのでしょうか?
なぜ、そう思うのかと言いますと、
sample_sortでメモリを確保してありますが、目的がわからず、
>ここからがよく分からないです
と書かれてありますので、メモリ確保部分は課題として与えられているのかと
思う次第です。
1 作成する条件が何もないなら、リスト構造を繋ぐときに並び替える
2 どうしても後で並び替えをしなければいけないのなら、いろんな方法が
あるので、並び替えの方法を指定する。
3 どんな方法でも良いのなら、その旨を記する。

マングース

Re:自己参照型とソートについて

#6

投稿記事 by マングース » 15年前

課題内容はこのような指示を受けています。

 1.order(no,name)を入力し、noで昇順にソート後、CSVファイルを作成する。
  2.CSVファイルはExcelに入力して確認するものとする。
 3.orderは構造体とし、領域は動的に確保/解放する
 4.ソートはそれのみを行う関数を作成し、その関数をCallすることで実現する.
 5.orderは最低10件は登録を行うこと

 上記の指示どおりに作成するにも勉強不足なのでよく分からないです。
 以上、宜しくお願いします。
画像

non

Re:自己参照型とソートについて

#7

投稿記事 by non » 15年前

>4.ソートはそれのみを行う関数を作成し、その関数をCallすることで実現する.
この条件からすると、後でソートしなければいけないのですね。

ソートの方法は大きく分けると2つに分類できるかな。
1 繋ぎ換えは変えずに、メンバーの値を交換する。
2 ノードの繋ぎ換えを行う。

さて、どっち?

マングース

Re:自己参照型とソートについて

#8

投稿記事 by マングース » 15年前

返信が送れて申し訳ないです。

>ソートの方法は大きく分けると2つに分類できるかな。 
>1 繋ぎ換えは変えずに、メンバーの値を交換する。 
>2 ノードの繋ぎ換えを行う。 
>
>さて、どっち?

「2 ノードの繋ぎ換えを行う。」で行いたいです。

上記のような事ができるのであればご教授お願いいたします。

以上、宜しくお願いします。

マングース

Re:自己参照型とソートについて

#9

投稿記事 by マングース » 15年前

回答がないようなので「解決」ということで閉めます。
ご教授ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る