// 課題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で初期化されるが,敢えてわかりやすさのために書く
}
}