书签 分享 收藏 举报 版权申诉 / 78
上传文档赚钱

类型C语言程序设计-第10章-02课件.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:5100785
  • 上传时间:2023-02-11
  • 格式:PPT
  • 页数:78
  • 大小:170.01KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《C语言程序设计-第10章-02课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    语言程序设计 10 02 课件
    资源描述:

    1、2023-2-11华中科技大学计算机学院1C C语言程序设计语言程序设计The C Programming Language华中科技大学计算机学院华中科技大学计算机学院曹计昌曹计昌2023-2-11华中科技大学计算机学院2*10.7 10.7 联联 合合 10.7.1 10.7.1 联合类型的定义联合类型的定义 n与结构类似,联合类型也是一种构造类型。与结构类似,联合类型也是一种构造类型。一个联合类型中包含有多个成员,这些成员一个联合类型中包含有多个成员,这些成员共享共同的存储区域,但这些成员并不同时共享共同的存储区域,但这些成员并不同时存在存在;联合存储区域的大小由各个成员中所占联合存储区域

    2、的大小由各个成员中所占字节数最大的成员决定字节数最大的成员决定;在任何时刻,各个成在任何时刻,各个成员中只能有一个成员拥有该存储。员中只能有一个成员拥有该存储。n除了用关键字除了用关键字union取代取代struct之外,联合类之外,联合类型的定义、联合变量的声明、以及联合成员型的定义、联合变量的声明、以及联合成员的引用在语法上与结构完全相同。的引用在语法上与结构完全相同。2023-2-11华中科技大学计算机学院3如果有如果有3 3个不同数据类型(个不同数据类型(char,short,char,short,long long)的变量要分时共用一个共同的存储区)的变量要分时共用一个共同的存储区域

    3、,则可以定义如下的联合类型:域,则可以定义如下的联合类型:union chlcharc;shorth;longl;n这里这里chl是所定义的联合类型的联合名(是所定义的联合类型的联合名(tag),它它与与union一起形成一个一起形成一个union chl的联合类型。的联合类型。c、h、l是联合类型的成员。是联合类型的成员。2023-2-11华中科技大学计算机学院410.7.2 10.7.2 联合变量的声明、初始化及联合变量的声明、初始化及联合成员的引用联合成员的引用 n定义了定义了union chl的联合类型后,可以通过:的联合类型后,可以通过:union chl u;来声明一个来声明一个u

    4、nion chl类型的变量。类型的变量。n也可以在定义也可以在定义union chl联合类型的同时来声明相应的联合联合类型的同时来声明相应的联合变量。如:变量。如:union chlchar c;short h;long l;v=9;n它在定义它在定义union chl联合类型的同时声明了联合类型的变量联合类型的同时声明了联合类型的变量v,并且对其进行了初始化。并且对其进行了初始化。n在不产生二义的情况下,往往简称联合类型的变量为联合。在不产生二义的情况下,往往简称联合类型的变量为联合。2023-2-11华中科技大学计算机学院5联合变量的声明、初始化联合变量的声明、初始化n值得注意的是,联合变

    5、量的初始化与结构的初始化值得注意的是,联合变量的初始化与结构的初始化在形式上相同,都应该用花括号界定初值,但联合在形式上相同,都应该用花括号界定初值,但联合是一种特殊形式的构造类型的数据,在同一时刻它是一种特殊形式的构造类型的数据,在同一时刻它只拥有其中的一个成员。只拥有其中的一个成员。n因此,初始化时只能对联合的第因此,初始化时只能对联合的第1个成员进行初始化。个成员进行初始化。换言之,初值表中只能包含与第换言之,初值表中只能包含与第1个成员数据类型相个成员数据类型相同的一个初值。同的一个初值。n如上面例子中的如上面例子中的v=9。也可以:。也可以:union chl v=9,w=a;202

    6、3-2-11华中科技大学计算机学院6例例10.12 10.12 通过例子对联合的特性通过例子对联合的特性进行进一步分析。进行进一步分析。#include stdio.hunion chl charc;shorth;longl;void show(union chl*pu);void show_memoy(union chl*pu);2023-2-11华中科技大学计算机学院7void main(void)union chl u;printf(size of u is%dn,sizeof(u);u.l=0 x31323334L;show(&u);show_memoy(&u);u.h=0 x3638

    7、;show(&u);show_memoy(&u);2023-2-11华中科技大学计算机学院8void show(union chl*pu)printf(char format:%cn,(*pu).c);printf(int format:%hxn,pu-h);printf(long format:%lxn,(*pu).l);void show_memoy(union chl*pu)char*p=(char*)pu;int i=0;while(i”操作符来引用联合成员。从操作符来引用联合成员。从u.l,(*pu).c,pu-h三个三个表达式中可以归纳出对联合成员的引用形式为:表达式中可以归纳出对

    8、联合成员的引用形式为:(1)联合变量名)联合变量名.成员名。成员名。(2)(*指向联合变量的指针指向联合变量的指针).成员名。成员名。(3)指向联合变量的指针)指向联合变量的指针-成员名。成员名。n例如:例如:u.c 或或(*pu).c 或或pu-c 都表示引用联合成员都表示引用联合成员c,类,类型是型是char。u.h 或或(*pu).h 或或pu-h 都表示引用联合成员都表示引用联合成员h,类型是,类型是short。u.l 或或(*pu).l 或或pu-l 都表示引用联合成员都表示引用联合成员c,类型是,类型是long。n而而u.c=a,(*pu).h=0 x3839,以及,以及pu-l=

    9、0 x31323334L分别表示对联合分别表示对联合u的成员的成员c、h、l的赋值操的赋值操作。作。2023-2-11华中科技大学计算机学院134)4)共享存储的特点共享存储的特点n在在main函数中,函数中,u.l=0 x31323334L;赋值语句产生赋值语句产生的的存储可由表存储可由表10-3描述,各字节的地址由高向低,描述,各字节的地址由高向低,依次存放依次存放0 x31、0 x32、0 x33、0 x34,联合,联合u由成由成员员l使用。使用。n由由show函数和相应的运行结果可以看出,此时如果函数和相应的运行结果可以看出,此时如果按照按照(*pu).c解释,输出的只是共享存储的低字

    10、节的解释,输出的只是共享存储的低字节的内容内容0 x34或字符或字符4。如果按照。如果按照,pu-h解释,输出解释,输出的只是共享存储的低端的只是共享存储的低端2个字节的内容个字节的内容0 x33和和0 x34。n执行执行u.h=0 x3638;语句之后,联合语句之后,联合u由成员由成员h使用。使用。该语句修改了共享存储低端该语句修改了共享存储低端2个字节的内容,但是高个字节的内容,但是高端端2个字节的内容没有变化。个字节的内容没有变化。2023-2-11华中科技大学计算机学院145)5)相容性操作相容性操作n联合中允许存储不同类型的数据,对某个时刻存储的数据,联合中允许存储不同类型的数据,对

    11、某个时刻存储的数据,其所允许的操作也有所不同,有些操作对该类型的数据是相其所允许的操作也有所不同,有些操作对该类型的数据是相容的,但有些操作却不相容(得不到正确结果)。容的,但有些操作却不相容(得不到正确结果)。n由于语法上合法,编译器对这种情况不会报错,但运算的结由于语法上合法,编译器对这种情况不会报错,但运算的结果却不正确。果却不正确。n假如在假如在union chl中增加一个成员(其它都不变),如:中增加一个成员(其它都不变),如:float f;则在则在show函数中,如果执行语句为:函数中,如果执行语句为:printf(float format:%fn,pu-f);则得到是不正确的结

    12、果则得到是不正确的结果0.00,而其他语句中操作却是相容的。,而其他语句中操作却是相容的。2023-2-11华中科技大学计算机学院15*10.8 10.8 字段结构字段结构n由由多个相邻的二进制位可以组成结构或者联合中的整型或无多个相邻的二进制位可以组成结构或者联合中的整型或无符符号整型成员,这些个相邻的二进制位被称为字段(号整型成员,这些个相邻的二进制位被称为字段(bit field),对应的成员称为结构或联合的字段成员,以字段为),对应的成员称为结构或联合的字段成员,以字段为成员的结构称为字段结构。成员的结构称为字段结构。n组成字段的二进制位的数目成为该字段的宽度,它是一个非组成字段的二进

    13、制位的数目成为该字段的宽度,它是一个非负的整型常量表达式。负的整型常量表达式。n字段结构在操作系统,编译程序,嵌入式系统的字段结构在操作系统,编译程序,嵌入式系统的C语言编程方语言编程方面使用较多。面使用较多。n例如,例如,stdio.h中关于文件状态成员中关于文件状态成员flags的取值就规定了的取值就规定了1为为读状态,读状态,2为写状态,为写状态,4为缓冲数据状态等等。这些数据都是为缓冲数据状态等等。这些数据都是一些值很小的整数,没有必要用一些值很小的整数,没有必要用int或或char变量来存储每一个变量来存储每一个值。值。n通常对若干个特征中的每个特征按照取值的大小分配合适的通常对若干

    14、个特征中的每个特征按照取值的大小分配合适的二进制位,然后将它们组织成为字段封装到一个二进制位,然后将它们组织成为字段封装到一个int或或char变变量中。这样就可以通过字段名对相应的二进制位或位串进行量中。这样就可以通过字段名对相应的二进制位或位串进行操作,而不必采用前面章节介绍的位运算。操作,而不必采用前面章节介绍的位运算。2023-2-11华中科技大学计算机学院1610.8.1 10.8.1 字段结构类型的定义字段结构类型的定义n字段结构也属于构造类型,因此要先定义字字段结构也属于构造类型,因此要先定义字段结构类型,再声明字段结构变量,然后再段结构类型,再声明字段结构变量,然后再对字段结构

    15、变量中的成员进行操作。对字段结构变量中的成员进行操作。n考虑十字路口的交通灯考虑十字路口的交通灯.颜色枚举类型的声明颜色枚举类型的声明如下:如下:enum color OFF=0,RED=1,YELLOW=2,GREEN=3;2023-2-11华中科技大学计算机学院17struct traffic_lightunsigned short int east:2;/*东组灯状态字段东组灯状态字段*/unsigned short int south:2;/*南组灯状态字段南组灯状态字段*/unsigned short int west:2;/*西组灯状态字段西组灯状态字段*/unsigned sho

    16、rt int north:2;/*北组灯状态字段北组灯状态字段*/unsigned short int reserve:8;/*保留字段保留字段*/unsigned short int east_on:4;/*东组灯开通时间东组灯开通时间*/unsigned short int south_on:4;/*南组灯开通时间南组灯开通时间*/unsigned short int west_on:4;/*西组灯开通时间西组灯开通时间*/unsigned short int north_on:4;/*北组灯开通时间北组灯开通时间*/;4 4组交通灯的字段结构类型的声明组交通灯的字段结构类型的声明2023

    17、-2-11华中科技大学计算机学院184 4组交通灯的字段结构类型的简略形式声明组交通灯的字段结构类型的简略形式声明 struct traffic_lightunsigned short int east:2,south:2,west:2,north:2,reserve:8;unsigned short int east_on:4,south_on:4,west_on:4,north_on:4;n上面声明了一个上面声明了一个struct traffic_light的字段结构类型,的字段结构类型,east、south、north_on为它的字段成员,字段成员往往也简为它的字段成员,字段成员往往也简

    18、称为字段。称为字段。n冒号后面的整数说明了成员的字段宽度,字段宽度是一个非冒号后面的整数说明了成员的字段宽度,字段宽度是一个非负的整型常量表达式。负的整型常量表达式。n上面定义中,其中字段宽度为上面定义中,其中字段宽度为2的四个成员用的四个成员用unsigned char更加简练,但更加简练,但Turbo C中不支持中不支持unsigned char,因此,因此用用unsigned short int。2023-2-11华中科技大学计算机学院1910.8.2 10.8.2 字段结构类型变量的声明及成员字段结构类型变量的声明及成员的引用的引用 n可以先定义字段结构类型,再声明字段结构类型的可以先

    19、定义字段结构类型,再声明字段结构类型的变量。如:变量。如:struct traffic_light Jiedaokou;它声明了它声明了struct traffic_light的字段结构类型变量的字段结构类型变量Jiedaokou。n同时,还可以在声明字段结构类型的变量的同时对同时,还可以在声明字段结构类型的变量的同时对其进行初始化。如:其进行初始化。如:struct traffic_light Jiedaokou=0,0,0,0,0,0,0,0,0;它将它将east、north_on这这9个字段成员都初始化为个字段成员都初始化为0。2023-2-11华中科技大学计算机学院20也可以在定义字段

    20、结构类型的同时声明字段结构变量也可以在定义字段结构类型的同时声明字段结构变量并对其成员进行初始化。如:并对其成员进行初始化。如:struct traffic_lightunsigned short int east:2,south:2,west:2,north:2,reserve:8;unsigned short int east_on:4,south_on:4,west_on:4,north_on:4;Jiedaokou=0,0,0,0,0,0,0,0,0,*p=&Jiedaokou;n字段就是一个小整数,它可以出现在其它整数可以出现的任字段就是一个小整数,它可以出现在其它整数可以出现的任何

    21、地方。字段在参与运算时被自动转换为何地方。字段在参与运算时被自动转换为int或或unsigned int类型的整数。类型的整数。n对一个字段结构中成员的引用与对一般结构变量中结构成员对一个字段结构中成员的引用与对一般结构变量中结构成员的引用方法相同,有的引用方法相同,有“.”和和“-”两种。如:两种。如:Jiedaokou.west,Jiedaokou.west_on,p-north,p-north_on等。等。2023-2-11华中科技大学计算机学院21例例10.13 10.13 字段结构变量的成员引用举例。字段结构变量的成员引用举例。void main(void)struct traffi

    22、c_light Jiedaokou=0,0,0,0,0,0,0,0,0;Jiedaokou.west=GREEN;Jiedaokou.west_on=5;printf(Jiedaokou.west=%ut,Jiedaokou.west);printf(Jiedaokou.west_on=%un,Jiedaokou.west_on);printf(Jiedaokou.east=%ut,Jiedaokou.east);printf(Jiedaokou.east_on=%un,Jiedaokou.east_on);程序的运行结果如下:程序的运行结果如下:Jiedaokou.west=3 Jiedao

    23、kou.west_on=5Jiedaokou.east=0 Jiedaokou.east_on=0 2023-2-11华中科技大学计算机学院22字段成员的宽度问题字段成员的宽度问题n由于字段成员表示整数的范围有限,在对字段成员赋值时不由于字段成员表示整数的范围有限,在对字段成员赋值时不要超出了它表示数的范围。如果超出了它表示数的范围,则要超出了它表示数的范围。如果超出了它表示数的范围,则数的高位部分将被丢弃。数的高位部分将被丢弃。n如如Jiedaokou.west_on的宽度为的宽度为4,它能够表示数的范围是,它能够表示数的范围是0 15。如果执行。如果执行Jiedaokou.west_on=

    24、17(即(即0 x11 或或00010001B),编译时不会报错,),编译时不会报错,如果再执行:如果再执行:printf(Jiedaokou.west_on=%un,Jiedaokou.west_on);其输出为其输出为1。高位。高位“1”被丢弃。被丢弃。2023-2-11华中科技大学计算机学院23可以通过指向字段结构变量的指针来操纵字段可以通过指向字段结构变量的指针来操纵字段结构变量的成员。结构变量的成员。n如如:struct traffic_light Jiedaokou=0,0,0,0,0,0,0,0,0,*p=&Jiedaokou;它声明了一个它声明了一个struct traffic

    25、_light类型的字段结构指针类型的字段结构指针p,并且使并且使p指向了字段结构变量指向了字段结构变量Jiedaokou。n而而p-north=RED;p-north_on=6;分别表示通过指针分别表示通过指针p引用引用Jiedaokou的成员的成员north和和north_on,并通过赋值操作对这些成员进行赋值。,并通过赋值操作对这些成员进行赋值。n下面的语句则是输出相应的结果:下面的语句则是输出相应的结果:printf(Jiedaokou.north=%ut,p-north);printf(Jiedaokou.north_on=%un,p-north_on);2023-2-11华中科技大学

    26、计算机学院2410.8.3 10.8.3 字段结构与联合的应用字段结构与联合的应用n本节通过一个例子说明如何访问一个本节通过一个例子说明如何访问一个16位字中的高位字中的高低字节和各二进制位。低字节和各二进制位。n例子中将字段例子中将字段byte0和和byte1的宽度定义为的宽度定义为8,用以,用以表示一个表示一个16位字中的高字节和低字节位字中的高字节和低字节;n将字段将字段b0 b15宽度定义为宽度定义为1,用以表示一个,用以表示一个16位位字中的各个二进制位。字中的各个二进制位。n并且用联合使一个短整型变量、并且用联合使一个短整型变量、2个字节字段与个字节字段与16个位字段共享共同的存储

    27、。个位字段共享共同的存储。2023-2-11华中科技大学计算机学院25例例10.14 10.14 用字段和联合访问一个用字段和联合访问一个1616位字中的高位字中的高低字节和各二进制位的应用举例。低字节和各二进制位的应用举例。#include stdio.h#define CHAR_BIT 8struct w16_bytes unsigned short byte0:8,byte1:8;/*byte0为低字为低字节节,byte1为高字节为高字节*/;struct w16_bits unsigned short b0:1,b1:1,b2:1,b3:1,b4:1,b5:1,b6:1,b7:1,b8

    28、:1,b9:1,b10:1,b11:1,b12:1,b13:1,b14:1,b15:1;2023-2-11华中科技大学计算机学院26union w16/*短整型变量、结构成员短整型变量、结构成员byte、结构成员、结构成员bit共享共同的存共享共同的存储储*/shorti;struct w16_bytesbyte;struct w16_bitsbit;void main(void)union w16w=0;/*i为为0;byte0和和byte1也为也为0;b0至至b15皆为皆为0*/void bit_print(short);w.bit.b9=1;/*相当于相当于byte1为为2*/w.bit

    29、.b10=1;/*相当于相当于byte1为为6*/w.byte.byte0=b;printf(w.i=0 x%xn,w.i);/*按整型解释、输出共享存储的内容按整型解释、输出共享存储的内容*/bit_print(w.i);/*从高到低,逐位输出共享存储的各从高到低,逐位输出共享存储的各bit值值*/2023-2-11华中科技大学计算机学院27void bit_print(short num)int i,shift=sizeof(short)*CHAR_BIT;int mask=1(shift-1);/*掩码掩码mask的最高位为的最高位为1,其余其余15位为位为0*/for(i=1;i=sh

    30、ift;i+)putchar(num&mask)=0)?0:1);/*num最高位为最高位为1,输出,输出1*/num=1;/*num左移左移1位;等价于:位;等价于:num=num1*/if(i%CHAR_BIT=0&ishift)/*每输出每输出8位后,位后,输出空格输出空格*/putchar();putchar(n);2023-2-11华中科技大学计算机学院28n程序中程序中mask最高位为最高位为1,其余,其余15位为位为0,通常称为,通常称为掩码,将它与短整型变量作按位与运算用以测试短掩码,将它与短整型变量作按位与运算用以测试短整型变量的最高位是整型变量的最高位是0还是还是1。n在在

    31、bit_print函数中的函数中的for循环中,每循环一次,通过循环中,每循环一次,通过num=1将次高位移至最高位。将次高位移至最高位。w.bit.b9=1和和w.bit.b10=1将将i的高字节设成的高字节设成6,w.byte.byte0=b将将i的低字节设成的低字节设成62(b的的ASCII码)。码)。nbit_print函数将函数将num在内存中的值以二进制位的方在内存中的值以二进制位的方式输出。式输出。n程序的运行结果如下:程序的运行结果如下:w.i=0 x66200000110 01100010 2023-2-11华中科技大学计算机学院29*10.9 10.9 动态存储分配动态存储

    32、分配 10.9.1 10.9.1 静态数据结构和动态数据结构静态数据结构和动态数据结构n到目前为止,教材中介绍的各种基本类型和导出类型的数据到目前为止,教材中介绍的各种基本类型和导出类型的数据结构都是静态数据结构。结构都是静态数据结构。n静态数据结构指在变量声明时建立的数据结构。在变量声明静态数据结构指在变量声明时建立的数据结构。在变量声明时变量的存储分配也确定了,并且在程序的执行过程中不能时变量的存储分配也确定了,并且在程序的执行过程中不能改变。改变。n动态数据结构是在程序运行过程中通过调用系统提供的动态动态数据结构是在程序运行过程中通过调用系统提供的动态存储分配函数,向系统申请存储而逐步建

    33、立起来的。在程序存储分配函数,向系统申请存储而逐步建立起来的。在程序运行过程中,动态数据结构所占存储的大小可以根据需要调运行过程中,动态数据结构所占存储的大小可以根据需要调节,使用完毕时可以通过释放操作将所获得的存储交还给系节,使用完毕时可以通过释放操作将所获得的存储交还给系统供再次分配。统供再次分配。n由于系统提供的动态存储分配函数的返回值是指向分配存储由于系统提供的动态存储分配函数的返回值是指向分配存储的起始地址的指针,因此动态数据对象没有名字,对动态数的起始地址的指针,因此动态数据对象没有名字,对动态数据对象的访问只能通过指针进行。据对象的访问只能通过指针进行。2023-2-11华中科技

    34、大学计算机学院3010.9.2 C10.9.2 C的动态存储分配函数的动态存储分配函数n动态存储分配函数是动态存储分配函数是C的标准函数,函数的原型声明在头文的标准函数,函数的原型声明在头文件件中给出。中给出。n使用动态存储分配函数必须先使用使用动态存储分配函数必须先使用#include 编编译预处理命令。译预处理命令。nC提供下列与动态存储分配相关的函数。提供下列与动态存储分配相关的函数。void *malloc(size_t size);void *calloc(size_t n,size_t size);void *realloc(void*p_block,size_t size);vo

    35、id free(void*p_block);其中,其中,size_t表示表示unsigned int,即无符号整型。它是在,即无符号整型。它是在中通过中通过typedef unsigned size_t;定义的。定义的。2023-2-11华中科技大学计算机学院311)malloc1)malloc函数的功能函数的功能 nmalloc函数的原型为:函数的原型为:void *malloc(size_t size);nmalloc函数的功能是向系统申请分配函数的功能是向系统申请分配size个字节大小的存储。个字节大小的存储。如果分配成功,返回新分配存储区域的首地址;如果分配失如果分配成功,返回新分配存

    36、储区域的首地址;如果分配失败(如内存容量不够),返回败(如内存容量不够),返回NULL。新分配存储区域未被。新分配存储区域未被初始化。初始化。n例如,下面的代码片断就利用了例如,下面的代码片断就利用了malloc函数动态创建一个有函数动态创建一个有6个元素的整型数组。个元素的整型数组。int i,*p;p=(int*)malloc(6*sizeof(int);if(p)for(i=0;inum时,时,s2指向字指向字符指针符指针(p+i)-num。因此,。因此,(*s2)就是就是(p+i)-num。(*s2)=(char*)malloc(len*sizeof(char)+1);等价于:等价于:

    37、(p+i)-num=(char*)malloc(len*sizeof(char)+1);n只有将只有将s2声明为双重字符针,才能够使主函数中的声明为双重字符针,才能够使主函数中的(p+i)-num和和(p+i)-name指向在指向在dynamic_input函数中动态函数中动态分配的存储区域。分配的存储区域。2023-2-11华中科技大学计算机学院39void main(void)int n,i;struct c_score_tab*p;printf(input the number of students please!n);scanf(%d,&n);getchar();/*getchar用

    38、于读结束用于读结束scanf输入的回车符输入的回车符*/p=(struct c_score_tab*)malloc(n*sizeof(struct c_score_tab);assert(p);for(i=0;inumdynamic_input(input name!n,&(p+i)-name);printf(input score!n);scanf(%d,&(*(p+i).c);/*输入输入C语言课程成绩语言课程成绩*/getchar();printf(n);for(i=0;inum,(p+i)-name,(p+i)-c);printf(n);free(p);/*释放成绩单占据的存储释放成绩

    39、单占据的存储*/2023-2-11华中科技大学计算机学院40*10.11 10.11 链链 表表n链表是一种常用的动态数据结构,它由一系列包含链表是一种常用的动态数据结构,它由一系列包含数据域和指针域的结点组成。数据域和指针域的结点组成。n如果结点的指针域中只包含一个指向后一个结点指如果结点的指针域中只包含一个指向后一个结点指针,这种链表称为单向链表。针,这种链表称为单向链表。n如果结点的指针域包含两个指针,且一个指向前一如果结点的指针域包含两个指针,且一个指向前一个结点,另一个指向后一个结点,这种链表称为双个结点,另一个指向后一个结点,这种链表称为双向链表。向链表。n如果结点的指针域包含两个

    40、指针,且一个指向后一如果结点的指针域包含两个指针,且一个指向后一个结点,另一个指向另外一个链表,这种链表称为个结点,另一个指向另外一个链表,这种链表称为十字交叉链表。十字交叉链表。2023-2-11华中科技大学计算机学院4110.11.1 10.11.1 自引用结构自引用结构n如果一个结构类型中包含一个该结构类型的如果一个结构类型中包含一个该结构类型的指针,称该结构类型为自引用结构类型,对指针,称该结构类型为自引用结构类型,对应的结构变量称为自引用结构变量,自引用应的结构变量称为自引用结构变量,自引用结构变量常常简称为自引用结构。结构变量常常简称为自引用结构。n自引用结构的指针成员是一个指向该

    41、自引用自引用结构的指针成员是一个指向该自引用结构的指针。结构的指针。n因此,关于自引用结构的定义也可以表示为:因此,关于自引用结构的定义也可以表示为:如果一个结构中包含一个指向该结构自身的如果一个结构中包含一个指向该结构自身的指针,该结构称为自引用结构。指针,该结构称为自引用结构。2023-2-11华中科技大学计算机学院42自引用结构自引用结构struct s_list int data;struct s_list*next;node1=1,NULL;n由于由于struct s_list结构类型中,结构类型中,next是指向是指向struct s_list结构类型变量的指针(称为指向自身的指针

    42、),结构类型变量的指针(称为指向自身的指针),因此因此struct s_list结构类型是自引用结构类型。而结构类型是自引用结构类型。而node1是自引用结构变量(自引用结构)。是自引用结构变量(自引用结构)。2023-2-11华中科技大学计算机学院43自引用结构变量(自引用结构)自引用结构变量(自引用结构)n执行下面语句:执行下面语句:struct s_list node2,node3;node2.data=2;node3.data=3;node2.next=node3.next=NULL;则则node1,node2,node3的存储结构如图所示。的存储结构如图所示。node1 node2

    43、node32023-2-11华中科技大学计算机学院44例例10.16 10.16 以自引用结构以自引用结构node1node1、node2node2和和node3node3为为“结点结点”构建构建“链表链表”。#include stdio.hstruct s_listint data;struct s_list*next;node1=1,NULL;void main(void)struct s_list node2,node3;struct s_list*head=NULL,*p;node2.data=2;node3.data=3;node2.next=node3.next=NULL;head

    44、=&node1;node1.next=&node2;node2.next=&node3;p=head;printf(%pt%pn,&head,head);while(p)printf(%pt%dt%pn,p,p-data,p-nextp=p-next;2023-2-11华中科技大学计算机学院45n程序中程序中head称为头指针,称为头指针,head=&node1使使head指向了指向了node1;node1.next=&node2使使node1指向了指向了node2;node2.next=&node3使使node2指向了指向了node3。np称为遍历指针称为遍历指针,p=p-next使使p指向

    45、了下一个自引用结构。指向了下一个自引用结构。对对“结点结点”和和“链表链表”加一个引号,表明上面程序创建的各加一个引号,表明上面程序创建的各个自引用结构之间的指向关系与实际链表一致,但存储分配个自引用结构之间的指向关系与实际链表一致,但存储分配是静态而不是动态的。是静态而不是动态的。n程序的运行结果如下:程序的运行结果如下:FFD4 01940194 1 FFCCFFCC 2 FFD0FFD0 3 00002023-2-11华中科技大学计算机学院4610.11.2 10.11.2 动态创建结点动态创建结点n可以通过(结点指针类型)可以通过(结点指针类型)malloc(sizeof(结点类结点类

    46、型型)的方式来动态创建结点。的方式来动态创建结点。n如:如:p=(struct s_list*)malloc(sizeof(struct s_list)n它通过动态存储分配创建一个它通过动态存储分配创建一个struct s_list的自引用的自引用结构变量作为结点,并将返回值的类型强制转换为自结构变量作为结点,并将返回值的类型强制转换为自引用结构类型的指针并赋给指针引用结构类型的指针并赋给指针p。2023-2-11华中科技大学计算机学院47例例101017 17 从头指针开始从头指针开始,动态创建三个结点,动态创建三个结点,并使用头指针并使用头指针headhead访问后继三个结点。相关解访问后

    47、继三个结点。相关解释以注释的方式给出。释以注释的方式给出。struct s_listint data;struct s_list*next;void main(void)struct s_list*head=NULL,*p;head=(struct s_list*)malloc(sizeof(struct s_list);head-data=1;head-next=(struct s_list*)malloc(sizeof(struct s_list);head-next-data=2;head-next-next=(struct s_list *)malloc(sizeof(struct s

    48、_list);head-next-next-data=3;head-next-next-next=NULL;p=head;while(p)printf(%pt%dt%pn,p,p-data,p-next);p=p-next;2023-2-11华中科技大学计算机学院4810.11.3 10.11.3 单向链表单向链表n在单向链表中,结点的指针域中只包含一个指向其自在单向链表中,结点的指针域中只包含一个指向其自身的指针,用于指向后继结点。身的指针,用于指向后继结点。n头指针指向链表中称为链头的第一个结点,从第一个头指针指向链表中称为链头的第一个结点,从第一个结点开始,每个结点的指针成员都指向其后继

    49、结点,结点开始,每个结点的指针成员都指向其后继结点,最后一个称为链尾的结点的指针域为空指针最后一个称为链尾的结点的指针域为空指针NULL。nstruct s_list结构中由于数据域内只有一个整型数据,结构中由于数据域内只有一个整型数据,以此为结点构成的链表一般都称为整数链表。以此为结点构成的链表一般都称为整数链表。n设所讨论的结点为当前结点,则它前面的一个结点称设所讨论的结点为当前结点,则它前面的一个结点称为直接前驱结点(简称前驱);它后面的一个结点称为直接前驱结点(简称前驱);它后面的一个结点称为直接后继结点(简称后继)。为直接后继结点(简称后继)。2023-2-11华中科技大学计算机学院

    50、49例例10.18 10.18 给定一批整数,以给定一批整数,以0 0作为结束标志且不作为结点,将其作为结束标志且不作为结点,将其建成一个先进先出的链表,先进先出链表的指头指针始终指向最建成一个先进先出的链表,先进先出链表的指头指针始终指向最先创建的结点(链头),先建结点指向后建结点,后建结点始终先创建的结点(链头),先建结点指向后建结点,后建结点始终是尾结点。是尾结点。n结点自引用结构类型的声明和创建链表函数原型的声明如下:结点自引用结构类型的声明和创建链表函数原型的声明如下:#include stdio.h#include stdlib.h“struct s_list int data;/

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:C语言程序设计-第10章-02课件.ppt
    链接地址:https://www.163wenku.com/p-5100785.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库