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

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

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

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

Q&A

解決済

2回答

6503閲覧

双方向リストを用いた降順ソート

DaikiNishimoto

総合スコア11

C

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

0グッド

0クリップ

投稿2019/07/02 08:06

前提・実現したいこと

双方向リストを用いて降順にソートするプログラムを作成したのですが、出力がうまくいきません

発生している問題・エラーメッセージ

例えば2,3,1,26と入力した場合に3,2は出力されるが1が出力されない

該当のソースコード

ソースコード #include <stdio.h> #include <stdlib.h> #include <string.h> #define LIMIT_LOW 0 #define LIMIT_HIGH 25 /* 構造体の定義 */ typedef struct tag { int temp; /* 温度 */ struct tag *prev; /* 1つ前のデータへのポインタ変数 */ struct tag *next; /* 1つ後のデータへのポインタ変数 */ } tempData; /* 温度データ */ /* 新データ作成関数 */ tempData* makeNewNode(int t) { tempData* pNewNode; /*** tempData 型のメモリ領域確保 ***/ pNewNode = (tempData*)malloc(sizeof(tempData)); if (pNewNode != NULL) { /*** データ設定 ***/ pNewNode->temp= t; pNewNode->prev = NULL; pNewNode->next = NULL; } return pNewNode ; } int main(void) { int temp; /* 温度入力用変数 */ tempData *pTop; /* 温度データリストのトップ */ tempData *pLast; /* 温度データリストの末尾 */ tempData *pNow; /* 温度データリスト内の現在位置 */ tempData *pNew; /* 温度データの新規データ */ /* 必要であれば,ここに変数を追加 */ /* 最初のデータは,必ず範囲内のデータであるとする */ scanf("%d", &temp); pTop = makeNewNode(temp); pLast = pTop; /* 次のデータを入力 */ scanf("%d", &temp); while ( (LIMIT_LOW <= temp) && (temp <= LIMIT_HIGH)) { /* データ作成 */ pNew = makeNewNode(temp); /* 先頭データより小さいか? */ if (pNew->temp < pTop->temp) { /* 先頭の入れ替え */ } else { /* 挿入する場所を探す */ pNow = pTop; /* 末尾に達するまで探す */ while (pNow != pLast) { /* 1つ先のデータが pNew より大きかったら,そこが挿入ポイント */ if (pNew->temp < pNow->next->temp) { /* 挿入処理 */ pNew->next = pNow->next; pNew->prev = pNow; pNow->next = pNew; pNow->next->prev = pNew; /* 探索終了 */ break; } pNow = pNow->next; } /* 探索が末尾に達して終了したら,末尾に追加 */ if (pNow == pLast) { pNow->next = pNew ; pNew->prev = pNow ; pLast = pNew; /* 末尾に追加 */ } } /* 次のデータを入力 */ scanf("%d", &temp); } /* 出力処理 */ pNow = pLast; while (pNow != NULL) { printf("%d\n", pNow->temp); pNow = pNow->prev; } return 0 ; }

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

cloud9

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/07/02 08:36

先頭の入れ替えが実装されていません。完成させてください。
Zuishin

2019/07/02 08:37

あと、一度にすべて組もうとするのではなく、もっと構造化を進めて小さな部品を作ってください。
guest

回答2

0

ベストアンサー

/* 先頭の入れ替え */

の部分の書き漏れと、挿入時のポインタ付け替え順序の間違いですね。

C

1--- orig.c 2019-07-02 17:40:20.658592088 +0900 2+++ aa.c 2019-07-02 17:43:08.848589091 +0900 3@@ -49,7 +49,9 @@ 4 /* 先頭データより小さいか? */ 5 if (pNew->temp < pTop->temp) { 6 /* 先頭の入れ替え */ 7- 8+ pNew->next = pTop; 9+ pTop->prev = pNew; 10+ pTop = pNew; 11 } else { 12 /* 挿入する場所を探す */ 13 pNow = pTop; 14@@ -61,8 +63,8 @@ 15 16 pNew->next = pNow->next; 17 pNew->prev = pNow; 18- pNow->next = pNew; 19 pNow->next->prev = pNew; 20+ pNow->next = pNew; 21 22 /* 探索終了 */ 23 break;

投稿2019/07/02 08:47

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

本気にC言語のコードを組むのなら、VisualStudioとかEclipseとかのデバッグ環境を整えましょう。
任意のソース行で実行を止めて、変数の内容を確認できます。また、1行づつステップ実行したりできます。
そうすれば、当てずっぽでコードを書かなくて済むようになります

投稿2019/07/02 12:52

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問