欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C语言第九章06.ppt

    • 资源ID:70506248       资源大小:127.50KB        全文页数:54页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C语言第九章06.ppt

    第九章第九章 结构体数据类型与链表结构体数据类型与链表9-1 9-1 结构体类型的定义结构体类型的定义 一、结构体类型的定义、初始化与使用一、结构体类型的定义、初始化与使用 迄今为止,已介绍了基本类型(或称简单类型)迄今为止,已介绍了基本类型(或称简单类型)的变量(如整型、实型、字符型变量等),也介绍的变量(如整型、实型、字符型变量等),也介绍了一种构造类型数据了一种构造类型数据数组,数组中的各元素是数组,数组中的各元素是属于同一个类型的。属于同一个类型的。但但是是只只有有这这些些数数据据型型是是不不够够的的。有有时时需需要要将将不不同同类类型型的的数数据据组组合合成成一一个个有有机机的的整整体体,以以便便于于引引用用。这这些些组组合合在在一一个个整整体体中中的的数数据据是是互互相相联联系系的的。例例如如,一一个个学学生生的的学学号号、姓姓名名、性性别别、年年龄龄、成成绩绩、家家庭庭地址等项,这些项都与某一学生相联系。地址等项,这些项都与某一学生相联系。如下图如下图9-19-1所示表格。所示表格。num name sex age score num name sex age score addraddr 10010 Li 10010 Li Fei Fei M 18 87.5 BeijingM 18 87.5 Beijing 图图 9-1 9-1 从上图表格中可以看到性别(从上图表格中可以看到性别(sexsex)、)、年龄年龄(ageage)、)、成绩(成绩(scorescore)、)、地址(地址(addraddr)是属于是属于学号为学号为1001010010和名为和名为“Li Li FeiFei”的学生的。如果将的学生的。如果将numnum、namename、sexsex、ageage、scorescore、addraddr分别定义为分别定义为互相独立的简单变量,是难以反映它们之间的内互相独立的简单变量,是难以反映它们之间的内在联系的。应当把它们组织成一个组合项,在一在联系的。应当把它们组织成一个组合项,在一个组合项中包含若干个类型不同(当然也可以相个组合项中包含若干个类型不同(当然也可以相同)的数据项。同)的数据项。C C语言提供了这样一种数据结构,它称为结构体语言提供了这样一种数据结构,它称为结构体(structurestructure)。)。它相当于其它高级语言中的它相当于其它高级语言中的“记录记录”,它可以,它可以将不同数据类型、但相互关联的将不同数据类型、但相互关联的一组数据,组合成一个有机整体来使用。一组数据,组合成一个有机整体来使用。例如:例如:struct struct student student int int num;num;char name20 char name20;char sex;char sex;int int ageage;float score float score;char char addraddr3030;;上面定义了一个结构体类型,上面定义了一个结构体类型,struct struct studentstudent(structstruct是关键字,不能省略),是关键字,不能省略),表示这是一个表示这是一个“结构体类型结构体类型”。它包括。它包括numnum、namename、ageage、scorescore、addraddr等不同类型的数等不同类型的数据项。应当注意:据项。应当注意:struct struct studentstudent是程是程序设计者自己定义的类型名。它和系统已序设计者自己定义的类型名。它和系统已定义了的标准类型(如定义了的标准类型(如intint、charchar、floatfloat、doubledouble等)一样可以用来作为定义变量的等)一样可以用来作为定义变量的类型。类型。定义一个结构体类型的一般形式为:定义一个结构体类型的一般形式为:struct struct 结构体名结构体名 成员表列成员表列;花括弧内是该结构体中的各个成员(或称分量),花括弧内是该结构体中的各个成员(或称分量),由它们组成一个结构体。例如,上例中的由它们组成一个结构体。例如,上例中的numnum、namename、sexsex等都是成员。对各成员都应进行类型说明,等都是成员。对各成员都应进行类型说明,即:即:类型标识符类型标识符 成员名成员名 也可以把也可以把“成员表列成员表列”称为称为“域表域表”。每一个。每一个成员称为结构体中的一个域。成员名命名规则与普成员称为结构体中的一个域。成员名命名规则与普通变量名的命名规则相同。通变量名的命名规则相同。“结构体结构体”这个词是根这个词是根据英文单词据英文单词structurestructure译出的。许多译出的。许多C C语言书把语言书把structurestructure直译为直译为“结构结构”。但译作。但译作“结构结构”会与一会与一般含义上的般含义上的“结构结构”混淆混淆(例如,数据结构、程序结例如,数据结构、程序结构构)。若把。若把structurestructure译作译作“结构体结构体”或或“构造体构造体”,比译作,比译作“结构结构”确切一些,不致与一般含义上的确切一些,不致与一般含义上的“结构结构”混淆。混淆。二、二、结构类型定义结构类型定义 结构类型的定义确立了结构类型变量的格式。结构类型的定义确立了结构类型变量的格式。在一个结构类型中,不同数据类型组合的数据互在一个结构类型中,不同数据类型组合的数据互相有联系。相有联系。定义一个结构体类型的一般形式为:定义一个结构体类型的一般形式为:struct 结构类型名结构类型名 /*struct是结构类型关键字是结构类型关键字*/数据类型数据类型 数据项数据项1;数据类型数据类型 数据项数据项2;数据类型数据类型 数据项数据项;/*此行分号不能少!此行分号不能少!*/通过教材通过教材P171页范例进一步了解结构类型定义页范例进一步了解结构类型定义的格式。的格式。例例9-1 定义一个反映学生基本情况的结构类型,定义一个反映学生基本情况的结构类型,用以存储学生的相关信息。用以存储学生的相关信息。/*功能:定义一个反映学生基本情况的结构类型功能:定义一个反映学生基本情况的结构类型*/*日期结构类型:由年、月、日三项组成日期结构类型:由年、月、日三项组成*/struct date int year;int month;int day;/*学生信息结构类型:由学号、姓名、性别和生日共学生信息结构类型:由学号、姓名、性别和生日共4项组成项组成*/struct std_info char no7;char name9;char sex3;struct date birthday;/*成绩结构类型:由学号和三门成绩共成绩结构类型:由学号和三门成绩共4项组成项组成*/struct score char no7;int score1;int score2;int score3;三、说明三、说明“结结构构类类型型名名”和和“数数据据项项”的的命命名名规规则则,与与变变量量名相同。名相同。数数据据类类型型相相同同的的数数据据项项,既既可可逐逐个个、逐逐行行分分别别定定义,也可合并成一行定义。义,也可合并成一行定义。例如,例例如,例7-1中的日期结构类型,也可改为如下形式:中的日期结构类型,也可改为如下形式:struct date int year,month,day;结结构构类类型型中中的的数数据据项项,既既可可以以是是基基本本数数据据类类型型,也允许是另一个已经定义的结构类型。也允许是另一个已经定义的结构类型。例例如如,例例9-1中中的的结结构构类类型型std_info,其其数数据据项项“birthday”就是一个已经定义的日期结构类型就是一个已经定义的日期结构类型date。C语语言言中中将将个个数数据据项项称称为为结结构构类类型型的的个个成成员员(或分量)。(或分量)。9-2 9-2 结构体类型的定义结构体类型的定义一、结构体类型变量的定义一、结构体类型变量的定义 在在定定义义了了一一个个结结构构类类型型后后,还还需需要要对对相相应应的的变变量量进进行行定定义义,即即定定义义结结构构体体变变量量。结结构构体体变变量量就就是是结结构构体体组组合合数数据据的的标标识识符符,在在程程序序中中用用于于标标识识一一个个结结构构体体,如如定定义了结构体类型后,就可以接着定义该类型的变量。义了结构体类型后,就可以接着定义该类型的变量。要定义一个结构体类型的变量,可以采取以下三种方法。要定义一个结构体类型的变量,可以采取以下三种方法。1.1.先定义结构体类型再定义变量名先定义结构体类型再定义变量名 先定义结构类型再定义其结构变量的一般先定义结构类型再定义其结构变量的一般格式如下:格式如下:struct 结构体名结构体名 成员表列成员表列 ;struct 结构体名结构体名 结构变量表;结构变量表;例如:例如:struct stustruct stu long no;long no;char name20;char name20;char sex;char sex;float score3;float score3;struct stustruct stu s1,s2;s1,s2;定义变量后,系统编译时,分配存储空间,例定义变量后,系统编译时,分配存储空间,例s1s1如下如下::变量名变量名 占内存字节数占内存字节数 no no 4 4 name20 20 name20 20 sex 1 sex 1 score3 12 score3 12注注意意:s1s1变变量量成成员员是是不不同同数数据据类类型型连连续续存存储储,但但s1s1、s2s2不一定是连续存储。不一定是连续存储。应应当当注注意意:将将一一个个变变量量定定义义为为标标准准类类型型(基基本本数数据据类类型型)与与定定义义为为结结构构体体类类型型不不同同之之处处在在于于:后后者者不不仅仅要要求求指指定定变变量量为为结结构构体体类类型型,而而且且要要求求指指定定为为某某一一特特定定的的结结构构体体类类型型(例例如如,struct struct stustu),),不不能能只只指指定定为为“structstruct型型”而而不不指指定定结结构构体体名名。即即定定义义结结构变量时必须同时指定结构类型和结构名。构变量时必须同时指定结构类型和结构名。而在定义变量为整型时,只需指定为而在定义变量为整型时,只需指定为intint型即可。型即可。换句话说,可以定义许多种具体的结构体类型。换句话说,可以定义许多种具体的结构体类型。为了使用方便,人们通常用一个符号常量代表为了使用方便,人们通常用一个符号常量代表一个结构体类型。在程序开头,用一个结构体类型。在程序开头,用 define STUDENTdefine STUDENT struct struct stustu 这样在程序中,这样在程序中,STUDENTSTUDENT 与与 struct stustruct stu完全等完全等效。效。这时的结构类型定义可以改写为:这时的结构类型定义可以改写为:STUDENTSTUDENT long no;long no;char name20;char name20;char sex;char sex;float score3;float score3;然后可以直接用然后可以直接用STUDENTSTUDENT定义变量。如定义变量。如:STUDENT STUDENT s1,s2;s1,s2;用这种方法定义变量和用用这种方法定义变量和用intint、floatfloat定义变量定义变量的形式相仿,不必再写关键字的形式相仿,不必再写关键字structstruct。如果程序如果程序规模比较大,往往将对结构体类型的定义集中放规模比较大,往往将对结构体类型的定义集中放到一个文件到一个文件(以以为后缀的为后缀的“头文件头文件”)中。哪中。哪个个源文件需用到此结构类型则可用源文件需用到此结构类型则可用#includeinclude命令将命令将该头文件包含到本文件中。这样做便于装配,便该头文件包含到本文件中。这样做便于装配,便于修改,便于使用。于修改,便于使用。2.2.在定义类型的同时定义变量在定义类型的同时定义变量 同同时时定定义义结结构构类类型型及及其其结结构构变变量量的的一一般般格格式式如如下:下:struct 结构体名结构体名 成员表列成员表列 结构变量表;结构变量表;例如:例如:struct stustruct stu long no;long no;char name20;char name20;char sex;char sex;float score2;float score2;s1,s2;s1,s2;它的作用与前面定义的相同。既定义了一个它的作用与前面定义的相同。既定义了一个结构体类型结构体类型struct stustruct stu,又定义了两个又定义了两个struct struct stustu类型的变量类型的变量s1,s2s1,s2。3.3.直接定义结构类型变量直接定义结构类型变量 其一般形式为:其一般形式为:其一般形式为:其一般形式为:structstruct 成员表列成员表列 变量名表列;变量名表列;即不出现结构体名。即不出现结构体名。关于结构体类型,有几点说明:关于结构体类型,有几点说明:1)结构类型与结构变量是两个不同的概念,其)结构类型与结构变量是两个不同的概念,其区别如同区别如同int类型与类型与int型变量的区别一样。型变量的区别一样。对结构对结构体变量来说,在定义时一般先定义一个结构体类型,体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。运算,而不能对一个类型赋值、存取或运算。在在编编译译时时,对对类类型型是是不不分分配配空空间间的的,只只对对变变量量分分配配空间。空间。)对对结结构构体体中中的的成成员员(即即 域域),可可以以单单独独使使用用,它的作用与地位相当于普通变量。它的作用与地位相当于普通变量。3)3)结结构构类类型型中中的的成成员员名名,可可以以与与程程序序中中的的变变量量同同名,它们代表不同的对象,互不干扰。名,它们代表不同的对象,互不干扰。二、结构变量引用规则二、结构变量引用规则 定定义义为为结结构构体体变变量量后后就就可可以以引引用用该该变变量量,但但只只有有引引用用各各成成员员和和访访问问整整个个结结构构体体变变量量。在在访访问问中中应遵守结构变量引用规则。应遵守结构变量引用规则。1.1.成员的访问成员的访问 使用运算符使用运算符“.”“.”访问引用结构体变量成员访问引用结构体变量成员 对于结构变量中各个成员的访问,要通过成员对于结构变量中各个成员的访问,要通过成员运算符运算符“.”,逐个访问其成员,且访问的格式为:,逐个访问其成员,且访问的格式为:结构变量结构变量.成员成员 其其中中的的操操作作符符“.”称称为为成成员员运运算算符符,具具有有最最高高优优先级。先级。C C语言允许直接对结构变量的成员赋值,例如:语言允许直接对结构变量的成员赋值,例如:s1.nos1.no=10010;=10010;在这里把在这里把s1.nos1.no作为一个整体来看待。但不能作为一个整体来看待。但不能将一个结构体变量作为一个整体进行输入和输出。将一个结构体变量作为一个整体进行输入和输出。例如,已定义:例如,已定义:s1s1和和s2s2为结构体变量,并且它们为结构体变量,并且它们已有值。不能这样引用:已有值。不能这样引用:scanfscanf(“%ld,%s,%c,%f%ld,%s,%c,%f”,&s1);,&s1);printf printf(“%ld,%s,%c,%fn%ld,%s,%c,%fn”,s1);,s1);例例9-2 9-2 定义一个结构变量定义一个结构变量s s,先赋值,后输出。先赋值,后输出。#include string.hinclude string.hmain()main()struct stustruct stu long no;long no;char name20;char name20;char sex;char sex;float score3;float score3;s;s;s.no=1001;s.no=1001;strcpystrcpy(s.name,(s.name,”Wang PingWang Ping”););s.sex=f;s.sex=f;s.score0=95;s.score0=95;s.score1=87;s.score1=87;s.score2=85;s.score2=85;printfprintf(%ld%20s%4c%5.1f%5.1f%5.1f,s.no,(%ld%20s%4c%5.1f%5.1f%5.1f,s.no,s.name,s.sex,s.score0,s.score1,s.name,s.sex,s.score0,s.score1,s.score2);s.score2);访问引用整个结构体变量访问引用整个结构体变量例:例:struct stustruct stu s1,s2;s1,s2;s2=s1;s2=s1;2.2.对成员变量可以像普通变量一样进行各种运算对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)(根据其类型决定可以进行的运算)例如:例如:s2.no=s1.no;s2.no=s1.no;sum=stu;s1.no+;s1.no+;+s1.no;+s1.no;注意:由于注意:由于.”运算符的优先级最高,因此运算运算符的优先级最高,因此运算s1.no+s1.no+是对是对s1s1中的中的nono进行自加运算,而不是先对进行自加运算,而不是先对s1s1进行自加运算。进行自加运算。3.3.可可以以引引用用结结构构变变量量成成员员的的地地址址,也也可可引引用用结结构构变量的地址。变量的地址。例如,例如,&s1.name,&s1。scanfscanf(“%ld%ld”,&s1.no);/*,&s1.no);/*输入输入s1.nos1.no的值的值*/*/printfprintf(“%on%on”,&s1);/*,&s1);/*输出输出s1s1的首地址的首地址*/*/但不能用以下语句整体读入结构体变量,如但不能用以下语句整体读入结构体变量,如:scanf scanf(“%ld,%s,%c,%f%ld,%s,%c,%f”,&s1);,&s1);例例9-3 利用例利用例9-1中定义的结构类型中定义的结构类型struct std_info,定义一个结构变量定义一个结构变量student,用于存储和显示一用于存储和显示一个学生的基本情况。个学生的基本情况。#includestruct.h/*日期结构类型:由年、月、日三项组成日期结构类型:由年、月、日三项组成*/struct date int year;int month;int day;/*学学生生信信息息结结构构类类型型:由由学学号号、姓姓名名、性性别别和和生生日日共共4项项组组成成*/struct std_info char no7;char name9;char sex3;struct date birthday;/*成绩结构类型:由学号和三门成绩共成绩结构类型:由学号和三门成绩共4项组成项组成*/struct score char no7;int score1;int score2;int score3;/*定义并初始化一个外部结构变量定义并初始化一个外部结构变量student*/struct std_info student=000102,张三张三,男男,1980,9,20;main()printf(No:%sn,student.no);printf(Name:%sn,student.name);printf(Sex:%sn,student.sex);printf(Birthday:%d-%d-%dn,student.birthday.year,student.birthday.month,student.birthday.day);从上例可以看出,如果某成员本身又是一个结构从上例可以看出,如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级类型,则只能通过多级的分量运算,对最低一级的成员进行引用。的成员进行引用。此时的引用格式扩展为:此时的引用格式扩展为:结构变量结构变量.成员成员.子成员子成员.最低最低1级子成员级子成员例例如如,引引用用结结构构变变量量student中中的的birthday成成员员的的格式分别为:格式分别为:student.birthday.year student.birthday.month student.birthday.day 对对最最低低一一级级成成员员,可可像像同同类类型型的的普普通通变变量量一一样样,进行相应的各种运算。进行相应的各种运算。三、结构类型变量的初始化三、结构类型变量的初始化1.1.定义结构变量的同时对结构变量进行初始化。定义结构变量的同时对结构变量进行初始化。结结构构体体变变量量在在定定义义的的同同时时可可以以对对结结构构变变量量中中的的各各个个成成员员进进行行初初始始化化。初初始始化化时时应应注注意意数数据据类类型型的的一一致。致。如:如:struct stustruct stu long no;long no;char name20;char name20;char sex;char sex;float score3;float score3;s1=1001,Wangs1=1001,Wang Fei Fei,f,95,87,85,s2;,f,95,87,85,s2;参见教材参见教材P174P174页例页例9-19-1。2.2.先定义结构变量,后进行初始化。先定义结构变量,后进行初始化。先定义结构变量,然后先定义结构变量,然后对结构变量中的所有成对结构变量中的所有成员或部分成员进行初始化。员或部分成员进行初始化。9-39-3 结构体数组结构体数组 一一个个结结构构体体变变量量中中可可以以存存放放一一组组数数据据(如如一一个个学学生生的的学学号号、姓姓名名、成成绩绩等等数数据据)。如如果果有有1010个个学学生生的的数数据据需需要要参参加加运运算算,显显然然应应该该用用数数组组,就就是是结结构构体体数数组组。结结构构体体数数组组与与以以前前介介绍绍过过的的数数值值型型数数组组不不同同之之处处在在于于每每个个数数组组元元素素都都是是一一个个结结构构体体类类型型的的数数据据,它它们们都都分分别别包包括括各各个个成成员员(分分量)项。量)项。一、结构体数组的定义一、结构体数组的定义 和和定定义义结结构构体体变变量量的的方方法法相相仿仿,只只需需说说明明其其为数组即可。如:为数组即可。如:例:例:struct stustruct stu long no;long no;char name20;char name20;char sex;char sex;float score3;float score3;struct stu struct stu student30;student30;以上定义了一个数组以上定义了一个数组studentstudent,其元素为其元素为struct struct stustu类型数据,数组有类型数据,数组有3030个元素。也可以直接定义个元素。也可以直接定义一个结构体数组,如:一个结构体数组,如:struct stustruct stu long no;long no;char name20;char name20;char sex;char sex;float score3;float score3;student30;student30;二、结构数组的初始化与结构体数组元素的引用二、结构数组的初始化与结构体数组元素的引用初始化:初始化:struct stustruct stu student3=,;student3=,;引用:结构体数组引用:结构体数组.结构体成员变量名结构体成员变量名如如 student0.no=1001;student0.no=1001;参见教材参见教材P176P176177177页范例。页范例。9-4 结构类型数据的指针结构类型数据的指针 一一个个结结构构体体变变量量的的指指针针就就是是该该变变量量所所占占据据的的内内存存段段的的起起始始地地址址。可可以以设设一一个个指指针针变变量量,用用来来指指向向一一个个结结构构体体变变量量,此此时时该该指指针针变变量量的的值值是是结结构构体体变变量量的的起起始始地地址址。指指针针变变量量也也可可以以用用来来指指向向结构体数组中的元素。结构体数组中的元素。一、指向结构体变量的指针一、指向结构体变量的指针 结构变量指针要求先定义,后使用。基本步骤结构变量指针要求先定义,后使用。基本步骤是:是:首先定义结构首先定义结构定义指向结构类型变量的指针变量定义指向结构类型变量的指针变量指向结构体变量的指针变量,称结构体指针指向结构体变量的指针变量,称结构体指针定义形式为:定义形式为:struct struct 结构体类型名结构体类型名*结构体指针变量名结构体指针变量名;引用引用 指针变量指针变量-成员成员其中运算符其中运算符“-”“-”称为指向运算符。称为指向运算符。例例9-4 使用指向结构变量的指针来访问结构变量的使用指向结构变量的指针来访问结构变量的各个成员。各个成员。struct date int year;int month;int day;struct std_info char no7;char name9;char sex3;struct date birthday;struct std_info student=“000102”,“张张 三三”,“男男”,1980,9,20;main()struct std_info *p_std=&student;printf(No:%sn,p_std-no);printf(Name:%sn,p_std-name);printf(Sex:%sn,p_std-sex);printf(Birthday:%d-%d-%dn,p_std-birthday.year,p_std-birthday.month,p_std-birthday.day);通通过过指指向向结结构构变变量量的的指指针针来来访访问问结结构构变变量量的的成成员员,与与直直接接使使用用结结构构变变量量的的效效果果一一样样。一一般般地地说说,如如果果指指针针变变量量pi已已指指向向结结构构变变量量aa,则则以以下下三种形式等价:三种形式等价:aa.成员成员 pi-成员成员(*pi).成成员员 /*“*pi”外外面面的的括括号号不不能能省省!*/注注意意:在在格格式式中中,分分量量运运算算符符左左侧侧的的运运算算对对象象,只只能能是是结结构构变变量量;而而在在格格式式中中,指指向向运运算算符符左左侧侧的的运运算算对对象象,只只能能是是指指向向结结构构变变量量(或或结结构构数数组)的指针变量,否则都出错。组)的指针变量,否则都出错。二、指向结构数组的指针二、指向结构数组的指针以以前前已已经经介介绍绍过过,可可以以使使用用指指向向数数组组或或数数组组元元素素的的指指针针和和指指针针变变量量。同同样样,对对结结构构体体数数组组及及其元素也可以用指针或指针变量来指向。其元素也可以用指针或指针变量来指向。例:例:struct stustruct stu long no;long no;char name20;char name20;char sex;char sex;struct struct birthday b;birthday b;float score3;float score3;s,s,ssss3;3;其中:其中:&s s:取结构体变量取结构体变量s s的起始地址的起始地址&s.nos.no:取结构体变量成员取结构体变量成员s.nos.no的地址的地址&ssss00:取取结结构构体体数数组组元元素素ssss00的的地地址址。ssss是是结结构数组,其名字表示该字符数组的起始地址。构数组,其名字表示该字符数组的起始地址。&ssss0.no0.no:取数组元素取数组元素ssss00的结构体成员的地址的结构体成员的地址&ssss1.score1.score:数数组组元元素素ssss11的的结结构构体体成成员员的的首首地地址址。scorescore是是一一个个浮浮点点数数组组,其其名名字字表表示示该该数数组组的起始地址。的起始地址。&ssss1.score11.score1:最终成员的地址最终成员的地址&s.b.years.b.year:变变量量s s中中嵌嵌套套变变量量b b的的成成员员s.b.years.b.year的的地址。地址。例:例:struct stustruct stu*pst1,*pst2;*pst1,*pst2;pst1=&s;pst1=&s;pst2=pst2=ssss;或:或:pst2=&pst2=&ssss00;或:或:pst2=&pst2=&ssss0.no;0.no;参见教材参见教材P178P178页例页例9-29-2。注注意意:如如果果指指针针变变量量p已已指指向向某某结结构构数数组组,则则p+1指指向向结结构构数数组组的的下下一一个个元元素素,而而不不是是当当前前元元素素的的下下一个成员。一个成员。另另外外,如如果果指指针针变变量量p已已经经指指向向一一个个结结构构变变量量(或或结结构构数数组组),就就不不能能再再使使之之指指向向结结构构变变量量(或或结构数组元素)的某一成员。结构数组元素)的某一成员。9-5 结构体与函数结构体与函数 一、用指向结构体的指针作函数参数用指向结构体的指针作函数参数 有时想将一个结构体变量的值传递给另一个有时想将一个结构体变量的值传递给另一个函数,但原来的标准不允许用结构体变量作为函数,但原来的标准不允许用结构体变量作为函数参数。那么用什么方法来解决这个问题呢?函数参数。那么用什么方法来解决这个问题呢?有两个方法:有两个方法:用结构体变量的成员作参数。例如,用用结构体变量的成员作参数。例如,用stu1.numstu1.num或或stu1.namestu1.name作函数实参,将实参值传给作函数实参,将实参值传给形参。用法和用普通变量作实参是一样的,属形参。用法和用普通变量作实参是一样的,属“值传递值传递”方式。方式。用指向结构体变量(或数组)的指针作实参,用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。将结构体变量(或数组)的地址传给形参。二、嵌套结构二、嵌套结构C C语言允许结构体成员又是一个结构体变量。语言允许结构体成员又是一个结构体变量。单独定义后嵌套:单独定义后嵌套:structstruct data data intint year;year;intint month;month;intint day;day;struct stustruct stu ;structstruct date birthday;date birthday;或直接嵌入:或直接嵌入:structstruct intint year;year;intint month;month;intint day;day;birthday;birthday;float score3;float score3;s1,s2;s1,s2;访问嵌套成员:访问嵌套成员:s1.birthday.years1.birthday.year9-6 链表链表一、链表概述一、链表概述 链表是一种常见的重要的数据结构。它是动链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。我们知道,用数态地进行存储分配的一种结构。我们知道,用数组存放数据时,必须事先定义固定的长度(即元组存放数据时,必须事先定义固定的长度(即元素个数)。比如,有的班级有人,而有的素个数)。比如,有的班级有人,而有的班只有人,如果要用同一个数组先后存放不班只有人,如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度为同班级的学生数据,则必须定义长度为100100的数组。的数组。如果事先难以确定一个班的最多人数,则必须把如果事先难以确定一个班的最多人数,则必须把数组定得足够大,以能存放任何班级的学生数据。数组定得足够大,以能存放任何班级的学生数据。显然这将会浪费内存。链表则没有这种缺点,它显然这将会浪费内存。链表则没有这种缺点,它根据需要开辟内存单元。教材根据需要开辟内存单元。教材P172P172页图页图7.77.7表示最表示最简单的一种链表(单向链表)的结构。链表有一简单的一种链表(单向链表)的结构。链表有一个个“头指针头指针”变量,图中以变量,图中以headhead表示,它存放一表示,它存放一个个地址。该地址指向一个元素。链表中每一个元素地址。该地址指向一个元素。链表中每一个元素称为称为“结点结点”,每个结点都应包括两个部分:第,每个结点都应包括两个部分:第一部分为用户需要用的实际数据,第二部分为下一部分为用户需要用的实际数据,第二部分为下一个结点的地址。可以看出,一个结点的地址。可以看出,headhead指向第一个元指向第一个元素;第一个元素又指向第二个元素;素;第一个元素又指向第二个元素;,直到,直到最后一个元素,该元素不再指向其它元素,它称最后一个元素,该元素不再指向其它元素,它称为为“表尾表尾”,它的地址部分放一个,它的地址部分放一个”NULLNULL”(表(表示示“空地址空地址”)。链表到此结束。)。链表到此结束。可以看到:链表中各元素在内存中可以不是连可以看到:链表中各元素在内存中可以不是连续存放的。要找某一元素,必须先找到上一个元续存放的。要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一个素,根据它提供的下一元素地址才能找到下一个元素。如果不提供元素。如果不提供“头指针头指针”(headhead),),则整个则整个链表都无法访问。链表如同一条铁链一样,一环链表都无法访问。链表如同一条铁链一样,一环扣一环,中间是不能断开的。打个通俗的比方:扣一环,中间是不能断开的。打个通俗的比方:幼儿园的老师带领孩子出来散步,老师牵着第一幼儿园的老师带领孩子出来散步,老师牵着第一个个小孩的手,第一个小孩的另一只手牵着第二个孩小孩的手,第一个小孩的另一只手牵着第二个孩子,子,这就是一个,这就是一个“链链”,最后一个孩子有,最后一个孩子有一只手空着,他是一只手空着,他是“链尾链尾”。要找这个队伍,必。要找这个队伍,必须先找到老师,然后顺序找到每一个孩子。须先找到老师,然后顺序找到每一个孩子。可以看到,这种链表的数据结构,必须利用可以看到,这种链表的数据结构,必须利用指针变量才能实现,即:一个结点中应包含一个指针变量才能实现,即:一个结点中应包含一个指针变量,用它存放下一结点的地址。指针变量,用它存放下一结点的地址。前前面面介介绍绍了了结结构构体体变变量量,它它包包含含若若干干成成员员。这这些些成成员员可可以以是是数数值值类类型型、字字符符类类型型、数数组组类类型型,也也可可以以是是指指针针类类型型。这这个个指指针针类类型型可可以以是是指指向向其其它它结结构构体体类类型型数数据据,也也可可以以指指向向它它所所在在的的结结构构体体类型。类型。(1)头指针变量)头指针变量head指向链表的首结点。指向链表的首结点。(2)每个结点由)每个结点由2个域组成:个域组成:1)数据域)数据域存储结点本身的信息。存储结点本身的信息。2)指针域)指针域指向后继结点的指针。指向后继结点的指针。(3)尾尾结结点点的的指指针针域域置置为为“NULL(空空)”,作作为为链表结束的标志。链表结束的标志。对链表的基本操作对链表的基本操作 对对链链表

    注意事项

    本文(C语言第九章06.ppt)为本站会员(hyn****60)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开