}### 前提・実現したいこと
できるだけバブルソートの部分を入れ替えるのを繰り返すという方法で、年齢を小さい順に表示させたいです。
以下の画像に書いた考え方でバブルソートの部分をコーディングしたいです。
http://s.kota2.net/1567057495.png
http://s.kota2.net/1567057524.png
ここに質問の内容を詳しく書いてください。
プログラム初心者です。こちらのサイトで質問をするのも慣れておりませんので失礼があったら申し訳ありません。
C言語で名簿を表示させるプログラムを作成しました。
名簿の中身は以下のようになっております。
100 あ 30 男性
101 あ 20 女性
102 い 40 男性
103 う 30 男性
104 え 30 女性
105 お 20 男性
106 か 40 女性
107 き 50 男性
108 く 30 女性
109 け 40 男性
110 こ 20 女性
111 さ 50 男性
112 し 30 女性
113 す 40 男性
114 せ 20 男性
115 そ 30 女性
116 た 40 男性
117 ち 20 女性
118 つ 30 男性
119 て 50 男性
120 と 40 女性
121 な 50 男性
122 に 30 女性
123 ぬ 20 男性
名簿の年齢が小さい順に並べ替えたいのですが、当方の力不足で上手くできません。
特に、下の方のポインタ演算子の入れ替えの部分が上手いコードが思いつきません。
発生している問題・エラーメッセージ
バブルソートの部分が上手く入れ替えできず、for文が回らない。
コンパイルすると「ファイルのオープンに成功しました」という文章しか表示されない。
エラーメッセージ
該当のソースコード
C
1#include "stdafx.h" 2#include <stdio.h> 3#include <stdlib.h> 4 5struct ST_MEMBER 6{ 7 int number; //社員番号 8 char name[50]; //名前 9 int age; //年齢 10 char gender[10]; //性別 11 struct ST_MEMBER *prev; 12 struct ST_MEMBER *next; 13}; 14 15int main(void) 16{ 17 18 FILE *fp; 19 int i, j, max, ret; 20 struct ST_MEMBER *str, *str2 = 0, *str3 = 0, *temp; 21 22 if(fopen_s(&fp, "Meibo.txt", "r") != 0) //読み取りモードでファイルを開く 23 { 24 printf("ファイルのオープンに失敗しました\n"); 25 return -1; 26 } 27 28 printf("ファイルのオープンに成功しました\n"); 29 30 31 while(1) 32 { 33 //確保されたメモリの場所をあらわすポインタが得られる。 34 str = (struct ST_MEMBER *) malloc (sizeof(struct ST_MEMBER)); 35 if(!str) 36 { 37 printf("メモリが確保できませんでした。\n"); 38 return 1; 39 } 40 41 //構造体を数珠つなぎにする 42 if(str2 == 0) 43 { 44 str2 = str; 45 str2->prev = 0; 46 str2->next = 0; 47 } 48 else //0ではない場合 49 { 50 str2->next = str; 51 str->prev = str2; 52 str2 = str; 53 str2->next = 0; 54 } 55 56 ret = fscanf(fp, "%4d%16s%5d%5s\n", &str->number, str->name, &str->age, str->gender); 57 58 59 if(ret == -1) //EOF 60 break; 61 } 62 63 //先頭に戻る 64 for(i = 0; str2->prev != 0; i++) 65 str2 = str2->prev; 66 67 for(i = 0; (str2->next->age) != 0; i++) 68 { 69 70 if((str2->age) > (str2->next->age)) //年齢を小さい順に表示したいので年齢を比較する。 71 { 72 //全部の構造体を入れ替える(1行ずつ入れ替える) 73 74 str2->next = str2->next->next; 75 str2->prev = str2->next; 76 77 str->next->next = str2->next->prev; 78 str->next->prev = str2->prev; 79 80 } 81 } 82 83 84 85 for(i = 0; str2->next != 0; i++) 86 { 87 printf("%4d%16s%5d%5s\n", str2->number, str2->name, str2->age, str2->gender); 88 str2 = str2->next; 89 } 90 91 free(str); 92 93 fclose(fp); 94 95 return 0; 96} 97 98
試したこと
ここに問題に対して試したことを記載してください。
双方向リストの入れ替えについて以下の画像のように考えました。
http://s.kota2.net/1567057495.png
http://s.kota2.net/1567057524.png
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。