C This file: http://ftp.aset.psu.edu/pub/ger/fortran/hdk/tree.for C C====SAMPLE DRIVER FOR BINARY TREE ROUTINES ADSRCH & TRPOST. C H. D. Knoble, S. P. Pennypacker - 1973 C See file EXHASH.FOR for PA COUNTIES CHARACTER*1 KEY(20,68),K(20) INTEGER*2 LLINK(68),RLINK(68),P,Q,STACKA(26) LOGICAL OVERFL,ADD C---READ IN SOME PENNSYLVANIA COUNTY NAMES IN RANDOM ORDER AND C ADD THEM TO THE BINARY TREE: KEY-LLINK-RLINK. OVERFL=.TRUE. IDIMA=3.14159*SQRT(68.)+0.5 WRITE(6,*) 'Press only Enter to terminate input requests.' DO 1 I=1,999999 WRITE(6,*) 'Please enter a Pennsylvania County name:' READ(5,2,END=99) K 2 FORMAT(20A1) CALL ADSRCH(KEY,LLINK,RLINK,68,20,K,P,Q,OVERFL,.TRUE.) IF(OVERFL) THEN WRITE(6,*) 'Pennsylvania has only 68 counties!!' STOP 16 ENDIF 1 CONTINUE C---Now traverse the tree in post order to print the county names C in lexicographic order. C 99 P=0 DO 3 I=1,99999 CALL TRPOST(LLINK,RLINK,68,STACKA,IDIMA,P) IF(P.EQ.0) GOTO 100 3 WRITE(6,4) (KEY(J,P),J=1,20) 4 FORMAT(20A1) 100 STOP END SUBROUTINE ADSRCH(KEY,LLINK,RLINK,ISIZE,LEN,K,P,Q,OVERFL,ADD) C---------------ADSRCH ADDS TO OR SEARCHES FOR ELEMENT K IN BINARY TREE C KEY. IF ADD IS .TRUE. K IS ADDED AT POSITION Q IF K DOES C NOT ALREADY APPEAR IN KEY; IN EITHER CASE P IS RETURNED AS C A POINTER TO KEY SUCH THAT KEY(P)=K. IF ADD IS .FALSE. C AND K IS NOT IN KEY, THEN P IS RETURNED ZERO AND Q C IS A DUMMY VARIABLE. IF Q BECOMES LARGER THAN ISIZE C THEN OVERFL IS RETURNED .TRUE., OTHERWISE ARGUMENT C VARIABLE CORRESPONDING TO OVERFL MUST BE SET .TRUE. ON C THE FIRST CALL, AND NOT CHANGED BETWEEN CALLS, TO ADSRCH. C C BEFORE FIRST CALL OVERFL MUST BE SET TO .TRUE. . C C--------------SEE KNUTH, ART OF COMPUTER PROGRAMMING, VOL 3, C ALGORIGHM 6.2.2T, PAGE 424. HDK - MAY, 1978. C WILL RUN IN FORTRAN IV OR FORTRAN 77 DEPENDING ON C ANCILLARY ROUTINES KOMP AND CHMOVE. C INTEGER LEN,ISIZE CHARACTER*1 K(LEN),KEY(LEN,ISIZE) LOGICAL OVERFL, ADD C INTEGER*2 LLINK(ISIZE),RLINK(ISIZE),P,Q, LAMBDA,L C---NOTE THAT INTEGER*2 VALUES ON IBM COMPUTERS ARE LIMITED TO THE RANGE C -2**15 <= X <= 2**15-1. INTEGER*2 IS USED HERE ONLY TO CONSERVE C STORAGE. DATA LAMBDA/0/ C P=1 IF(.NOT.OVERFL) GO TO 2 LR=0 Q=1 DO 1 I=1,ISIZE LLINK(I)=LAMBDA 1 RLINK(I)=LAMBDA OVERFL=.FALSE. GO TO 6 C---KOMP=0, IF K=KEY(P); KOMP=1 IF K>KEY(P); KOMP=-1 IF KB; KOMP=-1 IF A