リストマージとは2つのリストに整列格納されたデータを1つのリストにまとめる操作をいう。例えばリストA、Bがあり、各々次のようなデータを持っていたとする。この2つのリストを先頭から順に読んで、以下の様なリストCを作る。
- リストA:2,5,9,10
- リストB:1,4,7,11
この様な操作はA,Bが整列されている事を前提とした上で、各リストの長さの和に比例する時間でマージが終了する。アルゴリズムとして書けば以下の様になる。
- リストC:1,2,4,5,7,9,10
注1:リスト構造は一方向とし、各要素はdata領域とnext領域を持つものとする。
- リストCを空とする
- リストAの先頭をtopA、リストBの先頭をtopBとする(以降の動作では現在の位置となる)
- topAもしくはtopBが空でない間、以下を繰り返す
topA->data<topB->dataならばtopA->dataをリストCにつなぎ、topA=topA->nextとする。topA->data>=topB->dataならばtopB->dataをリストCにつなぎ、topB=topB->nextとする。
注2:上記のアルゴリズムのままではtopAもしくはtopBが空になっても存在しないdata領域を使おうとするので、修正の要がある。
注3:リストマージの結果としては生成されたリストCを返す事。
課題:リストマージの関数を実現し、それを利用してリストマージを行え。リストのデータとしては整数を想定せよ。データは上記のデータを想定せよ。各リストに対して標準入力から入力するものとする。
プログラムの大枠は以下のようである。
リストデータ型の宣言 main(){ リストA,B,Cの宣言 リストAの生成 リストBの生成 リストA,BをマージしてリストCを作る リストCのプリントアウト } リストを生成する関数 {} リストをマージする関数 {}