版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第十一讲第十一讲 指针与动态数据结构指针与动态数据结构第十一讲第十一讲 指针与动态数据结构指针与动态数据结构11.1 11.1 概述概述/ /概述概述l静态数据结构静态数据结构: :在编译时为其分配存储空间在编译时为其分配存储空间, ,大小不能改变。大小不能改变。l静态数据结构优点静态数据结构优点: :分配算法简单分配算法简单, ,易于实现易于实现, ,使用方便。使用方便。l静态数据结构缺点静态数据结构缺点: :易浪费存储空间易浪费存储空间, ,易产生下标越界错误。易产生下标越界错误。l动态数据结构动态数据结构: :在运行时为其分配存储空间在运行时为其分配存储空间, ,大小可改变。大小可改变
2、。l动态数据结构优点动态数据结构优点: :可节约存储空间,灵活,应用广。可节约存储空间,灵活,应用广。l动态数据结构缺点动态数据结构缺点: :分配算法复杂分配算法复杂, ,实现难度大。实现难度大。 象象链表链表、树结构树结构、图结构图结构等数据结构都适合用动态数据等数据结构都适合用动态数据结构实现,指针是实现动态数据结构的有效手段。结构实现,指针是实现动态数据结构的有效手段。 指针和动态数据结构广泛应用于软件设计,熟练掌握和指针和动态数据结构广泛应用于软件设计,熟练掌握和灵活应用指针和动态数据结构求解问题,可使程序更加简洁、灵活应用指针和动态数据结构求解问题,可使程序更加简洁、紧凑、高效。紧凑
3、、高效。11.1 概述第十一讲第十一讲 指针与动态数据结构指针与动态数据结构概述概述存储结构存储结构访问方式访问方式指针声明指针声明指针状态指针状态11.1 11.1 概述概述/ /概述概述/ /动态数据结构示例动态数据结构示例l静态数据结构静态数据结构: :在编译时为其分配存储空间在编译时为其分配存储空间, ,大小不能改变。大小不能改变。l静态数据结构优点静态数据结构优点: :分配算法简单分配算法简单, ,易于实现易于实现, ,使用方便。使用方便。l静态数据结构缺点静态数据结构缺点: :易浪费存储空间易浪费存储空间, ,易产生下标越界错误。易产生下标越界错误。l动态数据结构动态数据结构: :
4、在运行时为其分配存储空间在运行时为其分配存储空间, ,大小可改变。大小可改变。l动态数据结构优点动态数据结构优点: :可节约存储空间,灵活,应用广。可节约存储空间,灵活,应用广。l动态数据结构缺点动态数据结构缺点: :分配算法复杂分配算法复杂, ,实现难度大。实现难度大。 象象链表、树结构、图结构链表、树结构、图结构等数据结构都适合用动态数据等数据结构都适合用动态数据结构实现,指针是实现动态数据结构的有效手段。结构实现,指针是实现动态数据结构的有效手段。 指针和动态数据结构广泛应用于软件设计,熟练掌握和指针和动态数据结构广泛应用于软件设计,熟练掌握和灵活应用指针和动态数据结构求解问题,可使程序
5、更加简洁、灵活应用指针和动态数据结构求解问题,可使程序更加简洁、紧凑、高效。紧凑、高效。11.1 概述a a1 1a a2 2a an n 链表链表树结构树结构图结构图结构概述概述存储结构存储结构访问方式访问方式指针声明指针声明指针状态指针状态第十一讲第十一讲 指针与动态数据结构指针与动态数据结构11.1 11.1 概述概述/ /存储结构存储结构l存储单元地址存储单元地址: :存储单元在内存中的排列序号(编号)。存储单元在内存中的排列序号(编号)。l存储分配存储分配: :系统为变量、数组、结构体、指针分配连续存储系统为变量、数组、结构体、指针分配连续存储单元,用于存储有关数据,其变量名、数组名
6、、结构体名、单元,用于存储有关数据,其变量名、数组名、结构体名、指针名代表连续存储单元指针名代表连续存储单元首地址首地址。l指针变量(指针)指针变量(指针): :为其分配的存储单元用于保存其它变量、为其分配的存储单元用于保存其它变量、数组、结构体的地址。通过改变其所存储的地址内容实现数组、结构体的地址。通过改变其所存储的地址内容实现动态数据结构。动态数据结构。l示例:示例: INTEGER,TARGET : I=1255INTEGER,TARGET : I=1255 REAL : R=534.45 REAL : R=534.45 CHARACTER CHARACTER* *5 :S=CHINA
7、5 :S=CHINA INTEGER : A(3)=(/35,45,55/) INTEGER : A(3)=(/35,45,55/) INTEGER,POINTER : P INTEGER,POINTER : P P=I P=I11.1 概述第十一讲第十一讲 指针与动态数据结构指针与动态数据结构概述概述存储结构存储结构访问方式访问方式指针声明指针声明指针状态指针状态11.1 11.1 概述概述/ /存储结构存储结构/ /示例示例l存储单元地址存储单元地址: :存储单元在内存中的排列序号(编号)。存储单元在内存中的排列序号(编号)。l存储分配存储分配: :系统为变量、数组、结构体、指针分配连续存
8、储系统为变量、数组、结构体、指针分配连续存储单元,用于存储有关数据,其变量名、数组名、结构体名、单元,用于存储有关数据,其变量名、数组名、结构体名、指针名代表连续存储单元首地址。指针名代表连续存储单元首地址。l指针变量(指针)指针变量(指针): :为其分配的存储单元用于保存其它变量、为其分配的存储单元用于保存其它变量、数组、结构体的地址。通过改变其所存储的地址内容实现数组、结构体的地址。通过改变其所存储的地址内容实现动态数据结构。动态数据结构。l示例:示例: INTEGER,TARGET : I=1255INTEGER,TARGET : I=1255 REAL : R=534.45 REAL
9、: R=534.45 CHARACTER CHARACTER* *5 :S=CHINA5 :S=CHINA INTEGER : A(3)=(/35,45,55/) INTEGER : A(3)=(/35,45,55/) INTEGER,POINTER : P INTEGER,POINTER : P P=I P=I11.1 概述第十一讲第十一讲 指针与动态数据结构指针与动态数据结构 12551255534.45534.45CHINACHINA35354545555510001000整型变量整型变量I,I,地址地址1000,41000,4字节字节, ,值值12551255实型变量实型变量R,R,地
10、址地址1004,41004,4字节字节, ,值值534.45534.45字符型变量字符型变量S,S,地址地址1008,51008,5字节字节, ,值值CHINACHINA整型数组整型数组A,A,地址地址1013,121013,12字节字节, ,值值3535、4545、5555指针变量指针变量P,P,地址地址1025,41025,4字节字节, ,值为值为100010000 01 11000100010041004100810081013101310251025n n概述概述存储结构存储结构访问方式访问方式指针声明指针声明指针状态指针状态11.1 11.1 概述概述/ /访问方式访问方式11.1
11、概述第十一讲第十一讲 指针与动态数据结构指针与动态数据结构l直接访问直接访问: :直接访问存储单元中的内容。如对普通变量、数直接访问存储单元中的内容。如对普通变量、数组元素、结构体成员的访问,采用直接访问方式。如图组元素、结构体成员的访问,采用直接访问方式。如图12-12-2 2所示。所示。l间接访问间接访问: :先从存储单元中得到被访问存储单元地址,然后先从存储单元中得到被访问存储单元地址,然后通过该地址访问被访问存储单元中的内容。如对指针变量通过该地址访问被访问存储单元中的内容。如对指针变量的访问,采用间接访问方式。如图的访问,采用间接访问方式。如图12-312-3所示。所示。l指针变量存
12、储单元中保存目标变量地址,通常用箭头表示。指针变量存储单元中保存目标变量地址,通常用箭头表示。F90F90指针保存目标变量名称,将指针看成目标变量的别名。指针保存目标变量名称,将指针看成目标变量的别名。l指针变量声明后指针变量声明后, ,未分配存储空间未分配存储空间, ,访问前需分配存储空间。访问前需分配存储空间。 ( (示例示例) )I I125125125125J J3753753 3* *125125I=125I=125J=3J=3* *I IP PI I125125125125J J3753753 3* *1251253 3* *P PI I地址地址I=125I=125P=IP=IJ=
13、3J=3* *I I概述概述存储结构存储结构访问方式访问方式指针声明指针声明指针状态指针状态11.1 11.1 概述概述/ /访问方式访问方式/ /示例示例11.1 概述第十一讲第十一讲 指针与动态数据结构指针与动态数据结构l直接访问直接访问: :直接访问存储单元中的内容。如对普通变量、数直接访问存储单元中的内容。如对普通变量、数组元素、结构体成员的访问,采用直接访问方式。如图组元素、结构体成员的访问,采用直接访问方式。如图12-12-2 2所示。所示。l间接访问间接访问: :先从存储单元中得到被访问存储单元地址,然后先从存储单元中得到被访问存储单元地址,然后通过该地址访问被访问存储单元中的内
14、容。如对指针变量通过该地址访问被访问存储单元中的内容。如对指针变量的访问,采用间接访问方式。如图的访问,采用间接访问方式。如图12-312-3所示。所示。l指针变量存储单元中保存目标变量地址,通常用箭头表示。指针变量存储单元中保存目标变量地址,通常用箭头表示。F90F90指针保存目标变量名称,将指针看成目标变量的别名。指针保存目标变量名称,将指针看成目标变量的别名。l指针变量声明后指针变量声明后, ,未分配存储空间未分配存储空间, ,访问前需分配存储空间。访问前需分配存储空间。 ( (示例示例) )I I125125125125J J3753753 3* *125125I=125I=125J=
15、3J=3* *I IP PI I125125125125J J3753753 3* *1251253 3* *P PI I地址地址I=125I=125P=IP=IJ=3J=3* *I I概述概述存储结构存储结构访问方式访问方式指针声明指针声明指针状态指针状态! !例例11.1 11.1 使用指针实现两个整数交换使用指针实现两个整数交换INTEGER,TARGET : I,J INTEGER,TARGET : I,J ! !声明两个目标变量声明两个目标变量I I和和J JINTEGER,POINTER : P1,P2,P3 INTEGER,POINTER : P1,P2,P3 ! !声明三个指针
16、变量声明三个指针变量P1P1、P2P2和和P3P3I=25;J=35 I=25;J=35 ! !给目标变量给目标变量I I和和J J直接赋值直接赋值P1=I;P2=JP1=I;P2=J ! !给指针分配指向给指针分配指向I I和和J J的存储空间的存储空间 WRITE(WRITE(* *, ,* *) ) 未交换数据:未交换数据:,P1,P2 ,P1,P2 ! !通过指针变量间接输出通过指针变量间接输出I I和和J J的值的值P3=P1;P1=P2;P2=P3 P3=P1;P1=P2;P2=P3 ! !交换指针交换指针P1P1和和P2P2指向的目标变量指向的目标变量PRINTPRINT* *,
17、 ,已交换数据:已交换数据: ,P1,P2 ,P1,P2 ! !通过指针变量间接输出通过指针变量间接输出J J和和I I的值的值ENDENDI I2525P1P1图图12-4 12-4 指针交换指针交换J J3535P2P2J J3535P2P2P1P1P3P3交换前交换前交换后交换后I I252511.1 11.1 概述概述/ /指针声明指针声明11.1 概述第十一讲第十一讲 指针与动态数据结构指针与动态数据结构lPOINTERPOINTER属性属性: :通过通过POINTERPOINTER属性声明指针变量。属性声明指针变量。lTARGETTARGET属性属性: :通过通过TARGETTAR
18、GET属性声明指针可指的目标变量。属性声明指针可指的目标变量。l一般格式:一般格式: ,POINTER:,POINTER:, 或或 POINTER POINTER , 例:例: REAL Q1,Q2REAL Q1,Q2 INTEGER,POINTER:P1,P2 INTEGER,POINTER:P1,P2! !声明指向整型变量的指针声明指向整型变量的指针P1P1和和P2P2 POINTER Q1POINTER Q1 ! !声明指向实型变量的指针声明指向实型变量的指针Q1Q1 POINTER IQ1,IQ2POINTER IQ1,IQ2! !声明指向整型变量的指针声明指向整型变量的指针IQ1IQ
19、1和和IQ2IQ2 概述概述存储结构存储结构访问方式访问方式指针声明指针声明指针状态指针状态11.1 11.1 概述概述/ /指针状态指针状态11.1 概述第十一讲第十一讲 指针与动态数据结构指针与动态数据结构l指针有三种状态指针有三种状态: :未定义、空指针、被关联。未定义、空指针、被关联。u未定义:程序在初始状态中未定义所有指针。未定义:程序在初始状态中未定义所有指针。u空指针:指针已定义,但未成为目标变量别名。空指针:指针已定义,但未成为目标变量别名。u被关联:指针已定义,已成为目标变量别名。被关联:指针已定义,已成为目标变量别名。概述概述存储结构存储结构访问方式访问方式指针声明指针声明
20、指针状态指针状态11.2 11.2 指针引用和赋值指针引用和赋值/ /指针引用指针引用l指针引用:指针引用:引用指针所指目标变量。引用指针所指目标变量。11.2 指针引用和赋值第十一讲第十一讲 指针与动态数据结构指针与动态数据结构指针引用指针引用指针赋值指针赋值结构体指针结构体指针! !例例11.211.2INTEGER,TARGET : R=25INTEGER,TARGET : R=25INTEGER,POINTER : PINTEGER,POINTER : PP=RP=RM=3M=3* *P-4P-4WRITE(WRITE(* *, ,* *) ) P,MP,MENDEND! !结果:结果
21、:2525,7171! !例例11.311.3INTEGER,POINTERINTEGER,POINTER:P1,PP1,PINTEGER,TARGETINTEGER,TARGET:R=12R=12P=RP=RR=2R=2* *P PWRITE(WRITE(* *, ,* *) ) P,RP,RENDEND! !结果:结果:2424,2424! !例例11.411.4INTEGER,TARGETINTEGER,TARGET:R=13R=13INTEGER,POINTERINTEGER,POINTER:P1,P2P1,P2P1=RP1=RP2=P1P2=P1WRITE(WRITE(* *, ,*
22、 *) P1,P2,R ) P1,P2,R ENDEND ! !结果:结果:1313,1313,131311.2 11.2 指针引用和赋值指针引用和赋值/ /指针赋值指针赋值l别名赋值:别名赋值:将目标变量名作为别名赋值给指针。将目标变量名作为别名赋值给指针。l数据赋值:数据赋值:将数据表达式值赋值给指针所指目标变量。将数据表达式值赋值给指针所指目标变量。l一般格式:一般格式: = = = = 11.2 指针引用和赋值第十一讲第十一讲 指针与动态数据结构指针与动态数据结构! !例例11.511.5INTEGER,TARGETINTEGER,TARGET:R1=25R1=25INTEGER,TA
23、RGETINTEGER,TARGET:R2=35R2=35INTEGER,POINTERINTEGER,POINTER:P1,P2P1,P2P1=R1P1=R1P2=R2P2=R2P1=P2P1=P2WRITE(WRITE(* *, ,* *) ) P1,P2P1,P2ENDEND! !结果:结果:3535,3535P1P1P1P1R1R12525R2R2P2P23535R1R13535R2R2P2P23535指针引用指针引用指针赋值指针赋值结构体指针结构体指针11.2 11.2 指针引用和赋值指针引用和赋值/ /结构体指针结构体指针11.2 指针引用和赋值第十一讲第十一讲 指针与动态数据结构
24、指针与动态数据结构l结构体指针:结构体指针:指向结构体的指针。指针可为结构体别名。指向结构体的指针。指针可为结构体别名。 例:例: TYPE date_recordTYPE date_record INTEGER(2) year INTEGER(2) year INTEGER(1) month,day INTEGER(1) month,day END TYPE date_record END TYPE date_record TYPE(date_record),TARGET : date TYPE(date_record),TARGET : date TYPE(date_record),POI
25、NTER : P TYPE(date_record),POINTER : P P=dateP=date P.year=1995 P.year=1995;P.month=12P.month=12;P.day=25P.day=25 y=3+P.year y=3+P.year; m=P.month-2m=P.month-2;d=5+P.dayd=5+P.day WRITE(WRITE(* *, ,* *) ) datedate WRITE(WRITE(* *, ,* *) ) P P WRITE(WRITE(* *, ,* *) ) y,m,dy,m,d END END ! !输出结果:输出结果:
26、!1995 12 25!1995 12 25 !1995 12 25 !1995 12 25 !1998 10 30 !1998 10 30YearYearMonthMonthdaydayP Pdatedate1995199512122525P Pdatedate指针引用指针引用指针赋值指针赋值结构体指针结构体指针11.3 11.3 整型指针整型指针/ /概述概述l整型指针整型指针: :地址按地址按4 4字节整数对待的指针。整型指针可参与字节整数对待的指针。整型指针可参与整数运算。整数运算。l整型指针组成整型指针组成: :指针、基变量、目标对象。指针、基变量、目标对象。l创建指针步骤创建指针步
27、骤: :u第一步:将一个指针基变量链接在一个整型指针上。第一步:将一个指针基变量链接在一个整型指针上。 POINTER(POINTER( , )u第二步:将目标对象地址赋值给整型指针。第二步:将目标对象地址赋值给整型指针。 =LOC(=LOC() =MALLOC(=MALLOC()l标准函数标准函数LOCLOC功能功能: :获得目标对象起始内存地址。获得目标对象起始内存地址。l标准函数标准函数MALLOCMALLOC功能功能: :计算表达式值计算表达式值n n,分配,分配n n个字节存储单个字节存储单元,获得存储单元起始地址。元,获得存储单元起始地址。 (示例示例)11.3 整型指针第十一讲第
28、十一讲 指针与动态数据结构指针与动态数据结构概述概述例例11.611.6例例11.711.711.3 11.3 整型指针整型指针/ /概述概述/ /示例示例l整型指针整型指针: :地址按地址按4 4字节整数对待的指针。整型指针可参与字节整数对待的指针。整型指针可参与整数运算。整数运算。l整型指针组成整型指针组成: :指针、基变量、目标对象。指针、基变量、目标对象。l创建指针步骤创建指针步骤: :u第一步:将一个指针基变量链接在一个整型指针上。第一步:将一个指针基变量链接在一个整型指针上。 POINTER(POINTER( , )u第二步:将目标对象地址赋值给整型指针。第二步:将目标对象地址赋值
29、给整型指针。 =LOC(=LOC() =MALLOC(=MALLOC()l标准函数标准函数LOCLOC功能功能: :获得目标对象起始内存地址。获得目标对象起始内存地址。l标准函数标准函数MALLOCMALLOC功能功能: :计算表达式值计算表达式值n n,分配,分配n n个字节存储单个字节存储单元,获得存储单元起始地址。元,获得存储单元起始地址。 (示例示例)11.3 概述第十一讲第十一讲 指针与动态数据结构指针与动态数据结构概述概述例例11.611.6例例11.711.7INTEGER INTEGER :I,J=20I,J=20POINTERPOINTER(P,IP,I)! !建立指针基变量
30、建立指针基变量I I和目标对象和目标对象J J的等价关系的等价关系P=LOC(J) P=LOC(J) ! !将目标对象将目标对象J J的地址赋予整型指针变量的地址赋予整型指针变量P PWRITE(WRITE(* *, ,* *) ) P,I,J P,I,J ! !输出结果为:输出结果为:4442932 20 204442932 20 20I=30I=30WRITE(WRITE(* *, ,* *) ) P,I,J P,I,J ! !输出结果为:输出结果为:4442932 30 304442932 30 30J=40J=40WRITE(WRITE(* *, ,* *) ) P,I,J P,I,J
31、 ! !输出结果为:输出结果为:4442932 40 404442932 40 40ENDEND11.3 11.3 整型指针整型指针/ /例例11.611.6分析下面程序分析下面程序 REAL A(10),B(5) REAL A(10),B(5) POINTER POINTER(P,BP,B) P=LOC(A)P=LOC(A) A(2)=125.0 A(2)=125.0 ! !等价于设置等价于设置B(2)B(2)为为125.0125.0 WRITE(WRITE(* *, ,* *) ) B(2) B(2) END END通过通过POINTERPOINTER语句语句, ,将指针基数组将指针基数组
32、B B与目标对象数组与目标对象数组A A建立联系建立联系, ,即指针即指针P P中存放的数组中存放的数组A A的起始地址就是数组的起始地址就是数组B B的起始地址的起始地址, ,所所以运行程序后以运行程序后, ,输出输出B(2)B(2)的值为的值为125.0125.0。 11.3 整型指针第十一讲第十一讲 指针与动态数据结构指针与动态数据结构概述概述例例11.611.6例例11.711.711.3 11.3 整型指针整型指针/ /例例11.711.7分析下面程序分析下面程序 INTEGER : A(5),BINTEGER : A(5),B POINTER POINTER(P,BP,B) P=L
33、OC(A)P=LOC(A) DO I=1,5 DO I=1,5 B=I B=I* *1010 P=P+4 P=P+4 ENDDO ENDDO WRITE(WRITE(* *, ,* *) ) A A END END ! !输出结果为:输出结果为: 10 20 30 40 5010 20 30 40 50 通过指针运算和指针基变量通过指针运算和指针基变量B B的赋值操作的赋值操作, ,生成数组生成数组A A的的5 5个元个元素值。通过指针运算和指针基变量素值。通过指针运算和指针基变量B B的赋值操作的赋值操作, ,生成数组生成数组A A的的5 5个元素值。整型指针个元素值。整型指针P P增加增加
34、4,4,相当于把数组的下标加相当于把数组的下标加1 1。11.3 整型指针第十一讲第十一讲 指针与动态数据结构指针与动态数据结构A AB B1 2 3 4 51 2 3 4 5P PP PP PP PP P概述概述例例11.611.6例例11.711.711.411.4与指针相关的函数和语句/NULLIFY/NULLIFYlNULLIFY:NULLIFY:将指针设置为空状态。空状态可用标准函数将指针设置为空状态。空状态可用标准函数ASSOCIATEDASSOCIATED进行检测。进行检测。 指针声明后,一般应将其设置为空状态。指针声明后,一般应将其设置为空状态。 如:如:INTEGERINTE
35、GER,POINTER : PPOINTER : P NULLIFY NULLIFY(P P)11.4 与指针相关的函数和语句第十一讲第十一讲 指针与动态数据结构指针与动态数据结构NULLIFYNULLIFYASSOCIATEDASSOCIATEDALLOCATEALLOCATEDEALLOCATEDEALLOCATE11.411.4与指针相关的函数和语句/ASSOCIATED/ASSOCIATEDlASSOCIATED:ASSOCIATED:判定是否有目标对象与指针链接。判定是否有目标对象与指针链接。 如:如: REAL A1(:),A2(:),A3(5)REAL A1(:),A2(:),A
36、3(5) POINTER A1,A2 POINTER A1,A2 TARGET A3 TARGET A3 LOGICAL S1,S2,S3 LOGICAL S1,S2,S3 A1=A3 A1=A3 !指针赋值!指针赋值 A2=A3 A2=A3 !指针赋值!指针赋值 S1=ASSOCIATED(A1)S1=ASSOCIATED(A1)!结果!结果TRUE;TRUE;指针指针A1A1已指向目标变量已指向目标变量 S2=ASSOCIATED(A1,A3) S2=ASSOCIATED(A1,A3) !结果!结果TRUE;A1TRUE;A1已指向已指向A3A3 S3=ASSOCIATED(A1,A2)
37、S3=ASSOCIATED(A1,A2) !结果!结果TRUE;A1TRUE;A1和和A2A2都指向都指向A3A311.4 与指针相关的函数和语句第十一讲第十一讲 指针与动态数据结构指针与动态数据结构NULLIFYNULLIFYASSOCIATEDASSOCIATEDALLOCATEALLOCATEDEALLOCATEDEALLOCATE11.411.4与指针相关的函数和语句/ALLOCATE/ALLOCATElALLOCATE:ALLOCATE:为指针分配所指向的存储空间。为指针分配所指向的存储空间。 如:如: REALREAL,POINTER : P1POINTER : P1 ALLOCA
38、TE(P1) ALLOCATE(P1) P1=911.911 P1=911.91111.4 与指针相关的函数和语句第十一讲第十一讲 指针与动态数据结构指针与动态数据结构NULLIFYNULLIFYASSOCIATEDASSOCIATEDALLOCATEALLOCATEDEALLOCATEDEALLOCATEP1P1P1P1911.911911.91111.411.4与指针相关的函数和语句/DEALLOCATE/DEALLOCATElDEALLOCATE:DEALLOCATE:释放指针所指存储空间。释放指针所指存储空间。 如:如: REALREAL,POINTER : P1POINTER : P
39、1 ALLOCATE(P1) ALLOCATE(P1) P1=911.911 P1=911.911 DEALLOCATE DEALLOCATE(P1P1)11.4 与指针相关的函数和语句第十一讲第十一讲 指针与动态数据结构指针与动态数据结构P1P1P1P1911.911911.911NULLIFYNULLIFYASSOCIATEDASSOCIATEDALLOCATEALLOCATEDEALLOCATEDEALLOCATE11.5 11.5 指针数组指针数组/ /指针数组指针数组11.5 指针数组第十一讲第十一讲 指针与动态数据结构指针与动态数据结构指针数组指针数组函数返回函数返回l指针数组指针
40、数组: :具有具有POINTERPOINTER属性的数组。指针数组类似动态数属性的数组。指针数组类似动态数组,声明时,指针数组不指定数组维的上下界。如:组,声明时,指针数组不指定数组维的上下界。如: REAL,DIMENSION(:),POINTER : AREAL,DIMENSION(:),POINTER : A l存储分配存储分配: :指针数组需通过指针数组需通过ALLOCATEALLOCATE语句分配存储空间。如:语句分配存储空间。如: ALLOCATEALLOCATE(A A(5050) 例:使用指针数组存储下三角矩阵。例:使用指针数组存储下三角矩阵。 (程序程序)1 0 0 01 0
41、 0 01 1 0 01 1 0 01 1 1 01 1 1 01 1 1 11 1 1 1R R RRR11111111111 12 23 34 4T11.5 11.5 指针数组指针数组/ /概述概述/ /程序程序11.5 指针数组第十一讲第十一讲 指针与动态数据结构指针与动态数据结构指针数组指针数组函数返回函数返回l指针数组指针数组: :具有具有POINTERPOINTER属性的数组。指针数组类似动态数属性的数组。指针数组类似动态数组,声明时,指针数组不指定数组维的上下界。如:组,声明时,指针数组不指定数组维的上下界。如: REAL,DIMENSION(:),POINTER : AREAL
42、,DIMENSION(:),POINTER : A l存储分配存储分配: :指针数组需通过指针数组需通过ALLOCATEALLOCATE语句分配存储空间。如:语句分配存储空间。如: ALLOCATEALLOCATE(A A(5050) 例:使用指针数组存储下三角矩阵。例:使用指针数组存储下三角矩阵。 (程序程序)1 0 0 01 0 0 01 1 0 01 1 0 01 1 1 01 1 1 01 1 1 11 1 1 1R R RRR11111111111 12 23 34 4TPROGRAM exam129PROGRAM exam129 TYPE row TYPE row INTEGER,
43、DIMENSION(:),POINTER : R INTEGER,DIMENSION(:),POINTER : R END TYPE END TYPE INTEGER,PARAMETER : N=4 INTEGER,PARAMETER : N=4 TYPE(row),DIMENSION(N) : T TYPE(row),DIMENSION(N) : T ! !声明类型为声明类型为rowrow的数组的数组T T DO I=1,N DO I=1,N ALLOCATE(T(I)%R(1:I) ALLOCATE(T(I)%R(1:I) ! !为数组元素分配空间为数组元素分配空间 ENDDOENDDO
44、DO I=1,N DO I=1,N T(I)%R(1:I)=1 T(I)%R(1:I)=1 ! !为下三角矩阵为下三角矩阵T T赋值赋值 ENDDOENDDO DO I=1,N DO I=1,N WRITE(WRITE(* *, ,* *) ) T(I)%R(1:I) T(I)%R(1:I) ! !打印矩阵打印矩阵T T ENDDO ENDDOENDEND11.5 11.5 指针数组指针数组/ /函数返回函数返回11.5 指针数组第十一讲第十一讲 指针与动态数据结构指针与动态数据结构lFORTRAN90FORTRAN90允许指针数组作为函数值返回。允许指针数组作为函数值返回。PROGRAM e
45、xam1210PROGRAM exam1210 IMPLICIT NONE IMPLICIT NONE INTEGER,DIMENSION(10): X=(/11,8,15,4,20,3,5,18,21,17/) INTEGER,DIMENSION(10): X=(/11,8,15,4,20,3,5,18,21,17/) WRITE( WRITE(* *,(20I3) array(X),(20I3) array(X)CONTAINS CONTAINS FUNCTION array(A) FUNCTION array(A) INTEGER,DIMENSION(:), POINTER : arra
46、y INTEGER,DIMENSION(:), POINTER : array INTEGER,DIMENSION(:) : A INTEGER,DIMENSION(:) : A INTEGER I,J,T INTEGER I,J,T ALLOCATE(array(SIZE(A) ALLOCATE(array(SIZE(A) ! !为为arrayarray数组分配存储单元数组分配存储单元 array=Aarray=A DO I=1,SIZE(A)-1 DO I=1,SIZE(A)-1 DO J=I+1,SIZE(A) DO J=I+1,SIZE(A) IF (array(I)array(J)
47、THEN IF (array(I)array(J) THEN T=array(J) T=array(J) array(J)=array(I) array(J)=array(I) array(I)=T array(I)=T ENDIF ENDIF ENDDO ENDDO ENDDO ENDDO END FUNCTION array END FUNCTION arrayENDEND指针数组指针数组函数返回函数返回11.6 11.6 动态链表动态链表/ /概述概述11.6 动态链表第十一讲第十一讲 指针与动态数据结构指针与动态数据结构概述概述创建搜索创建搜索u 插入节点插入节点u 删除节点删除节点
48、链表是通过结点中的指针成员将若干个具有相同派生类型链表是通过结点中的指针成员将若干个具有相同派生类型的结点拉成链,从而对一些在内存中不连续的数据进行动的结点拉成链,从而对一些在内存中不连续的数据进行动态处理的一种方式。链表中的第一个结点称为头结点,指态处理的一种方式。链表中的第一个结点称为头结点,指向头结点的指针称为头指针。向头结点的指针称为头指针。该派生类型的成员中至少有该派生类型的成员中至少有一个指向本派生类型的指针,链表中最后一个表目的成员一个指向本派生类型的指针,链表中最后一个表目的成员的指针值为空,其余表目的成员的指针均指向下一个表目。的指针值为空,其余表目的成员的指针均指向下一个表
49、目。为了便于对链表的操作,需要引入另一个派生类型,它用为了便于对链表的操作,需要引入另一个派生类型,它用于存放链表的头指针。链表的头指针表示链表的存在与否于存放链表的头指针。链表的头指针表示链表的存在与否( (头指针为空表示空链表,否则表示链表中至少有一个以上头指针为空表示空链表,否则表示链表中至少有一个以上的表目的表目) )。如果链表尾结点的指针成员指向了头结点,这样。如果链表尾结点的指针成员指向了头结点,这样的链表称为的链表称为“循环链表循环链表”。在本节主要讨论单向链表。在本节主要讨论单向链表( (简称简称链表链表) )。TYPE nodeTYPE node INTEGER data I
50、NTEGER data TYPE(node),POINTER : next TYPE(node),POINTER : nextEND TYPE nodeEND TYPE node TYPE(node),POINTER : head,P,Q,LTYPE(node),POINTER : head,P,Q,L 11.6 11.6 动态链表动态链表/ /创建和搜索创建和搜索11.6 动态链表第十一讲第十一讲 指针与动态数据结构指针与动态数据结构 创建链表的过程就是把一个个结点插入链表的过程。因而创建链表的过程就是把一个个结点插入链表的过程。因而创建链表的操作实际上就是不断地插入的过程。创建链表的操作实
51、际上就是不断地插入的过程。 ALLOCATE(Q) !ALLOCATE(Q) !创建一个新结点创建一个新结点 Q.data=95 !Q.data=95 !或或Q%data=95Q%data=95 NULLIFY(Q%next) ! NULLIFY(Q%next) !将结点中将结点中nextnext置为空指针置为空指针 head=Q !head=Q !将指针将指针Q Q赋予表头指针赋予表头指针headhead上述四条语句执行后上述四条语句执行后, ,建立了有一个结点的链表建立了有一个结点的链表, ,如图如图11-111-1所示。所示。 ALLOCATE(P) !ALLOCATE(P) !创建一个
52、新结点创建一个新结点 P.data=85 !P.data=85 !或或 P%data=85P%data=85 P%next=head ! P%next=head !将原表头结点指针将原表头结点指针headhead赋予指针赋予指针P P的的nextnext指针域指针域 head=P !head=P !将指针将指针P P赋予表头指针赋予表头指针headhead上述四条语句执行后上述四条语句执行后, ,建立了有二个结点的链表建立了有二个结点的链表, ,如图如图11-211-2所示。所示。 图图11-1 11-1 一个结点的链表一个结点的链表 图图11-2 11-2 二个结点的链表二个结点的链表概述概
53、述创建搜索创建搜索u 插入节点插入节点u 删除节点删除节点head95 Q85 Q95 headhead链表创建后链表创建后, ,需要从表头结点开始搜索链表需要从表头结点开始搜索链表, ,完成修改、输完成修改、输出、统计等有关处理操作。若出、统计等有关处理操作。若headhead为表头结点指针为表头结点指针, ,则一般则一般通过下面语句完成搜索操作。通过下面语句完成搜索操作。 Q=headQ=head DO WHILE (ASSOCIATED(Q) DO WHILE (ASSOCIATED(Q) ! !有关处理操作语句有关处理操作语句 Q=Q.next !Q=Q.next !搜索下一结点搜索下
54、一结点 ENDDOENDDO ASSOCIATED(Q) ASSOCIATED(Q)函数用于判定指针函数用于判定指针Q Q是否为空指针。是否为空指针。 11.6 11.6 动态链表动态链表/ /插入节点插入节点11.6 动态链表第十一讲第十一讲 指针与动态数据结构指针与动态数据结构执行下面语句创建新结点执行下面语句创建新结点Q,Q,结点结点Q Q插入链表有三种情况插入链表有三种情况: : ALLOCATE(Q) ALLOCATE(Q) Q.data=num Q.data=num NULLIFY(Q%next) NULLIFY(Q%next)1 1、假设链表为空表假设链表为空表, ,即表头指针即
55、表头指针headhead为空指针为空指针, ,执行赋值语执行赋值语句句head=Qhead=Q实现插入实现插入 2 2、假设链表为非空表假设链表为非空表, ,在表头在表头headhead前插入前插入, ,执行下面赋值语执行下面赋值语句实现插入句实现插入 Q.next=headQ.next=headhead=Qhead=Q 3 3、假设已创建部分链表假设已创建部分链表, ,表头指针为表头指针为head,head,指针指针P P指向链表中指向链表中某结点某结点, ,将新结点将新结点Q Q插入到插入到P P结点之后结点之后, ,执行下面赋值语句实执行下面赋值语句实现插入现插入 Q.next=P.ne
56、xtQ.next=P.next P.next=QP.next=Q 概述概述创建搜索创建搜索u 插入节点插入节点u 删除节点删除节点11.6 11.6 动态链表动态链表/ /删除节点删除节点11.6 动态链表第十一讲第十一讲 指针与动态数据结构指针与动态数据结构从 链 表 中 删 除 结 点从 链 表 中 删 除 结 点 Q Q 有 两 种 情 况有 两 种 情 况 , , 结 点 删 除 后结 点 删 除 后 , , 要 用要 用DEALLOCATE(Q)DEALLOCATE(Q)语句将结点释放语句将结点释放 1.1. 待删除结点待删除结点Q Q为表头结点为表头结点假设链表为非空表假设链表为非
57、空表, ,表头指针为表头指针为head,head,执行赋值语句执行赋值语句head=Q.nexthead=Q.next实现删除实现删除 2.2. 待删除结点待删除结点Q Q为非表头结点为非表头结点假设链表为非空表假设链表为非空表, ,表头指针为表头指针为head,head,待删除结点待删除结点Q Q的前趋结的前趋结点 指 针 为点 指 针 为 P ,P , 执 行 赋 值 语 句执 行 赋 值 语 句 P . n e x t = Q . n e x tP . n e x t = Q . n e x t 或或P.next=P.next.nextP.next=P.next.next实现删除实现删除
58、 概述概述创建搜索创建搜索u 插入节点插入节点u 删除节点删除节点12.1 12.1 接口接口/ /概述概述l接口界面功能类似接口界面功能类似EXTERNALEXTERNAL语句,为主调程序提供外部子程语句,为主调程序提供外部子程序有关接口信息,接口界面可看作是序有关接口信息,接口界面可看作是EXTERNALEXTERNAL语句的扩充,语句的扩充,提供的信息比提供的信息比EXTERNALEXTERNAL丰富。丰富。l使用接口界面块可提高程序可读性。使用接口界面块可提高程序可读性。l接口界面块可用在主程序单元、模块单元、外部子程序单元接口界面块可用在主程序单元、模块单元、外部子程序单元中中, ,
59、以指明主调程序与被调用外部子程序之间的接口信息以指明主调程序与被调用外部子程序之间的接口信息, ,以以便保证外部子程序的正确使用。便保证外部子程序的正确使用。12.1 接口概述概述格式格式示例示例12.1 12.1 接口接口/ /格式格式12.1 接口 INTERFACEINTERFACE END INTERFACE END INTERFACE FUNCTION FUNCTION () END FUNCTION END FUNCTION SUBROUTINE SUBROUTINE () END SUBROUTINE END SUBROUTINE概述概述格式格式示例示例12.1 12.1 接口接
60、口/ /说明说明12.1 接口 对于一些常规函数和子例行程序对于一些常规函数和子例行程序, ,使用时不需要用使用时不需要用INTERFACEINTERFACE接口声明它们的接口信息接口声明它们的接口信息, ,但遇到以下情况必须在主调程序中但遇到以下情况必须在主调程序中使用接口界面块使用接口界面块: :l外部函数返回结果是一个数组外部函数返回结果是一个数组, ,即外部函数名类型为数组。即外部函数名类型为数组。l外部函数返回结果是一个字符串外部函数返回结果是一个字符串, ,且长度不是常数且长度不是常数, ,也不是假也不是假定长度定长度( (* *) )。l外部函数返回结果是一个指针。外部函数返回结
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 32440.2-2024鞋类化学试验方法邻苯二甲酸酯的测定第2部分:非溶剂萃取法
- 潍坊食品科技职业学院《中学思想政治课教材分析与教学设计》2023-2024学年第一学期期末试卷
- 两江新区吊车租用合同范例
- 电池订购合同范例
- 2025广告牌制作合同2
- 场地土方施工合同范例
- 丝杠采购合同范例
- 合资签约合同范例
- 网络画册设计合同范例
- 2025全日制劳动合同书劳动合同书
- 肺结核的学习课件
- 心肺复苏术最新版
- 2023-2024学年贵州省贵阳市小学数学六年级上册期末自测提分卷
- GB/T 9115.2-2000凹凸面对焊钢制管法兰
- 永久避难硐室安装施工组织措施
- 元旦节前安全教育培训-教学课件
- 芯片工艺流程课件1
- 化工原理设计-苯-氯苯分离过程板式精馏塔设计
- 新教材人教A版高中数学选择性必修第一册全册教学课件
- IEC60335-1-2020中文版-家用和类似用途电器的安全第1部分:通用要求(中文翻译稿)
- 保险专题高净值人士的财富传承课件
评论
0/150
提交评论