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

// 構造体の定義
typedef struct tag {
  int weight;   // 体重
  int height;   // 身長
  struct tag *next; // 自分自身の型へのポインタ変数
} person;       // 個人データ


// 新データの作成
person* makeNewNode(int h, int w) {
  person* pNewNode;
  ///* person 型のメモリ領域確保 **
  pNewNode = (person*)malloc(sizeof(person));
  if (pNewNode != NULL) {
    ///* データ設定 **
    pNewNode->height= h;
    pNewNode->weight= w;
    pNewNode->next = NULL;
  }
  return pNewNode ;
}

int main(void) {
  // 個人データのポインタ
  person *pNow, *pData1, *pData2, *pData3, *pData4 ;

  // データを登録
  pData1 = makeNewNode(180, 80);
  pData2 = makeNewNode(140, 38);
  pData3 = makeNewNode(160, 65);
  pData4 = makeNewNode(150, 60);

  // 身長順に並べる処理をここに書く
  pData2->next = pData4;
  pData4->next = pData3;
  pData3->next = pData1;

  // ここまで


  // 小さい順に出力
  pNow = pData2;  // 一番小さいのは pData2
  // pNow が NULL になるまで出力
  while (pNow != NULL) {
    // 出力
    printf("weight: %d\n", pNow->weight);
    printf("height: %d\n", pNow->height);
    printf("\n");
    // データを次に進める
    pNow = pNow->next;
  }

  return 0;
}
*/

// Cで構造体が登場してから,いよいよ**オブジェクト指向**らしいJavaになる.
// オブジェクト指向では,データとそこへの処理をクラスという単位でまとめることが基本.
// Cでいうと,構造体とそこに関する関数をまとめるイメージ
public class Exer13 {
    public static void main(String[] args) {
        // 個人データのポインタ
        Person pNow, pData1, pData2, pData3, pData4;

        // データを登録
        pData1 = new Person(180, 80); // 下の方で定義したPersonクラスのコンストラクタをnew演算子付きで呼出している
        pData2 = new Person(140, 38);
        pData3 = new Person(160, 65);
        pData4 = new Person(150, 60);

        // 身長順に並べる処理をここに書く
        // クラスに定義したフィールドやメソッドは,ドット(.)区切りで呼出す(アクセスする)
        pData2.next = pData4;
        pData4.next = pData3;
        pData3.next = pData1;

        // ここまで

        // 小さい順に出力
        pNow = pData2; // 一番小さいのは pData2
        // pNow が NULL になるまで出力
        while (pNow != null) { // NULLでなく,Javaではnullがキーワード
            // 出力
            System.out.printf("weight: %d\n", pNow.weight);
            System.out.printf("height: %d\n", pNow.height);
            System.out.printf("\n");
            // データを次に進める
            pNow = pNow.next;
        }
    }
}

// 構造体に対応するクラスを作る
// 本来,クラスごとにファイルを分けることが望ましいが,本授業ではそこまではしない.
class Person {
    // 異なるメソッド間で共有する変数(フィールドと呼ぶ)はここに書く.
    // 定数でなければ,final staticは不要(細かくは3年生で)
    // publicを与えているが,標準的にはprivateと書いた方がよい(これも3年生で)
    public int weight; // 体重
    public int height; // 身長
    public Person next; // 次の人 Javaでは自分で作ったクラスも変数の型にできる

    // この処理はmakeNewNode関数に対応する
    // 新データ(インスタンス)の作成はnewを呼出して行なうが,
    // その新データの初期化はコンストラクタと呼ばれるところで行なう
    // コンストラクタは,戻り値の型無し,名前がクラス名と同じなメソッドのようなもの.
    // また,今後newしてインスタンスを作ってから呼出すメソッドにはstaticはつけない.
    // staticがつく ⇒ 型から呼出せる 例: String.join
    // staticがつかない ⇒ インスタンスから呼出せる 例: "goto".split
    public Person(int h, int w) { // これがコンストラクタの例
        weight = w; // インスタンス内のメソッド間で共有されるweightを引数wで初期化
        height = h; // インスタンス内のメソッド間で共有されるheightを引数hで初期化
        next = null; // 何もしなければPerson型の変数はnullで初期化されるが,敢えてわかりやすさのために書く
    }
}