P106.F90

Linked lists


!
! =====> Program - P 106.F90
!
!
!     CLASS LIST UPDATE PROGRAM
!     USES LINKED LIST WITH THE NAME AS THE KEY
!
!     DECLARATION STATEMENTS
!
      CHARACTER (LEN=25) :: NAMES(100),NAME
      INTEGER ID(100),MARKS(100,7),GRADES(7),LINK(100),TOP
      COMMON TOP,LAST
!
      PRINT *, 'This is Program >> P106 = Linked Lists'
!
!     Tell program where data for  READ *  is coming from
      OPEN(UNIT=5, FILE='P106.DAT')      ! UNIT=5 is the default input
!
      TOP=1
!
!===  READ CURRENT STATE OF FILE
!
L1:   DO J=1,100
         READ 15, ID(J),NAMES(J),(MARKS(J,K),K=1,7)
 15      FORMAT(I7,1X,A25,7I3)
         IF (ID(J) == 0) GOTO 101
         Print 15, ID(J),NAMES(J),(MARKS(J,K),K=1,7)
!        SETUP POINTER TO NEXT RECORD
         LINK(J)=J+1
      END DO L1
      PRINT 16
 16   FORMAT(/'TOO MUCH DATA FOR DEFINED ARRAYS'/  &
             'INCREASE ARRAY SIZE AND RERUN'//)
      STOP
 101  NREC=J-1
!
!==== MARK THE LAST RECORD AS END OF THE FILE
!     WITH A ZERO IN THE LINK FIELD
!
      LINK(NREC)=0
!
      PRINT 102,NREC
 102  FORMAT(/'CLASS LIST UPDATE PROGRAM'/  &
               I5,' RECORDS ON FILE')
L2:   DO J=1,100
         READ(5,15) KID,NAME,GRADES
         IF (KID == 0) THEN
            PRINT 202,J-1
 202        FORMAT(/I5,' UPDATES PROCESSED'//  &
                   'UPDATED CLASS LIST')
!
!===== PRINT OUT A LINKED LIST - IT'S EASY
!      START AT THE TOP OF THE LIST AND FOLLOW THE POINTERS
!      UNTIL YOU HIT A ZERO POINTER
!
            K=TOP
            NLINES=0
 210        PRINT 211,ID(K),NAMES(K),(MARKS(K,L),L=1,7)
 211        FORMAT(I9,2X,A25,7I5)
            NLINES=NLINES+1
!
!===           LEAVE A BLANK LINE EVERY FIVE LINES OF OUTPUT
!
               IF (MOD(NLINES,5) == 0) PRINT *
            IF(LINK(K) == 0) STOP
            K=LINK(K)
            GO TO 210
         ELSE
            CALL LOOK(NAMES,LINK,NAME,KPOS)
            IF (KPOS <= 0) THEN
!
!====  PROGRAM SECTION TO ADD A NEW MEMBER TO CLASS LIST
!      INSERT RECORD AT THE END OF THE FILE
!      WHERE THE FREE SPACE IS, BUT LINK IN CORRECT ORDER
!
            NREC=NREC+1
            IF(NREC > 100) THEN
               PRINT 220,KID,NAME
220            FORMAT(/'ARRAYS FULL - UNABLE TO ADD',I10,2X,A25)
               STOP
            ENDIF
!=====      NOW ADD NEW DATA IN EMPTY SLOT AT END OF FILE
            ID(NREC)=KID
            NAMES(NREC)=NAME
L3:         DO M=1,7
               MARKS(NREC,M)=GRADES(M)
            END DO L3
            KPOS=-KPOS
            LINK(NREC)=KPOS
            IF(LAST == 0) THEN
!
!===   HAVE AN ADDITION IN FRONT OF FIRST RECORD
!
               TOP=NREC
            ELSE
               LINK(LAST)=NREC
            END IF
!
!==== STUDENT FOUND - UPDATE ANY NONZERO GRADES
!
            ELSE
L4:            DO I=1,7
                  IF (GRADES(I) /= 0) THEN
                     MARKS(KPOS,I)=GRADES(I)
                  ENDIF
               END DO L4
            ENDIF
         ENDIF
      END DO L2
      STOP
      END
!
      SUBROUTINE LOOK(LIST,LINK,NAME,KPOS)
      CHARACTER (LEN=25) ::  LIST(1),NAME
!
!     LINKED LIST LOOKUP ROUTINE
!
      INTEGER LINK(1),TOP
      COMMON TOP,LAST
      NEXT=TOP
      LAST=0
1     IF(LIST(NEXT) == NAME) THEN
!===     YES WE FOUND THE ONE WE WANT AND KPOS IS ITS POSITION
         KPOS=NEXT
         RETURN
      ELSE
         IF(NAME < LIST(NEXT)) THEN
!===        THE ONE WE WANT IS NOT IN LIST - KPOS POINT TO NEXT ONE
!           NEGATIVE KPOS SAYS WE CAN'T FIND IT
            KPOS=-NEXT
            RETURN
         ENDIF
      ENDIF
!     REMEMBER PREVIOUS POINTER VALUE
      LAST=NEXT
      IF(LINK(NEXT) == 0) THEN
!===     WE HAVE REACHED END OF LIST AND STILL NOT FOUND THE ONE
         KPOS=0
         RETURN
      ELSE
!===     HAVE NOT FOUND IT YET
!        POINT TO NEXT ONE
         NEXT=LINK(NEXT)
         GO TO 1
      ENDIF
      RETURN
      END

DATA:
9611864 Brande, Bernardo          14  0 16 16 15  0 67
9613986 Burke, Christina          12 13 13 14 13 31 65
9412978 Colmenro, Jimi            14 15 16 16 17 42 72
9613693 Lauzier, Guy              15 15 14 16 17 35 73
9515010 Lim, Leong                17 16 18 17 17 44 82
9510633 Nguy, Gulliver            11 13 13 14 14 45 71
9513221 Talko, Stephen            12 14 14 14 14 39 69
0000000 Dummy                      0  0  0  0  0  0  0
9510633 Nguy, Gulliver             0  0  0  0 19  0  0
9415795 Smith, John               11 12  0  0  0  0  0
9611684 Brande, Bernardo           0 17  0  0  0 35  0
9999999 Zylinski, Zarro            0  0  0  0  0  0 99
1111111 Aardvark, Andrew           0  0  0  0  0 41  0
0000000 Dummy                      0  0  0  0  0  0  0

OUTPUT:
Program entered
 This is Program >> P106 = Linked Lists
9611864 Brande, Bernardo          14  0 16 16 15  0 67
9613986 Burke, Christina          12 13 13 14 13 31 65
9412978 Colmenro, Jimi            14 15 16 16 17 42 72
9613693 Lauzier, Guy              15 15 14 16 17 35 73
9515010 Lim, Leong                17 16 18 17 17 44 82
9510633 Nguy, Gulliver            11 13 13 14 14 45 71
9513221 Talko, Stephen            12 14 14 14 14 39 69

CLASS LIST UPDATE PROGRAM
    7 RECORDS ON FILE

    5 UPDATES PROCESSED

UPDATED CLASS LIST
  1111111  Aardvark, Andrew             0    0    0    0    0   41    0
  9611864  Brande, Bernardo            14   17   16   16   15   35   67
  9613986  Burke, Christina            12   13   13   14   13   31   65
  9412978  Colmenro, Jimi              14   15   16   16   17   42   72
  9613693  Lauzier, Guy                15   15   14   16   17   35   73

  9515010  Lim, Leong                  17   16   18   17   17   44   82
  9510633  Nguy, Gulliver              11   13   13   14   19   45   71
  9415795  Smith, John                 11   12    0    0    0    0    0
  9513221  Talko, Stephen              12   14   14   14   14   39   69
  9999999  Zylinski, Zarro              0    0    0    0    0    0   99

Fortran-90 STOP

Come back to the previous page

Page builder: Charles Boivin

Last modified: 11/07/95