// 課題13 単方向リスト /* #include #include #include // 構造体の定義 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で初期化されるが,敢えてわかりやすさのために書く } }