ポインターを使用してチェーン・リストを処理する

ポインター・データ項目を使用するアプリケーションの典型的なものとして、 チェーン・リスト (次のレコードを指す一連のレコード) の処理があります。

次の例は、個人の給与 (SALARY) レコードで構成されるデータのチェーン・リストです。 図 84 は、これらのレコードがストレージでリンクされて表示される 1 つの方法を示すものです。

図 84. NULL で終わるチェーン・リストの表示
テキストの図、下記

各レコード (最後のレコードを除く) の最初の項目は、次のレコードを指すポインターです。 最後のレコードの最初の項目にはアドレスではなくヌル値が入っています。 これはこのレコードが最後のレコードであることを示します。

これらのレコードを処理するアプリケーションの上位レベルのロジックは、次のようになります。

    OBTAIN ADDRESS OF FIRST RECORD IN CHAINED LIST FROM ROUTINE
    CHECK FOR END OF THE CHAINED LIST
    DO UNTIL END OF THE CHAINED LIST
       PROCESS RECORD
       GO ON TO THE NEXT RECORD
    END

図 85 に、チェーン・リスト処理のこの例で使用される処理プログラム CHAINLST の概略を示します。

図 85. チェーン・リストを処理する ILE COBOL プログラム
 5722WDS V5R4M0  060210 LN  IBM ILE COBOL                 CBLGUIDE/CHAINLST        ISERIES1   06/02/15 13:45:02        ページ    2
                                     ソ ー ス
  STMT PL SEQNO  -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN  S コピー名   変更日付
     1     000100 IDENTIFICATION DIVISION.
     2     000200 PROGRAM-ID. CHAINLST.
     3     000300 ENVIRONMENT DIVISION.
     4     000400 DATA DIVISION.
           000500*
     5     000600 WORKING-STORAGE SECTION.
     6     000700 77  PTR-FIRST         POINTER  VALUE IS NULL.
     7     000800 77  DEPT-TOTAL        PIC 9(4) VALUE IS 0.
           000900*
     8     001000 LINKAGE SECTION.
     9     001100 01  SALARY-REC.
    10     001200   05  PTR-NEXT-REC    POINTER.
    11     001300   05  NAME            PIC X(20).
    12     001400   05  DEPT            PIC 9(4).
    13     001500   05  SALARY          PIC 9(6).
    14     001600 01  DEPT-X            PIC 9(4).
           001700*
    15     001800 PROCEDURE DIVISION USING DEPT-X.
           001900 CHAINLST-PROGRAM SECTION.
           002000 MAINLINE.
           002100*
           002200* FOR EVERYONE IN THE DEPARTMENT RECEIVED AS DEPT-X,
           002300* GO THROUGH ALL OF THE RECORDS IN THE CHAINED LIST BASED ON THE
           002400* ADDRESS OBTAINED FROM THE PROGRAM CHAINANC
           002500* AND ACCUMULATE THE SALARIES.
           002600* IN EACH RECORD, PTR-NEXT-REC IS A POINTER TO THE NEXT RECORD
           002700* IN THE LIST; IN THE LAST RECORD, PTR-NEXT-REC IS NULL.
           002800* DISPLAY THE TOTAL.
           002900*
    16     003000     CALL "CHAINANC" USING PTR-FIRST
    17     003100     SET ADDRESS OF SALARY-REC TO PTR-FIRST
           003200*
    18     003300     PERFORM WITH TEST BEFORE UNTIL ADDRESS OF SALARY-REC = NULL
    19     003400        IF DEPT = DEPT-X THEN
    20     003500           ADD SALARY TO DEPT-TOTAL
           003600        END-IF
    21     003700        SET ADDRESS OF SALARY-REC TO PTR-NEXT-REC
           003800     END-PERFORM
           003900*
    22     004000     DISPLAY DEPT-TOTAL
    23     004100     GOBACK.
           004200
                           * * * * *   ソ ー ス 仕 様 の 終 わ り   * * * * *