7.5 演習課題

  4.演習課題7-4
 リストマージとは2つのリストに整列格納されたデータを1つのリストにまとめる操作をいう。例えばリストA、Bがあり、各々次のようなデータを持っていたとする。  この2つのリストを先頭から順に読んで、以下の様なリストCを作る。  この様な操作はA,Bが整列されている事を前提とした上で、各リストの長さの和に比例する時間でマージが終了する。アルゴリズムとして書けば以下の様になる。
  1. リストCを空とする
  2. リストAの先頭をtopA、リストBの先頭をtopBとする(以降の動作では現在の位置となる)
  3. topAもしくはtopBが空でない間、以下を繰り返す

    topA->data<topB->dataならばtopA->dataをリストCにつなぎ、topA=topA->nextとする。topA->data>=topB->dataならばtopB->dataをリストCにつなぎ、topB=topB->nextとする。
注1:リスト構造は一方向とし、各要素はdata領域とnext領域を持つものとする。
注2:上記のアルゴリズムのままではtopAもしくはtopBが空になっても存在しないdata領域を使おうとするので、修正の要がある。
注3:リストマージの結果としては生成されたリストCを返す事。その場合あらかじめCの先頭を何かに記憶させておく必要がある。

課題:リストマージの関数を実現し、それを利用してリストマージを行え。リストのデータとしては整数を想定せよ。データは上記のデータを想定せよ。各リストに対して標準入力から入力するものとする。

プログラムの大枠は以下のようである。

リストデータ型の宣言

main(){

  リストA,B,Cの宣言

  list_generation(list_a);

  list_generation(list_b);

  list_merge(list_a, list_b, list_c);

  リストCのプリントアウト

}

void list_generation(データ型 *list)

{}

void list_merge(データ型 *list1, *list2, *list3)

{}