prg-lang-2 / week12 / Exer16.java
Exer16.java
Raw
// 課題16 単方向リスト ソート
/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LIMIT_LOW 0
#define LIMIT_HIGH 25

// 構造体の定義
typedef struct tag {
    int temp;   // 温度
    struct tag *next; // 自分自身の型へのポインタ変数
} TempData16;       // 温度データ


// 新データ作成関数
TempData16* makeNewNode(int t) {
    TempData16* pNewNode;
    //** person 型のメモリ領域確保 **
    pNewNode = (TempData16*)malloc(sizeof(TempData16));
    if (pNewNode != NULL) {
        //** データ設定 **
        pNewNode->temp= t;
        pNewNode->next = NULL;
    }
    return pNewNode ;
}


int main(void) {
    int temp; // 温度入力用変数
    TempData16 *pTop;  // 温度データリストのトップ
    TempData16 *pNow;  // 温度データリスト内の現在位置
    TempData16 *pNew;  // 温度データの新規データ
    // 必要であれば,ここに変数を追加

    // 最初のデータは,必ず範囲内のデータであるとする
    scanf("%d", &temp);
    pTop = makeNewNode(temp);
    pNow = pTop;
    // 次のデータを入力
    scanf("%d", &temp);

    while ( (LIMIT_LOW <= temp) && (temp <= LIMIT_HIGH)) {
        // ここにリスト作成処理を記述
        // 新しいデータの生成
        pNew = makeNewNode(temp);

        // 先頭入れ替えかチェック
        if (pNew->temp < pTop->temp) {
            // 先頭入れ替え
        } else {
            // 挿入位置の検索
            pNow = pTop ;
            // リストを末尾まで検索
            while (pNow != NULL) {
                // 末尾に追加?
                if (pNow->next == NULL) {
                    // 末尾に追加
                    break;
                } else if ( (pNow->temp < pNew->temp) && (pNew->temp <= pNow->next->temp) ) {
                    // ここに挿入する
                    break;
                }
                pNow = pNow->next;
            }
        }

        // 次のデータを入力
        scanf("%d", &temp);
    }

    // 出力
    pNow = pTop ;
    while (pNow != NULL) {
        printf("%d\n", pNow->temp);
        pNow = pNow->next;
    }


    return 0 ;
}
*/
import java.util.Scanner;

public class Exer16 {
    public static final int LIMIT_LOW = 0;
    public static final int LIMIT_HIGH = 25;

    public static void main(String[] args) {
        int temp; // 温度入力用変数
        TempData16 pTop; // 温度データリストのトップ
        TempData16 pNow; // 温度データリスト内の現在位置
        TempData16 pNew; // 温度データの新規データ
        // 必要であれば,ここに変数を追加

        // 最初のデータは,必ず範囲内のデータであるとする
        Scanner scanner = new Scanner(System.in);
        temp = scanner.nextInt();
        pTop = new TempData16(temp);
        pNow = pTop;
        // 次のデータを入力
        temp = scanner.nextInt();

        while ((LIMIT_LOW <= temp) && (temp <= LIMIT_HIGH)) {
            // ここにリスト作成処理を記述
            // 新しいデータの生成
            pNew = new TempData16(temp);

            // 先頭入れ替えかチェック
            if (pNew.temp < pTop.temp) {
                // 先頭入れ替え
                pNew.next = pTop;
                pTop = pNew;
            } else {
                // 挿入位置の検索
                pNow = pTop;
                // リストを末尾まで検索
                while (pNow != null) {
                    // 末尾に追加?
                    if (pNow.next == null) {
                        // 末尾に追加
                        pNow.next = pNew;
                        break;
                    } else if ((pNow.temp < pNew.temp) && (pNew.temp <= pNow.next.temp)) {
                        // ここに挿入する
                        pNew.next = pNow.next;
                        pNow.next = pNew;
                        break;
                    }
                    pNow = pNow.next;
                }
            }

            // 次のデータを入力
            temp = scanner.nextInt();
        }

        scanner.close();

        // ここに逆順に表示する処理
        pNow = pTop;
        while (pNow != null) {
            System.out.printf("%d\n", pNow.temp);
            pNow = pNow.next;
        }
    }
}

class TempData16 {
    public int temp; // 温度
    public TempData16 next; // 次のデータ

    public TempData16(int t) {
        temp = t;
        next = null;
    }
}