導入:なぜ今、COBOLで「リンクリスト」なのか
業務システムでは固定長の配列(OCCURS句)を使うのが一般的ですが、扱うデータ数が実行時まで分からない場合、配列ではメモリの無駄や上限の壁にぶつかります。そこで役立つのが、ポインタを使った「リンクリスト」構造です。この手法を習得すれば、メモリを必要な分だけ確保する「動的なデータ管理」が可能になり、プログラムの柔軟性が飛躍的に向上します。
基礎知識:USAGE POINTERとは
COBOLにおける USAGE POINTER は、メモリ上の「アドレス(場所)」を格納するためのデータ型です。通常の数値項目とは異なり、この項目には特定のレコードがメモリ上のどこにあるかという情報が記録されます。
ALLOCATE 命令はヒープ領域からメモリを動的に確保し、その開始アドレスをポインタに格納します。これらを組み合わせることで、データの塊を鎖のように繋いでいくのがリンクリストの仕組みです。
実装:リンクリストの構築手順
リンクリストを実現するには、各データレコードに「自分自身のデータ」と「次の要素のアドレス」を持たせる必要があります。
1. 構造定義:レコードの末尾に USAGE POINTER 項目を定義。
2. 領域確保:ALLOCATE 命令で新しいレコード領域を確保。
3. 連結:確保したアドレスを、前のレコードのポインタ項目に保存。
4. 順次処理:ポインタを追いかけていくことで、リスト内の全データを走査。
サンプルプログラム:動的リストの作成例
以下のコードは、3つの要素を持つリンクリストを作成する基本的なロジックです。
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. LINKED-LIST-SAMPLE.
000300 WORKING-STORAGE SECTION.
000400 リストの各要素の定義
000500 01 ITEM-RECORD.
000600 05 DATA-VAL PIC X(10).
000700 05 NEXT-PTR USAGE POINTER.
000800
000900 01 HEAD-PTR USAGE POINTER.
001000 01 CURRENT-PTR USAGE POINTER.
001100 01 TEMP-PTR USAGE POINTER.
001200
001300 PROCEDURE DIVISION.
001400 1. 最初の要素を確保
001500 ALLOCATE ITEM-RECORD RETURNING HEAD-PTR.
001600 SET ADDRESS OF ITEM-RECORD TO HEAD-PTR.
001700 MOVE “DATA-01” TO DATA-VAL.
001800
001900 2. 次の要素を繋ぐ
002000 ALLOCATE ITEM-RECORD RETURNING NEXT-PTR.
002100 SET CURRENT-PTR TO NEXT-PTR.
002200 SET ADDRESS OF ITEM-RECORD TO CURRENT-PTR.
002300 MOVE “DATA-02” TO DATA-VAL.
002400 SET NEXT-PTR TO NULL.
002500
002600 3. リストを走査して表示
002700 SET ADDRESS OF ITEM-RECORD TO HEAD-PTR.
002800 PERFORM UNTIL ITEM-RECORD = NULL
002900 DISPLAY “VALUE: ” DATA-VAL
003000 SET ADDRESS OF ITEM-RECORD TO NEXT-PTR
003100 END-PERFORM.
003200
003300 GOBACK.
応用・注意点:メモリリークに要注意
この手法の最大の注意点は「メモリの解放」です。COBOLの FREE 命令を忘れると、プログラム終了までメモリが確保されたままとなり、メモリリークの原因となります。また、SET ADDRESS OF を使用する際は、必ずポインタが有効なアドレスを指しているか確認してください。無効なアドレスにアクセスすると、システムが異常終了(ABEND)するリスクがあります。
現場では、リストの先頭(HEAD)と末尾(TAIL)のアドレスを別々に保持しておくと、データの追加処理が非常に楽になります。ぜひ挑戦してみてください。

コメント