第 9 回 - 構造体(3)

[6/11, 2006 H.Aman]
67x27(1669bytes)

課題 3

平面上のある位置 P (a, b) に人が立っていました.
その後,その人が点 P から 30 回の移動を行った結果, ちょうど原点 (0, 0) にたどり着きました.
移動の方向・向き・距離はベクトル (x, y) で与えられるとして, その人の移動履歴(各時点での位置)を表示しなさい.

出席票の裏面に課題の実行結果に関する解答欄があります!

実行例

     $ ./a.out [Enter]
     3 4 [Enter]        <--- 1 回目の移動
     1 -2 [Enter]       <--- 2 回目の移動
     ...
     1 1 [Enter]        <--- 29 回目の移動
     2 -3 [Enter]       <--- 30 回目の移動
     30: (0,0)
     29: (-2, 3)
     28: (-3, 2)
     . . .
     2: (9, 10)
     1: (8, 12)
     0: (5, 8)       <--- 最初の位置 P

実行データ

実行には次のデータを使用しなさい: 使い方は単純で,
     $ ./a.out < data3A.txt [Enter]
という具合いに(リダイレクション機能を使って)読み込ませればよい.

発展問題(加点の対象とする)

これまでの例題では,構造体の変数をあらかじめ必要な個数だけ用意し, それらを連結してリストを作っていた.
詳細は後期の「情報工学実験 I」と「データ構造とアルゴリズム」 で取り上げるが,本来はそのような方法ではなく, malloc という標準関数を利用して必要な時に必要な変数をメモリ上に確保するという手を使う.
構造体の配列を使わずにポインタ変数だけを使って例題 1 のプログラムを作成せよ.

これについては,直接メールで阿萬 <aman@cs.ehime-u.ac.jp> まで提出してください.

発展問題その2(加点の対象とする)

上の発展問題のプログラムを改良し, 任意個のデータについてリスト構造を構築できるようにしなさい. ただし,malloc を使ったメモリ確保とデータの格納も関数として実現すること. その関数の宣言は次の通りとする:

     struct node* makeNode(int x){
     ...
     }
この関数を呼び出すと,ノードが 1 個生成され,その data 部には x で与えられた整数が格納される. 戻り値は生成されたノードへのポインタである.