11 2 PROGRAM POINTER 3 INTEGER POINTER P

  • Slides: 56
Download presentation

 • • • • • 下面再看一个例子 例11. 2 PROGRAM POINTER 3 INTEGER, POINTER:

• • • • • 下面再看一个例子 例11. 2 PROGRAM POINTER 3 INTEGER, POINTER: : P 1, P 2, P 3, P 4 INTEGER, TARGET: : X 1, X 2 INTEGER X, S 1, S 2, S 3, S 4, S 5 READ*, X 1, X 2 X=X 1*X 2 P 1=>X 1 P 2=>X 2 P 3=>X 1 P 4=>P 1 S 1=P 1*P 2 S 2=P 3*P 2 S 3=P 1*X 2 S 4=P 3*X 2 S 5=P 4*X 2 PRINT*, "X=", X

例11. 3 PROGRAM POINTER 3 INTEGER, POINTER: : P ALLOCATE(P) P=4 PRINT*, "P=", P

例11. 3 PROGRAM POINTER 3 INTEGER, POINTER: : P ALLOCATE(P) P=4 PRINT*, "P=", P END 输出结果为:P=4

例11. 4,ALLOCATE和DEALLOCATE函数的用法,程序如下: PROGRAM POINTER 4 INTEGER, POINTER: : P 1, P 2 INTEGER S

例11. 4,ALLOCATE和DEALLOCATE函数的用法,程序如下: PROGRAM POINTER 4 INTEGER, POINTER: : P 1, P 2 INTEGER S ALLOCATE(P 1, P 2) READ*, P 1, P 2 S=P 1+P 2 DEALLOCATE(P 1, P 2) PRINT*, "S=", S END 输入 5 6 输出S=11

 • REAL, DIMENSION(: ), POINTER: : X • READ*, A, B • C=A+B

• REAL, DIMENSION(: ), POINTER: : X • READ*, A, B • C=A+B • D=A-B • E=A*B • IF(B. NE. 0)THEN • F=A/B • ELSE • F=0 • ENDIF

 • ALLOCATE(X(6)) • X(1)=A • X(2)=B • X(3)=C • X(4)=D • X(5)=E •

• ALLOCATE(X(6)) • X(1)=A • X(2)=B • X(3)=C • X(4)=D • X(5)=E • X(6)=F • WRITE(*, 100)X • 100 FORMAT(1 X, 3 F 8. 2) • DEALLOCATE(X) • END

VALUE NEXT 图 11. 3

VALUE NEXT 图 11. 3

 • • 下面再看一个结构体定义的例子。 TYPE STUDENTNODE CHARACTER (15)NAME INTEGER NUM LOGICAL SEX CHARACTER (30)ADDRESS

• • 下面再看一个结构体定义的例子。 TYPE STUDENTNODE CHARACTER (15)NAME INTEGER NUM LOGICAL SEX CHARACTER (30)ADDRESS TYPE (STUDENTNODE),POINTER:: NEXT • END TYPE

 • • • • TYPE NODE INTEGER VALUE TYPE (NODE), POINTER : :

• • • • TYPE NODE INTEGER VALUE TYPE (NODE), POINTER : : NEXT END TYPE NODE !链表的建立,规定以 0作为链表建立结束标志。 TYPE (NODE), POINTER : : CURRENT, L INTEGER NUM READ*, NUM NULLIFY( L ) ALLOCATE( CURRENT ) CURRENT % VALUE = NUM L => CURRENT DO WHILE (NUM /= 0)

 • • READ*, NUM IF (NUM /= 0) THEN ALLOCATE( CURRENT ) CURRENT

• • READ*, NUM IF (NUM /= 0) THEN ALLOCATE( CURRENT ) CURRENT % VALUE = NUM CURRENT % NEXT => L L => CURRENT END IF END DO

 • • • !链表的输出过程。 CURRENT => L PRINT*, CURRENT % VALUE CURRENT =>

• • • !链表的输出过程。 CURRENT => L PRINT*, CURRENT % VALUE CURRENT => CURRENT % NEXT DO WHILE (ASSOCIATED(CURRENT)) PRINT *, CURRENT % VALUE CURRENT => CURRENT % NEXT NODE END DO END 输入: 1 2 3 4 5 输出: 5 4 3 2 1

 • • • !定义链表头指针 TYPE LIST PRIVATE TYPE (NODE), POINTER : : END

• • • !定义链表头指针 TYPE LIST PRIVATE TYPE (NODE), POINTER : : END TYPE LIST !模板函数所包含的内容 CONTAINS !删除函数DISPOSE( L ),用于清空链表。 SUBROUTINE DISPOSE( L ) TYPE (NODE), POINTER : : CURRENT TYPE (LIST) L

 • • CURRENT => L % END DO WHILE (ASSOCIATED(L % END)) L

• • CURRENT => L % END DO WHILE (ASSOCIATED(L % END)) L % END => CURRENT % NEXT PRINT*, CURRENT % VALUE, ' IS ABOUT TO GO' DEALLOCATE( CURRENT ) CURRENT => L % END DO END SUBROUTINE DISPOSE

 • • • !插入函数INSERT,通过插入结点建立链表 SUBROUTINE INSERT( L, NUM ) TYPE (NODE), POINTER :

• • • !插入函数INSERT,通过插入结点建立链表 SUBROUTINE INSERT( L, NUM ) TYPE (NODE), POINTER : : CURRENT TYPE (LIST) L INTEGER NUM ALLOCATE( CURRENT ) CURRENT % VALUE = NUM CURRENT % NEXT => L % END => CURRENT END SUBROUTINE INSERT

 • • • !遍历函数PRINTLIST,用来访问链表各结点, 并输出结点的值 SUBROUTINE PRINTLIST( L ) TYPE (NODE), POINTER :

• • • !遍历函数PRINTLIST,用来访问链表各结点, 并输出结点的值 SUBROUTINE PRINTLIST( L ) TYPE (NODE), POINTER : : CURRENT TYPE (LIST) L PRINT*, 'FROM THE END: ' CURRENT => L % END ! ALIAS OF LAST NODE DO WHILE (ASSOCIATED(CURRENT)) PRINT *, CURRENT % VALUE CURRENT => CURRENT % NEXT END DO

 • END SUBROUTINE PRINTLIST • • • !初始化链表,使表头指针空 SUBROUTINE SETUP( L ) TYPE

• END SUBROUTINE PRINTLIST • • • !初始化链表,使表头指针空 SUBROUTINE SETUP( L ) TYPE (LIST) L NULLIFY( L % END ) END SUBROUTINE SETUP END MODULE MODLINK

 • • • • • !主函数部分,根据要求调用前面的函数。 PROGRAM TESTLIST USE MODLINK ! LINKED LIST

• • • • • !主函数部分,根据要求调用前面的函数。 PROGRAM TESTLIST USE MODLINK ! LINKED LIST IMPLEMENTATION IMPLICIT NONE TYPE (LIST) L INTEGER : : NUM = 1 CALL SETUP( L ) DO WHILE (NUM /= 0) READ*, NUM IF (NUM /= 0) THEN CALL INSERT( L, NUM ) END IF END DO CALL PRINTLIST( L ) CALL DISPOSE( L ) END PROGRAM TESTLIST

 • 4 链表建立 • 建立方式用后插方式,即不断在表头结点后面加入新结点。 • SUBROUTINE INSERT( L, NAME 1, MARK 1,

• 4 链表建立 • 建立方式用后插方式,即不断在表头结点后面加入新结点。 • SUBROUTINE INSERT( L, NAME 1, MARK 1, GRADE 1) • TYPE (NODE), POINTER : : CURRENT • TYPE (LIST) L • CHARACTER(15)NAME 1 • INTEGER MARK 1 • REAL GRADE 1 • ALLOCATE(CURRENT) !为CURRENT指针 分配空间和数据,生成结点。 • CURRENT%NAME=NAME 1 • CURRENT%MARK=MARK 1 • CURRENT%GRADE=GRADE 1 • CURRENT%NEXT =>L%END !将CURRENT指针生成的结 点连接到链表上。 • L%END => CURRENT !链表末尾指针后移,为连接新结 点做准备。 • END SUBROUTINE INSERT

 • 7 数据更新 • 数据更新是根据给定的关键字查找到相应的记录后, 再将相关项更新。 • SUBROUTINE UPDATA(L, KEY) • TYPE (NODE),

• 7 数据更新 • 数据更新是根据给定的关键字查找到相应的记录后, 再将相关项更新。 • SUBROUTINE UPDATA(L, KEY) • TYPE (NODE), POINTER : : CURRENT • TYPE (LIST)L • CHARACTER(15)NEWNAME • INTEGER KEY, NEWGRADE • PRINT*, "请输入待更新项的关键字KEY" • READ*, KEY • PRINT*, "请输入待更新的其它项" • READ*, NEWNAME, NEWGRADE • CURRENT => L % END ! 从链表末尾开始

 • DO WHILE (ASSOCIATED(CURRENT%NEXT)) • IF(CURRENT%MARK. EQ. KEY)THEN • CURRENT %NAME=NEWNAME • CURRENT

• DO WHILE (ASSOCIATED(CURRENT%NEXT)) • IF(CURRENT%MARK. EQ. KEY)THEN • CURRENT %NAME=NEWNAME • CURRENT %GRADE=NEWGRADE • GOTO 100 • ELSE • CURRENT => CURRENT % NEXT !查找下一个结点。 • ENDIF • END DO • PRINT*, '该项不存在,无法更新' • 100 CONTINUE • END SUBROUTINE UPDATA

 • 8 链表输出 • • 程序如下: SUBROUTINE PRINTLIST( L ) TYPE (NODE), POINTER

• 8 链表输出 • • 程序如下: SUBROUTINE PRINTLIST( L ) TYPE (NODE), POINTER : : CURRENT TYPE (LIST)L PRINT*, 'FROM THE END: ' CURRENT => L % END DO WHILE (ASSOCIATED(CURRENT)) PRINT *, CURRENT %NAME, CURRENT %MARK, CURRENT %GRADE • CURRENT => CURRENT % NEXT • END DO