namereq

温度のソート

Jun 18th, 2018
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LIMIT_LOW 0
  6. #define LIMIT_HIGH 25
  7.  
  8. /* 構造体の定義 */
  9. typedef struct tag {
  10.     int temp; /* 温度 */
  11.     struct tag *prev; /* 1つ前のデータへのポインタ変数 */
  12.     struct tag *next; /* 1つ後のデータへのポインタ変数 */
  13. } tempData; /* 温度データ */
  14.  
  15.  
  16. /* 新データ作成関数 */
  17. tempData* makeNewNode(int t) {
  18.     tempData* pNewNode;
  19.     /*** tempData 型のメモリ領域確保 ***/
  20.     pNewNode = (tempData*)malloc(sizeof(tempData));
  21.     if (pNewNode != NULL) {
  22.         /*** データ設定 ***/
  23.         pNewNode->temp= t;
  24.         pNewNode->prev = NULL;
  25.         pNewNode->next = NULL;
  26.     }
  27.     return pNewNode;
  28. }
  29.  
  30.  
  31. int main(void) {
  32.     int temp; /* 温度入力用変数 */
  33.     tempData *pTop; /* 温度データリストのトップ */
  34.     tempData *pLast; /* 温度データリストの末尾 */
  35.     tempData *pNow; /* 温度データリスト内の現在位置 */
  36.     tempData *pNew; /* 温度データの新規データ */
  37.     /* 必要であれば,ここに変数を追加 */
  38.    
  39.     /* 最初のデータは,必ず範囲内のデータであるとする */
  40.     scanf("%d", &temp);
  41.     pTop = makeNewNode(temp);
  42.     pLast = pTop;
  43.    
  44.     /* 次のデータを入力 */
  45.     scanf("%d", &temp);
  46.     while ( (LIMIT_LOW <= temp) && (temp <= LIMIT_HIGH)) {
  47.         /* データ作成 */
  48.         pNew = makeNewNode(temp);
  49.        
  50.         /* 先頭データより小さいか? */
  51.         if (pNew->temp < pTop->temp) {
  52.             /* 先頭の入れ替え */
  53.             pNew->next = pTop;
  54.             pTop->prev = pNew;
  55.             pTop = pNew;
  56.         } else {
  57.             /* 挿入する場所を探す */
  58.             pNow = pTop;
  59.             /* 末尾に達するまで探す */
  60.             while (pNow != pLast) {
  61.                 /* 1つ先のデータが pNew より大きかったら,そこが挿入ポイント */
  62.                 if (pNew->temp < pNow->next->temp) {
  63.                     /* 挿入処理 */
  64.                     pNow->next->prev = pNew;
  65.                     pNew->next = pNow->next;
  66.                     pNew->prev = pNow;
  67.                     pNow->next = pNew;
  68.                     /* 探索終了 */
  69.                     break;
  70.                 }
  71.                 pNow = pNow->next;
  72.             }
  73.             /* 探索が末尾に達して終了したら,末尾に追加 */
  74.             if (pNow == pLast) {
  75.                 /* 末尾に追加 */
  76.                 pLast->next = pNew;
  77.                 pNew->prev = pLast;
  78.                 pLast = pNew;
  79.             }
  80.         }
  81.        
  82.         /* ちゃんとソートされてるか確かめるためのコード
  83.         tempData *pHyoji = pTop;
  84.         while (pHyoji != NULL) {
  85.             printf("* %d\n", pHyoji->temp);
  86.             pHyoji = pHyoji->next;
  87.         }
  88.         */
  89.        
  90.         /* 次のデータを入力 */
  91.         scanf("%d", &temp);
  92.     }
  93.    
  94.     /* 出力処理 */
  95.     pNow = pLast;
  96.     while (pNow != NULL) {
  97.         printf("%d\n", pNow->temp);
  98.         pNow = pNow->prev;
  99.     }
  100.    
  101.     return 0 ;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment