




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 结构 前面已介绍了整型、实型、字符型等基本数据结构。 介绍了处理相同数据类型数据集合的数组。 对于处理具有某种联系,可以由不同类型的数据项组成的复杂数据类型,C+称为结构。 本章内容包括结构类型及变量的定义,访问结构的成员方法,结构作为参数传递的函数调用及返回结构的函数等。第五章 结构主要内容5.1 结构与指针5.2 结构与数组5.3 传递结构参数5.4 链表操作5.1 结构与指针按C+规定,可做如下定义:struct person char name10; int age; float wage;其中,struct 是关键字; person 是自定义的结构类型的名称; 花括号中是结构
2、成员的说明。 类型定义通常位于main( )函数之前,使该类型在定义点后面的程序中可见。 person 结构类型被定义后,从使用角度看,就等效于int,char,float等基本数据类型。 要使用结构变量也必须先定义后使用,例如: person worker; 变量一旦定义,编译器将为woker 变量分配包含三种不同数据类型成员的存储空间,如右图所示:nameagewage结构成员的访问 the individual members of struct variable can be accessed using the dot operator “.”. 一般形式:结构变量名. 结构成员名
3、例如: worker.age=25; cinworker.age; cinworker.wage;下面是一个定义结构类型和变量的简单例子:#includestruct weather float temp; int wind;void main( ) weather today; today.temp=25.5; today.wind=4; cout“Temp=”today.tempendl; cout“Wind=”today.windendl; 结果: Temp=25.5 Wind=4结构变量赋值 数组不能彼此赋值,但同类型的结构变量可以彼此赋值。 例如下面程序对结构变量赋值:#includ
4、estruct person char name20; unsigned long id; float salary;person pr1“Li ming”, 1082422, 5300.0;void main( ) person pr2; pr2=pr1; /assigning pr1 to pr2 “ ”pr2.id“ ”pr2.salaryname; (*p).id 等效于p-id; (*p).salary 等效于p-salary.在使用指针访问成员时,通常使用箭头操作符“-”。例如:下面程序中,定义了结构指针,通过结构指针访问结构成员。#include #inc
5、lude strut person char name20; unsigned long id; float salary;void main( ) person pr1; person *p; p=&pr1; strcpy(p-name, “Wang ming”); p-id=12345678; p-salary=4800.0; coutname“ ”p-id“ ”salaryendl;结果为:Wang ming 12345678 4800.0 如果一个数组的元素是同一种结构类型的变量,那么这种数组称为结构数组。 要定义一个结构数组,必须先定义一个结构类型,然后再定义具有这种结构类型的一个数
6、组。 例如,定义一个包含100个元素的person 结构数组: struct person char name20; unsigned long id; float salary; ; person allone100;5.2 结构与数组 数组中每个元素是一个完整的结构变量,它包含name、id、salary三个成员分量。 allone0 访问第一个数组元素; allone99访问最后一个数组元素。例如:下面程序对一个person 结构数组中的元素进行“冒泡法”排序,工资高的排在后面。#include struct person char name20; unsigned long id; f
7、loat salary;person allone6=“jone”,12345,3390.0, “david”,13916,4490.5, “marit”,27519,3110.0, “jasen”,42876,6230.5, “peter”,23987,4000.2, “yoke”,12335,5110.0;void main( ) person temp; for(int i=1; i6;i+) /排序轮次数 for(int j=0;jallonej+1.salary) /工资高的后移 temp=allonej; allonej=allonej+1; alonej+1=temp; for(
8、int k=0;k6;k+) “ ” allonek.id“ ” allonek.salaryendl;运行结果为:marit 27519 3110.0jone 12345 3390.0peter 23987 4000.2david 13916 4490.5yoke 12335 5110.0jasen 42876 6230.5 结构变量也可以作为实参数进行函数调用。可以采用传值、传址、传引用的三种方式传递参数。一、传递结构变量值 因为传递的是实参结构变量中拷贝的数值,所以实参结构变量的数值不会因为函数的调用而被修改。例如:下面是一个传值调用的例子#include
9、 struct person char name20; unsiged long id; float saslary;5.3 传递结构参数void print(person pr) “ ”pr.id“ ”pr.salaryendl;person allone4=“jone”,12345,3390.0, “david”,13916,4490.5, “marit”,27519,3110.0, “yoke”,12335,5110.0;void main( ) for(int i=0;i4;i+) print(allonei); /实参数为结构数组元素 结果为: jone 123
10、45 3390.0 david 13916 4490.5 marit 27519 3110.0 yoke 12335 5110.0二、传递结构变量的引用 结构变量也可以按引用方式传递,此时仅把实参的地址传给形参。由于传递的是地址,可以实现由形参直接修改实参的作用。 引用传递没有传递值的拷贝数据过程,节省了传送时间和所需的存储空间,传递效率提高。 例如,将前面的程序改为用引用传递结构变量,只需在print( )函数定义时,将形参说明为引用。其函数调用方式与传递方式相同。void print(person& pr) “ ”pr.id“ ”pr.salaryendl;三、传递结
11、构变量的地址 传递结构变量地址与传递引用的功能类似,都能实现双向传递。若将前面程序改为传递结构变量的地址,只需定义print( )函数时,将形参说明为指向结构变量的指针,函数调用时传递实参结构变量的地址。 返回值为结构类型的函数称为结构函数。一、返回结构变量 一个函数可以返回一个结构变量。在main( )中,调用结构函数的返回值必须赋于具有相同结构类型的变量。例如:#include struct person char name20; unsigned long id; float salary;结构函数person getperson( ) /定义返回结构变量的函数 person temp;
12、 ; couttemp.idtemp.salary; return temp; /返回结构变量tempvoid print(person& p) “ ”p.id“ ”p.salaryendl;void main( ) person employee3; for(int i=0;i3;i+) employeei=getperson( ); /返回值赋给同类型的结构变量 print(employeei); 结果:Please enter a name for one person:maritPlease enter ones ID number and
13、 his salary: 3110.0marit 27519 3110.0 如果将上例中的getperson( )函数改为引用传递,则可提高程序运行效率,省去函数返回值赋以同类型结构变量的操作。改写后的程序如下:#include struct person char name20; unsigned long id; float salary;void getperson(person& p) /形参定义为结构变量引用 ; coutp.idp.salary;void print(person& p) “ ”p.id“ ”p.salaryendl;void
14、 main( ) person employee3; for(int i=0;i3;i+) getperson(employeei); /函数调用后,实参获取输入数据 print(employeei); 二、返回结构的引用 一个函数可以返回一个结构引用,也可以返回一个结构指针。一、结构的嵌套 结构可以嵌套,即结构中可以是另一个结构类型的成员变量。例如:struct person struct date char name10; int month; int age; int day; float wage; int year; data payday; ;worker;也可以表示为:5.4 链
15、表结构struct person char name10; int wage; struct date int month; int day; int year; payday;worker; 结构变量payday 是嵌套在结构person 内的一个成员分量。在访问嵌套结构的成员时,可以使用多个点操作符,从最外层到最内层逐个列出成员名:worker.wage=5000.0; worker.payday.month=11; 二、链表结构 结构成员变量不能包含有自身的结构变量,但可以是指向该结构变量的指针。 通过包含一个指向自身结构的指针,可以实现不连续分布的结构变量的遍历。如下面的结构:strc
16、t list char name20; list *pn; 其中,name成员含有实际的信息;pn 是指向另一个list 结构变量的指针。 显然,通过结构变量中的指针成员链接,能构成任意长度的结构链,这样的结构链称为链表。链表中的每个list 结构变量称为一个结点。marit0074:8854divid0074:88F2链首指针0074:8AC20074:8854susen0074:28F6aneNULL0074:28F60074:38FAjone0074:38FA0074:88F2 链表是由一个个有序的结点组成的,每个结点是同类型的结构变量。 通过程序可以建立和显示链表,可以插入、删除及增加
17、结点来维护链表。 链表总是包含有链首指针,链表的操作一般都先由链首指针引导。5.4 链表操作例如:下面程序建立一个链表,并输出该链表。#include struct student long number; float score; student *next;student *head; /链首指针student *greate( ) /创建链表函数 student *ps; /创建新结点指针 student *pend; /移动的链尾指针,用于在其后插入结点 ps=new student; /动态申请新建结点的存储空间 cinps-numberps-score; /结点赋值 head=NU
18、LL; /开始时链表为空 pend=ps; while(ps-number!=0) if(head=NULL) head=ps; else pend-next=ps; pend=ps; /S点 ps=new student; cinps-numberps-score; pend-next=NULL; delete ps; return(head);void showlist(student *head) cout“The items of list are:n”; while(head) coutnumber“, ”scorenext; void main( ) showlist(greate( );输入: 结果: 85.0 The items of list are: 73.0 401, 85.0 91.0 410, 73.0 68.0 425, 91.0 82.0 413, 68.00 0 432, 82.0 在main( )中,把建立链表函数greate( )的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 代理电子合同范例
- 书搬运合同范例
- 一年级健康饮食教育教学计划
- 企业礼品销售合同范例
- 2025年度小学德育课程设计计划
- 上海餐饮退租合同范例
- 旅游导游一日工作流程解析
- 公众号运营合同范例
- 职业技能培训小组合作学习的方案计划
- 智能健身仓线上线下融合经营合作协议
- 外研版英语三年级下册期中测试卷 (4)及答案
- 中国书法史学习通超星期末考试答案章节答案2024年
- 企业社会责任与顾客满意
- 大学生创新创业基础学习通超星期末考试答案章节答案2024年
- 沉浸式学习让你学习更高效课件高二下学期高效学习主题班会
- 国家开放大学《管理信息系统》大作业参考答案
- TCAICC 001-2024 张家界莓茶质量等级评价
- 人教版一下数学克的认识公开课课件
- 走进重高-培优讲义-数学-八年级-上册-(浙教版)
- 初中物理竞赛练习题集(共14讲)含答案
- 2024年江苏省南京市联合体中考三模英语试题(解析版)
评论
0/150
提交评论