(C++完整PPT课件)第5章C++程序的结构_第1页
(C++完整PPT课件)第5章C++程序的结构_第2页
(C++完整PPT课件)第5章C++程序的结构_第3页
(C++完整PPT课件)第5章C++程序的结构_第4页
(C++完整PPT课件)第5章C++程序的结构_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章第五章 C+程序的结构程序的结构本章主要内容本章主要内容l作用域与可见性作用域与可见性l对象的生存期对象的生存期l数据与函数数据与函数l静态成员静态成员l共享数据的保护共享数据的保护l友元友元l编译预处理命令编译预处理命令l多文件结构和工程多文件结构和工程第五章第五章 C+程序的结构程序的结构5.1 面向对象程序的结构面向对象程序的结构 5.1.1 作用域和生存期作用域和生存期 1. 作用域作用域 1) 函数原型作用域函数原型作用域 函数原型作用域开始于函数原型声明的左括号函数原型作用域开始于函数原型声明的左括号“(”,结,结束于右括号束于右括号“)”。例如:。例如:double Are

2、a(double length, double width); 函数原型作用域是函数原型作用域是C+程序中最小的作用域。程序中最小的作用域。 由于形参由于形参length和和width只在括号之内有效,在程序的只在括号之内有效,在程序的其它地方无法引用这个标识符,如果要引用,必须重新定义。其它地方无法引用这个标识符,如果要引用,必须重新定义。因此,这里的标识符因此,这里的标识符length和和width实际上是可有可无的,省实际上是可有可无的,省去它,也决不会影响到程序的编译和运行结果。例如:去它,也决不会影响到程序的编译和运行结果。例如:double Area(double, double)

3、;第五章第五章 C+程序的结构程序的结构 块作用域又称局部作用域。由一对花括号块作用域又称局部作用域。由一对花括号“ ”所括起来所括起来的块中声明的标识符的作用域从声明处开始,一直到块结束的块中声明的标识符的作用域从声明处开始,一直到块结束的花括号为止。例如:的花括号为止。例如: #includevoid main( ) void fun1( ) ; int n; for( int i=0 ; i5; i+ ) int m ; if( i%2 ) n+ ; m = n/2 ;/错误,错误,m未定义未定义 n = i ; fun1( ) ; /fun1( )函数调用函数调用 2) 块作用域块作用

4、域第五章第五章 C+程序的结构程序的结构 void fun1( ) couti=iendl ; /错误,错误,i未定义未定义 编译时,函数编译时,函数fun1( )中的语句:中的语句: couti=iendl;将出现一个未定义错误,这是因为将出现一个未定义错误,这是因为块作用域不能延伸到子函数块作用域不能延伸到子函数中中。第五章第五章 C+程序的结构程序的结构3) 文件作用域文件作用域 #includeint k;void main() k=5; k+; int k=7; k+; coutk=k; cout“, k=kendl; 程序运行结果为:程序运行结果为:k=8, k=6可见性遵循的一般

5、规则:可见性遵循的一般规则:(1) 标识符在标识符在引用前必须先声明引用前必须先声明。(2) 在互相没有包含关系的在互相没有包含关系的不同作用域不同作用域中声明同名的标识符时,中声明同名的标识符时, 两标识符两标识符互不影响互不影响。(3) 如果在两个或多个具有包含关系的作用域中声明了如果在两个或多个具有包含关系的作用域中声明了同名标识同名标识 符符,则,则外层标识符在内层不可见外层标识符在内层不可见。第五章第五章 C+程序的结构程序的结构1) 静态生存期静态生存期 静态生存期与程序的运行期相同。具有静态生存期与程序的运行期相同。具有文件作用域文件作用域的变的变量具有静态生存期。如果要在函数内

6、部的量具有静态生存期。如果要在函数内部的块作用域块作用域中声明具中声明具有静态生存期的变量,则有静态生存期的变量,则要使用关键字要使用关键字static。 例如:例如: static int k; 具有静态生存期的变量,也称为静态变量具有静态生存期的变量,也称为静态变量。2) 局部生存期局部生存期在块作用域中声明的变量具有局部生存期。此生存期诞在块作用域中声明的变量具有局部生存期。此生存期诞生于声明点,而终止于其作用域的结束处。具有局部生存期生于声明点,而终止于其作用域的结束处。具有局部生存期的变量都具有块作用域。但当在块作用域内将变量说明为静的变量都具有块作用域。但当在块作用域内将变量说明为

7、静态变量时,该变量则具有静态生存期。态变量时,该变量则具有静态生存期。3) 动态生存期动态生存期动态生存期由程序中特定的动态生存期由程序中特定的函数函数 ( malloc( )和和free( ) ) 调调用或由用或由操作符操作符 ( new和和delete ) 创建和释放。具有动态生存期创建和释放。具有动态生存期的变量在内存的堆区分配空间。的变量在内存的堆区分配空间。2生存期生存期第五章第五章 C+程序的结构程序的结构3局部变量和全局变量局部变量和全局变量1) 局部变量局部变量局部变量包括自动局部变量包括自动(auto)变量、内部静态变量、内部静态(static)变量和变量和函数参数。函数参数

8、。2) 全局变量全局变量全局变量具有文件作用域。全局变量具有文件作用域。第五章第五章 C+程序的结构程序的结构/EX5_1.cpp : 演示局部变量和全局变量演示局部变量和全局变量#includeint i = 1 ;/全局变量全局变量i: 静态生存期静态生存期void main( ) static int a ;/声明局部静态变量声明局部静态变量a: 静态生存期静态生存期 int b = -10 ;/声明局部变量声明局部变量b: 局部生存期局部生存期 int c = 0 ; /声明局部变量声明局部变量c: 局部生存期局部生存期 void other( void ) ;/声明声明函数函数oth

9、er( ) cout“ main: i=i a=a b=b c= cendl ; c = c + 8 ; other( ) ;/调用函数调用函数other( ) cout“ main: i=i a=a b=b c=cendl; other( );/调用函数调用函数other( )第五章第五章 C+程序的结构程序的结构void other( void ) static int a = 1 ;/局部静态变量局部静态变量a: 静态生存期静态生存期 static int b ;/局部静态变量局部静态变量b: 静态生存期静态生存期 int c = 5 ; /局部变量局部变量c: 局部生存期局部生存期 i

10、 = i+2 ; a = a+3 ; c = c+5 ; coutother: i=i a=a b= b c=cendl; b = a ;程序运行结果为:程序运行结果为:main: i=1 a=0 b=-10 c=0other: i=3 a=4 b= 0 c=10main: i=3 a=0 b=-10 c=8other: i=5 a=7 b= 4 c=10第五章第五章 C+程序的结构程序的结构 静态成员为同类的所有对象共同拥有,用于解决同类对静态成员为同类的所有对象共同拥有,用于解决同类对象之间数据和函数的共享问题。静态成员分为象之间数据和函数的共享问题。静态成员分为静态数据成员静态数据成员和

11、和静态函数成员静态函数成员。 (1) 静态数据成员声明:静态数据成员声明:static int n (2) 静态数据成员静态数据成员必须要必须要在类外进行初始化在类外进行初始化,初始化的形式为:,初始化的形式为: :=例如:例如:int Point:n = 0 ; (3) 静态成员属于类,而不属于任何一个对象;静态成员属于类,而不属于任何一个对象; (4) 静态成员一样要服从访问控制限制;静态成员一样要服从访问控制限制; (5) 私有私有静态数据成员只能在静态数据成员只能在类内引用类内引用,公有或保护公有或保护静态数据静态数据 成员可以在类外通过成员可以在类外通过类名引用类名引用。 (6) 静

12、态函数成员可以直接引用该类的静态成员,但静态函数成员可以直接引用该类的静态成员,但不能直接不能直接 引用非静态数据成员引用非静态数据成员; (7) 公有公有静态函数成员可以通过类名或对象名来调用。静态函数成员可以通过类名或对象名来调用。5.1.2 静态成员静态成员第五章第五章 C+程序的结构程序的结构/EX5_2.cpp : 演示使用静态成员演示使用静态成员#includeclass point private: int x , y ; static int countP ; /声明声明私有静态数据成员私有静态数据成员 public: point( int xx=0, int yy=0 )/定

13、义构造函数定义构造函数 x=xx ; y=yy ; countP+ ; point( point &p ) ;/声明拷贝构造函数声明拷贝构造函数 int get_x( ) return x ; int get_y( ) return y ; static void get_c( ) /定义定义公有静态函数成员公有静态函数成员 cout“Object id=”countPendl ; /私有静态数据成私有静态数据成; /员在类内引用员在类内引用第五章第五章 C+程序的结构程序的结构point:point( point &p )/定义拷贝构造函数定义拷贝构造函数 x = p.x ;

14、 y = p.y ; countP+ ;/私有静态数据成员在私有静态数据成员在类内引用类内引用int point:countP = 0 ;/静态数据成员静态数据成员必须要必须要在类外初始化在类外初始化void main( ) point:get_c( ) ;/第第1次通过次通过类类名调用静态函数成员名调用静态函数成员 point a( 4, 5 ) ;/声明类的对象声明类的对象a coutpoint a,a.get_x( ),a.get_y( ); a.get_c( ) ;/第第2次通过次通过对象对象名调用静态函数成员名调用静态函数成员 point b( a ) ; coutpoint b,b

15、.get_x( ),b.get_y( ) ; point:get_c( );/第第3次通过次通过类类名调用静态函数成员名调用静态函数成员第五章第五章 C+程序的结构程序的结构 在主函数中,分别采用类名和对象名来调用在主函数中,分别采用类名和对象名来调用get_c( )。 第第1次调用次调用get_c( )时由于还没有任何对象生成,只能采用时由于还没有任何对象生成,只能采用类名的形式。由此可见,类名的形式。由此可见,通过类名调用静态函数成员可以输出通过类名调用静态函数成员可以输出静态数据成员的初始值静态数据成员的初始值。 后面的后面的2次次get_c( )的调用既可以采用类名的形式,也可以的调用

16、既可以采用类名的形式,也可以采用对象名的形式。采用对象名的形式。 程序运行结果为程序运行结果为:Object id = 0point a, 4, 5 Object id=1point b, 4, 5 Object id=2第五章第五章 C+程序的结构程序的结构 声明友元函数是为了使普通函数或声明友元函数是为了使普通函数或其它类的其它类的成员函数能成员函数能访问本类的成员,友元函数在类声明中由关键字访问本类的成员,友元函数在类声明中由关键字friend修饰。修饰。普通函数声明为友元函数的形式:普通函数声明为友元函数的形式:friend (参数表参数表)其它类的其它类的成员函数声明为友元函数的形式

17、:成员函数声明为友元函数的形式:friend :(参数表参数表) 说明:说明:(1) 友元函数的声明可以在类声明中的任何位置,既可在友元函数的声明可以在类声明中的任何位置,既可在public区,也可在区,也可在protected区,意义完全一样。区,意义完全一样。(2) 友元函数的定义一般放在类的外部,最好与类的其他友元函数的定义一般放在类的外部,最好与类的其他成员函数定义放在一起。成员函数定义放在一起。5.1.3 友元友元 1. 友元函数友元函数第五章第五章 C+程序的结构程序的结构/EX5_3.cpp : 演示使用普通函数作友元函数计算两点距离演示使用普通函数作友元函数计算两点距离#inc

18、lude#includeclass point private: double x, y ; public: point(double xx=0, double yy=0 ) x=xx; y=yy; double get_x( ) return x; double get_y( ) return y; friend double distance( point p1, point p2 ) ; /普通函数作普通函数作; /point的友元的友元第五章第五章 C+程序的结构程序的结构double distance( point p1, point p2 ) /定义定义point类的友元函数类的友

19、元函数 return (sqrt(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);void main( ) point myp1(1,1), myp2(4,5) ; /声明声明point类对象类对象myp1和和myp2 coutThe distance is:distance(myp1, myp2)endl;第五章第五章 C+程序的结构程序的结构 如果友元是一个类,则称为友元类。友元类的声明形式为:如果友元是一个类,则称为友元类。友元类的声明形式为: friend class 说明:说明: (1) 友元类的声明同样可以在类声明中的任何位置;友元类的

20、声明同样可以在类声明中的任何位置; (2) 友元类的所有成员函数都成为友元函数。友元类的所有成员函数都成为友元函数。 例如,若例如,若A类为类为B类的友元类,即在类的友元类,即在B类中声明:类中声明: friend class A ;则则A类的所有成员函数都成为类的所有成员函数都成为B类的友元函数,都可以访问类的友元函数,都可以访问B类类的私有和保护成员。的私有和保护成员。2. 友元类友元类第五章第五章 C+程序的结构程序的结构 友元类的成员函数可以通过对象名直接访问到隐藏的数据,友元类的成员函数可以通过对象名直接访问到隐藏的数据,达到高效协调工作的目的。但在使用友元时还有两点需要注意:达到高

21、效协调工作的目的。但在使用友元时还有两点需要注意:(1) 友元关系不能传递友元关系不能传递。B类是类是A类的友元,类的友元,C类是类是B类的友类的友 元,元,C类和类和A类之间如果没有声明,就没有任何友元关系,类之间如果没有声明,就没有任何友元关系,不能进行数据共享。不能进行数据共享。 (2) 友元关系是单向的友元关系是单向的。如果声明。如果声明B类是类是A类的友元,类的友元,B类的成类的成员函数就可以访问员函数就可以访问A类的私有和保护数据,但类的私有和保护数据,但A类的成员函类的成员函数却不能访问数却不能访问B类的私有和保护数据。类的私有和保护数据。第五章第五章 C+程序的结构程序的结构

22、使用使用const关键字声明的引用称为常引用,常引关键字声明的引用称为常引用,常引用所引用的对象不能被更新。用常引用做形参,不用所引用的对象不能被更新。用常引用做形参,不会发生对实参意外的更改。会发生对实参意外的更改。 常引用的声明形式为常引用的声明形式为 const & 注意:注意:常引用的值不能被更新,所以常引用的值不能被更新,所以常引用声明时,常引用声明时, 必须同时进行初始化必须同时进行初始化。5.1.4 常类型常类型 1. 常引用常引用第五章第五章 C+程序的结构程序的结构/EX5_4.cpp : 演示常引用做形参演示常引用做形参#includevoid display( c

23、onst double &r ) ; /常引用做形参常引用做形参 cout“r=”+rendl ; /错误:更改常引用的对象错误:更改常引用的对象rvoid main( ) double d( 6.5 ) ; display( d ) ; 这段程序编译时有一个这段程序编译时有一个错误错误: error C2166: 1-value specifies const object。如果将如果将display函数的定义语句改为函数的定义语句改为: coutr=rendl; 则得程序运行结果为则得程序运行结果为: r=6.5第五章第五章 C+程序的结构程序的结构 使用使用const关键字声明的

24、对象称为常对象。常对象的声明关键字声明的对象称为常对象。常对象的声明形式为形式为 const 或或 const 声明常对象的同时,也要进行初始化,而且该对象以后声明常对象的同时,也要进行初始化,而且该对象以后不能再被更新。不能再被更新。3. 常成员函数常成员函数使用使用const 关键字声明的函数称为常成员函数,常成员关键字声明的函数称为常成员函数,常成员函数声明的形式为函数声明的形式为 (参数表参数表) const;2. 常对象常对象第五章第五章 C+程序的结构程序的结构说明:说明:(1) const是加在函数声明是加在函数声明后面后面的类型修饰符,它是函数的类型修饰符,它是函数类型的一个组

25、成部分,因此在类型的一个组成部分,因此在实现部分也要带实现部分也要带const关键关键字。字。(2) const关键字可以被关键字可以被用于对重载函数的区分用于对重载函数的区分,例如,例如,可以在类中这样声明:可以在类中这样声明:void fun( ) ;void fun( ) const ; (3) 常成员函数常成员函数不能更新对象的数据成员不能更新对象的数据成员,也,也不能调用该不能调用该类中没有用类中没有用const修饰的成员函数修饰的成员函数。(4) 常对象常对象调用它的常成员函数调用它的常成员函数,而不能调用其他,而不能调用其他成员函数。成员函数。第五章第五章 C+程序的结构程序的结

26、构/EX5_5.cpp : 演示常成员函数演示常成员函数#includeclass A private: int x , y ; public: A ( int i=0, int j=0 ) x=i ; y=j ; void fun( )/定义定义普通普通成员函数成员函数 cout成员函数:成员函数:x=x, y=yendl ; void fun( ) const/定义定义常常成员函数成员函数 cout常成员函数:常成员函数:x=x, y=yendl ; ;void main( ) A obj1( 1, 2 ) ;/声明普通对象声明普通对象obj1 obj1.fun( ) ;/调用普通成员函数

27、调用普通成员函数 const A obj2( 3, 4 ) ;/声明常对象声明常对象obj2 obj2.fun( ) ;/调用常成员函数调用常成员函数第五章第五章 C+程序的结构程序的结构 程序运行结果为:程序运行结果为:成员函数:成员函数:x=1, y=2常成员函数:常成员函数:x=3, y=4 4. 常数据成员常数据成员 常数据成员也用关键字常数据成员也用关键字constconst说明,常数据成员(包括常说明,常数据成员(包括常引用、常对象)由于引用、常对象)由于不能被更新不能被更新,因此只能用,因此只能用成员初始化列成员初始化列表表的方式的方式通过构造函数通过构造函数进行进行初始化初始化

28、。第五章第五章 C+程序的结构程序的结构/EX5_6.cpp : 演示常数据成员演示常数据成员#includeclass A private: const int x ;/常数据成员常数据成员x static const int y ;/静态常数据成员静态常数据成员y public: const int &r ; /常引用常引用r A ( int i ) : x ( i ), r ( x ) /x和和r用用初始化列表初始化列表获得初值获得初值 void fun( ) coutx=x, y=y, r=rendl ; ;const int A:y=5 ;/y的初始化在类外进行的初始化在类外

29、进行第五章第五章 C+程序的结构程序的结构void main( ) A obj1(1), obj2(2); obj1.fun( ); obj2.fun( );程序运行结果为:程序运行结果为:x=1, y=5, r=1x=2, y=5, r=2第五章第五章 C+程序的结构程序的结构 大型程序通常由多个文件组成一个大型程序通常由多个文件组成一个项目项目(Project),理由),理由是:是:1. 将相关类和函数放在一个特定的文件中,对不同的文件进行将相关类和函数放在一个特定的文件中,对不同的文件进行单独编写、编译,最后再链接,避免重复劳动,提高工作单独编写、编译,最后再链接,避免重复劳动,提高工作

30、效益效益。2. 便于便于团队开发团队开发。按逻辑功能将程序分解成多个源文件,使程。按逻辑功能将程序分解成多个源文件,使程序容易管理,便于程序员的任务安排。序容易管理,便于程序员的任务安排。大型程序基本上由三个部分构成:大型程序基本上由三个部分构成:类的声明:类的声明: 通常做成通常做成 .h文件文件 (Header Files)类成员的实现:通常做成类成员的实现:通常做成 . cpp文件(文件(Source Files)主函数:主函数: 通常做成通常做成 . cpp文件(文件(Source Files)5.1.5 多文件结构多文件结构第五章第五章 C+程序的结构程序的结构5.2 动态内存分配动

31、态内存分配 5.2.1 new运算符运算符 new运算符用于动态分配一块内存空间。使用形式为:运算符用于动态分配一块内存空间。使用形式为: 指针变量指针变量 = new 长度长度例如分配一个可以容纳例如分配一个可以容纳256个个char型数据的空间型数据的空间: char *Cbuffer = new char 256 ; 使用使用new运算符时,需要注意:运算符时,需要注意:(1) 如果分配的空间长度为如果分配的空间长度为1个单位,则可以省略个单位,则可以省略 和其中的整和其中的整数,例如:数,例如: float *pNum=new float ;与与 float *pNum=new flo

32、at1;等价。等价。第五章第五章 C+程序的结构程序的结构(2) 使用使用new运算符分配内存空间时,其空间长度可以是变量,运算符分配内存空间时,其空间长度可以是变量, 也可以是数值表达式,例如分配一个可以容纳也可以是数值表达式,例如分配一个可以容纳10个个int型数型数 据据的空间:的空间:int nSize = 5 ;int *nPInt = new intnSize+5;(3) 由由new分配的分配的内存空间是连续的内存空间是连续的,可以通过指针的变化访问,可以通过指针的变化访问 所分配空间的每一个元素,例如:所分配空间的每一个元素,例如:int *nPInt = new int10;n

33、PInt5=100; 或或 *(nPInt+5)=100;(4) 如果当前存储器无足够的内存空间可分配,则如果当前存储器无足够的内存空间可分配,则new运算符返运算符返 回回0 ( NULL )。第五章第五章 C+程序的结构程序的结构 由由new运算符分配的内存空间在使用完毕后应该使用运算符分配的内存空间在使用完毕后应该使用delete运算符释放。运算符释放。delete运算符的使用有两种形式运算符的使用有两种形式: delete指针指针 或或delete 指针指针例如:例如:int *pInt = new int ; delete pInt ; int *pManyInt=new int10

34、 ; delete pManyInt ; 使用使用delete运算符时,需要注意:运算符时,需要注意:(1)用用new运算符获得的内存空间,只许使用运算符获得的内存空间,只许使用一次一次delete,不允许不允许多次对同一块空间进行多次释放多次对同一块空间进行多次释放,否则将会产生严重错误。,否则将会产生严重错误。(2) delete只能用来释放由只能用来释放由new运算符分配的动态内存空间,运算符分配的动态内存空间,不得不得使用使用delete运算符去释放程序中的变量、数组的存储空间运算符去释放程序中的变量、数组的存储空间。5.2.2 delete运算符运算符第五章第五章 C+程序的结构程序

35、的结构1链表概述链表概述链表是一种动态数据结构,它的特点是用一组任意的存链表是一种动态数据结构,它的特点是用一组任意的存储单元储单元 ( 可以是连续的,也可以是不连续的可以是连续的,也可以是不连续的 ) 存放数据元素。存放数据元素。一个简单的链表具有下一个简单的链表具有下图图所示的结构形式。所示的结构形式。5.2.3 动态内存分配的应用实例动态内存分配的应用实例a1an头指针heada2a3定义单链表结构的最简单形式为定义单链表结构的最简单形式为: struct Node int data; Node *next; ;第五章第五章 C+程序的结构程序的结构 定义一个链表类定义一个链表类List

36、,其中包含链表结点的,其中包含链表结点的插入、删除、插入、删除、访问访问等功能的成员函数,以便对链表进行操作。等功能的成员函数,以便对链表进行操作。class List Node *head; /声明一个链表结构声明一个链表结构指针指针 public: List( ) head = NULL ; void InsertList ( int aData , int bData ) ;/链表结点的链表结点的插入插入 void DeleteList ( int aData ) ; /链表结点的链表结点的删除删除 void OutputList ( ) ; /链表结点的链表结点的访问访问 Node *

37、Gethead( ) return head ; ;第五章第五章 C+程序的结构程序的结构void List:OutputList( )/链表结点的链表结点的访问访问 Node *current = head ;/建立链表头指针建立链表头指针 while ( current != NULL )/如果链表存在,如果链表存在, coutdatanext ;/指向下一个结点指向下一个结点 coutdata = bData ;/将将新结点新结点b的数据放入的数据放入新存储区新存储区p = head ;/结点指针结点指针p指向链表头指向链表头 if ( head = NULL )/若是空表,若是空表,

38、head = s ;/将新存储区的地址赋给表头,即使将新存储区的地址赋给表头,即使 s-next = NULL ;/新结点新结点b作为第一个结点作为第一个结点 else/若不是空表若不是空表 if( p-data = aData ) /若若a是第一个结点是第一个结点 head = s;/使使新结点新结点b作为第一个结点作为第一个结点 s-next = p;/将结点将结点a接到接到新结点新结点b的后面的后面 第五章第五章 C+程序的结构程序的结构 else /若若a不是第一个结点不是第一个结点 while( p-data != aData & p-next != NULL) /找结点找结

39、点a q = p ;/使使q指向指向p所指的结点所指的结点 p = p-next ;/ p本身指向下一个结点本身指向下一个结点if( p-data = aData )/若有结点若有结点a,则,则q指向的是指向的是ak q-next = s ;/将将新结点新结点b插入结点插入结点ak之后之后 s-next = p ;/将结点将结点a排在排在新结点新结点b之后之后 else/若没有结点若没有结点a p-next = s ;/将将新结点新结点b排在链表末尾,即排在链表末尾,即 s-next = NULL ;/将将新存储区新存储区排在链表末尾。排在链表末尾。 第五章第五章 C+程序的结构程序的结构 要

40、在链表中删除结点要在链表中删除结点a,并释放被删除的结点所占的存储空,并释放被删除的结点所占的存储空间,需要考虑下列几种情况间,需要考虑下列几种情况:(1) 若要删除的结点若要删除的结点a是第一个结点,则把是第一个结点,则把head指向指向a的下一个的下一个结点,如图结点,如图 (a)所示。所示。(2) 若要删除的结点若要删除的结点a不是第一个结点,则应使不是第一个结点,则应使a的上一结点的上一结点ak-1的指针域指向的指针域指向a的下一个结点的下一个结点ak+1,如图,如图 (b)所示。所示。(3) 若空表或要删除的结点若空表或要删除的结点a不存在,则不作任何改变。不存在,则不作任何改变。4

41、链表结点的删除链表结点的删除a1headaak-1akak+1(a)(b)第五章第五章 C+程序的结构程序的结构/设设aData是要被删除结点是要被删除结点a中的数据成员中的数据成员void List:DeleteList ( int aData ) Node *p , *q ; p = head ; if ( p = NULL ) return ; /若若p为空,则返回为空,则返回 if ( p-data = aData ) /若若a是第一个结点是第一个结点 head = p-next;/链表头指向下一个结点链表头指向下一个结点 delete p ;/删除结点删除结点a else/若若a不是第一个结点不是第一个结点 第五章第五章 C+程序的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论