質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

受付中

C言語で名簿を作って年齢順に表示させたいのですがうまくいきません。

rinringo_88
rinringo_88

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

4回答

0リアクション

0クリップ

2605閲覧

投稿2019/08/27 01:18

編集2019/08/29 06:06

}### 前提・実現したいこと
できるだけバブルソートの部分を入れ替えるのを繰り返すという方法で、年齢を小さい順に表示させたいです。
以下の画像に書いた考え方でバブルソートの部分をコーディングしたいです。
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

#include "stdafx.h" #include <stdio.h> #include <stdlib.h> struct ST_MEMBER { int number; //社員番号 char name[50]; //名前 int age; //年齢 char gender[10]; //性別 struct ST_MEMBER *prev; struct ST_MEMBER *next; }; int main(void) { FILE *fp; int i, j, max, ret; struct ST_MEMBER *str, *str2 = 0, *str3 = 0, *temp; if(fopen_s(&fp, "Meibo.txt", "r") != 0) //読み取りモードでファイルを開く { printf("ファイルのオープンに失敗しました\n"); return -1; } printf("ファイルのオープンに成功しました\n"); while(1) { //確保されたメモリの場所をあらわすポインタが得られる。 str = (struct ST_MEMBER *) malloc (sizeof(struct ST_MEMBER)); if(!str) { printf("メモリが確保できませんでした。\n"); return 1; } //構造体を数珠つなぎにする if(str2 == 0) { str2 = str; str2->prev = 0; str2->next = 0; } else //0ではない場合 { str2->next = str; str->prev = str2; str2 = str; str2->next = 0; } ret = fscanf(fp, "%4d%16s%5d%5s\n", &str->number, str->name, &str->age, str->gender); if(ret == -1) //EOF break; } //先頭に戻る for(i = 0; str2->prev != 0; i++) str2 = str2->prev; for(i = 0; (str2->next->age) != 0; i++) { if((str2->age) > (str2->next->age)) //年齢を小さい順に表示したいので年齢を比較する。 { //全部の構造体を入れ替える(1行ずつ入れ替える) str2->next = str2->next->next; str2->prev = str2->next; str->next->next = str2->next->prev; str->next->prev = str2->prev; } } for(i = 0; str2->next != 0; i++) { printf("%4d%16s%5d%5s\n", str2->number, str2->name, str2->age, str2->gender); str2 = str2->next; } free(str); fclose(fp); return 0; }

試したこと

ここに問題に対して試したことを記載してください。
双方向リストの入れ替えについて以下の画像のように考えました。
http://s.kota2.net/1567057495.png
http://s.kota2.net/1567057524.png

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2019/08/27 01:36依頼された後にこの質問は修正されています

こちらの質問が他のユーザーから「過去の低評価」という指摘を受けました。

takabosoft

2019/08/27 01:24

ソースコードは ```c ここにコード ``` というように記述してください。質問欄は再編集できます。
rinringo_88

2019/08/27 01:50

ご指摘ありがとうございます。修正しました。
jimbe

2019/08/27 02:31

まず机上で双方向リストの絵を書いて, 入れ替える処理を1ステップずつ書き出して確認することをお勧めします. また, 双方向リストのソートのコードはネットに多数あると思います. 参考にされては如何でしょうか.
rinringo_88

2019/08/29 02:05

双方向リストですね。教えてくださってありがとうございます。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。