!
! =====> 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
Page builder: Charles Boivin
Last modified: 11/07/95