prg-lang-2 / week12 / Exer16OOP.java
Exer16OOP.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; // 自分自身の型へのポインタ変数
} TempData16OOP;       // 温度データ


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


int main(void) {
    int temp; // 温度入力用変数
    TempData16OOP *pTop;  // 温度データリストのトップ
    TempData16OOP *pNow;  // 温度データリスト内の現在位置
    TempData16OOP *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 Exer16OOP {
    public static final int LIMIT_LOW = 0;
    public static final int LIMIT_HIGH = 25;

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

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

        // オブジェクト指向ではオブジェクトに処理の判断を任せる
        while ((LIMIT_LOW <= temp) && (temp <= LIMIT_HIGH)) {
            pNew = new TempData16OOP(temp);
            if (pTop.temp < pNew.temp) {
                pTop.insert(pNew);
            } else {
                pNew.insert(pTop);
                pTop = pNew;
            }
            // 次のデータを入力
            temp = scanner.nextInt();
        }

        scanner.close();

        // ここに逆順に表示する処理
        // ここもオブジェクトに任せる
        pTop.print();
    }
}

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

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

    // どこのnextにするかはTempData16OOPの方で判断
    public void insert(TempData16OOP data) {
        if (next == null) { // 最後のデータならば
            next = data; // 有無を言わさずnextにdataを与える
        } else if (next.temp < data.temp) { // まだnextの方が小さい場合
            next.insert(data); // 先送り
        } else { // nextの方が大きい場合
            data.next = next; // dataをここに挿入
            next = data;
        }
    }

    public void print() {
        System.out.printf("%d\n", temp);
        if (next != null) {
            next.print();
        }
    }
}