已阅读5页,还剩97页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章 自定义数据类型,1)用户根据需要自己声明一些类型: 数组2)用户可以自己声明的类型还有: 结构体(structure)类型 共用体(union)类型 枚举(enumeration)类型 类(class)类型3)称用户自定义类型, user-defined type, UDT,本章学习,7.1结构体类型7.1.1概述1、什么是结构体 将不同类型的数据组合成一个有机的整体, C+语言提供了一种数据结构, 称为结构体。例: struct Student int num; /学号 char name20; /姓名 char sex; /性别 int age; / 年龄 ;,2、结构体类型声明方式 struct 结构体类型名 成员表列 ; /注意分号不要遗漏其中:成员表列中放入各个成员的类型声明。 例: struct Student int num; /类型名 成员名; char name20; char sex; int age; ;,3、名词1)结构体类型名例: struct Student int num; /每个成员的声明语句 char name20; ; 结构体类型名:Student2) 成员名 如:num, name3) 域表:成员表列4) 一个域:结构体中的每一个成员(分量)。5)结构体类型可全局声明, 也可局部声明。,7.1.2结构体类型变量的定义方法及初始化,1、定义结构体类型变量的方法说明:使用结构体时, 不能使用结构体类型名, 只能使用结构体变量。定义结构体变量有三种方法。方法1:先声明结构体类型, 再定义变量。方法2:声明结构体类型的同时, 定义变量。方法3:直接定义结构体类型变量。,方法1:先声明结构体类型, 再定义变量。(最可取)例: 先声明结构体类型 struct Student /24B int num; char name20; ; 再定义变量 Student student1, student2;,系统根据变量定义, 分配内存空间。,结构体变量名,结构体类型名,方法2:声明的同时定义变量 struct 结构体类型名 成员表列 结构体变量名表列;例: struct Student int num; char name20; student1, s2, s3;,方法3:直接定义变量(不可取) struct 成员表列 结构体变量名表列;例: struct int num; char name20; student1, s2, s3;,其它说明:不要误认为凡是结构体类型都有相同的结构。例: struct Student /24B int num; char name20; ; struct Student1 /8B int num; int age; ;,2)类型与变量不同 使用变量, 不能使用类型。 编译时, 仅对变量分配内存。例: struct Date int year; int month; int day; date1, date2;使用date1, date2 /2*12B,3) 成员的引用相当普通的变量(.成员运算符)例: struct S int num; char name20; s1, s2;使用: s1.num=20; strcpy(, LiMing); s2.num=21; strcpy(, ZhangHua);,4) 成员也可是结构体变量例:struct Date int month; int day; int year; ; struct Student int num; char name20; char sex; int age; Date birthday; char addr30; student1, student2;,student1, student2内存分配分别为:4B+20B+1B+4B+3*4B+30B,5)成员名和变量名相同, 但不是一回事。例: struct Student int num; char name20; s1, s2; int num;1)引用方式不同 2)内存空间不同 s1.num=20; num=20;,2、结构体变量的初始化定义时指定初始值例1:struct Student int num; char name20; char sex; int age; float score; char addr30; student1=10001, Zhang Xin, M, 19, 90.5, Shanghai;,例2:struct Student int num; char name20; char sex; int age; float score; char addr30; ;Student student2=10002, Wang Li, F, 20, 98, Beijing;,1、可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。例: student1= student2;2、可以引用一个结构体变量中的一个成员的值。引用结构体变量中成员的一般方式为: 结构体变量名.成员名(.高级, 自左向右, 因此看成一个整体)例: student1.num=10010; (一个整体),7.1.3 结构体变量的引用(使用),3、如果成员本身也是一个结构体类型, 则要用若干个成员运算符, 一级一级地找到最低一级的成员。例: student1.num student1.birthday.month,4、不能将一个结构体变量作为一个整体进行输入和输出。例: coutstudent1.num; coutstudent1.num;,5、 对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算种类)。例: student2.scorestudent1.score; sumstudent1.scorestudent2.score; student1.age+; +student1.age;注:由于.运算符的优先级高, 因此student1.age+相当于(student1.age)+。+是对student1.age进行自加运算, 而不是先对age进行自加运算。 (单独的age是无意义的),6、可以引用结构体变量成员的地址, 也可以引用结构体变量的地址。例: cout &student1:结构体变量的地址&student1.age:结构体变量成员的地址,例7.1 引用结构体变量中的成员。#include using namespace std;struct Date int month; int day; int year;,struct Student int num; char name20; char sex; Date birthday; float score; student1, student2= 10002, Wang Li, f, 5, 23, 1982, 89.5;,int main( ) student1=student2; coutstudent1.numendl; endl; coutstudent1.sexendl; coutstudent1.birthday.month/ student1.birthday.day/ student1.birthday.yearendl; coutstudent1.scoreleader_name; for(j=0;j3;j+) if(strcmp(leader_name, ) =0) leaderj.count+; 输出得票: for(i=0;i3;i+) :; leaderi.count=0; string leader_name;,统计得票: for(i=0;ileader_name; for(j=0;j3;j+) if(leader_name=) leaderj.count+; 输出得票:for(i=0;i3;i+) :leaderi.countc.ac.b; coutc.aai.aai.b; 4) 结构体数组初始化 A1 a2=10, a, 11, b;,1、通过指向结构体变量的指针引用结构体变量中的成员1)指向结构体变量指针变量的定义前提:需声明结构体类型 例:struct Student long num; char name20; ;定义: 结构体类型名 *变量名;例: Student *p;,7.1.5 指向结构体变量的指针,2)赋初值 Student student1; Student *p; p= (指向确定)3)引用成员 student1.num=98001 (*p).num=98001 注意: 括号不能省略。,4)指向运算符 - (*p).num=98001可改写为 p-num=98001优先级 高级结合性 自左向右 p-num (可看成一个整体) p-num+ +p-num,5)结构体成员的三种表示方法 直接访问: student1.num 间接访问: (*p).num p-num (少写两个字符, 更直观),例7.3 指向结构体变量的指针的应用。结构体类型局部声明: struct Student int num; string name; char sex; float score; ;结构体变量声明: Student stu;指向结构体变量的指针变量定义和初始化: Student *p=,输出成员值: (三种方式)coutnumnamesexscoreendl;,2、用结构体变量和指向结构体变量的指针构成链表链表是一种常见的重要的数据结构。图7.8表示最简单的一种链表(单向链表)的结构。图7.8,链表有一个头指针变量, 图中以head表示, 它存放一个地址。该地址指向第一个元素。链表中的每一个元素称为结点。每个结点都应包括两个部分: 一是用户需要用的实际数据, 二是下一个结点的地址。,1)链表-根据需要开辟内存单向链表:1)头指针head: 存放链表的首地址 2)结点:链表中每一个元素 part 1: 用户的实际数据 part 2: 下一结点的首地址 3)表尾:最后一个结点 part 1: 用户的实际数据 part 2: 存放空地址 (NULL),2) 3 人链表 a) 31001, 89.5 b) 31003, 90 c) 31007, 85,Student *next;,Student *head;,例:struct Student long num; float score; ;1)2 人链表 a) 31001, 89.5 b) 31003, 90。,链表结点的结构体类型: struct Student long num; float score; Student *next; ;链表的表头: Student *head;,Part 1,Part 2,NULL,例7.4 建立简单链表, 它由3个学生数据的结点组成。 输出各结点中的数据。(静态链表)#define NULL 0 /注意此行#include struct Student long num; float score; Student *next;(全局结构体类型声明),int main( ) Student a, b, c, *head, *p; a. num=31001; a.score=89.5; b. num=31003; b.score=90; c. num=31007; c.score=85; head=,p=head; do coutnumscorenext; while(p!=NULL); return 0;,将一个结构体变量中的数据传递给另一个函数, 有下列3种方法: 用结构体变量名作参数。一般较少用这种方法。 (传值调用, 单向, 不共占内存)(2) 用指向结构体变量的指针作实参, 将结构体变量的地址传给形参。 (传值调用) (常用) 要求:函数体内改变指向变量值(3) 用结构体变量的引用(别名)作函数参数。 (传址调用) 共占内存 (最可取),7.1.6 结构体类型数据作为函数参数,例7.5 有一个结构体变量stu, 内含学生学号、姓名和3门课的成绩。要求在main函数中为各成员赋值, 在另一函数print中将它们的值输出。,用结构体变量作函数参数 (传值调用)(传值调用, 单向, 不共占内存)函数声明: void print(Student); 函数调用: print(stu); 函数定义: void print(Student stu) coutname=Wang Fun; coutname; /第三步,使用指向成员 释放内存: delete p;,修改例7.4 开辟空间以存放一个动态链表(下学期学习)(考试不考)#includeusing namespace std;#define NULL 0struct Studentint num;double score;Student *next;void main()Student *head,*p,*p1;,p1=new Student;p1-num=31001;p1-score=89.5;head=p1;p=p1;p1=new Student;p1-num=31003;p1-score=90;p-next=p1;p=p1;p1=new Student;p1-num=31005;p1-score=85;p-next=p1;p1-next=NULL;,p=head;while(p!=NULL)coutnumscorenext;,小结,1、结构体指针1)声明类型 /前提 struct A1 int a; char b; ;2)声明结构体变量和指针变量 /第一步 A1 a, *p;3) 指针变量赋值, 指向确定 /第二步 p= /第三步,问:a.a对还是错?,小结,2、静态链表(非动态内存)1)链表结点类型声明 struct A1 int a; char b; A1 *next; ; A1 *head;2)声明链表结点变量 A1 a, b;,3)a, b构成链 head= ,小结,3、结构体作函参1) 形参:结构体变量定义(函数体内使用成员运算符.) 实参:结构体变量(已经有值) 所有成员传值, 不共占内存,结果不能返回。2) 形参:结构体指针定义(函数内使用-运算符) 实参:&结构体变量(结构体首地址) (已经有值) 传值, 不共占内存,有要求:函数体内改变指向变量值 改变的是实参成员, 结果能返回。3) 形参:结构体别名(引用)定义 (函数内使用别名和成员运算符.) 实参:结构体变量(已经有值) 传址, 共占内存。改变实参内存空间, 结果能返回。,小结,4、new和delete1) int *p; p=new int; cin*p;coutp; delete p;,小结: (重要),5、开辟释放结构体动态内存1)结构体类型: struct Student string name; int num; char sex; ;2)定义结构体类型指针变量: Student *p; /第一步,定义指针3)开辟动态内存: p=new Student; /第二步,指向确定4)操作数据: p-name=Wang Fun; coutname; /第三步,使用指向成员 5)释放内存: delete p;,问:p内存何时释放?,小结: (重要),6、开辟释放链表结点动态内存1)链表结点类型: struct Student string name; int num; Student *next; ;2)定义结构体类型指针变量: Student *head; /第一步,定义指针3)开辟动态内存: head=new Student; /第二步,指向确定4)操作数据: head-name=Wang Fun; coutname; /第三步,使用指向成员 5)释放内存: delete head;,问:head内存何时释放?,小结,变量第一次赋值的方法:1)初始化(声明部分) int a1=3; int a2=1,2; char c1=a; char c2=ab; char *c3=ab; string str=ab; int *p=3)cin输入(执行部分),小结,错误的情况1)初始化(声明部分) struct Student string name; int num; s=Li,1001;/错误2)赋值语句赋初值(执行部分) char c280; c2=ab; c2=ab; c280=ab; /错误 正确:strcpy(c2,ab);3)cin输入(执行部分) char *c; cinc; /错误,纠错:struct Student string name; int num; ;=Li;/或者cins.num=1001; /或者cin,正确:char c180,*c; c=c1; cinc;,练习:,1、下列正确的单向链表结点的类型定义是:_。A)struct Student string name; int num; ;B)struct Student string name; int num; int *next; ;答案:D,C)struct Student string name; int num; Student next; ;D)struct Student string name; int num; Student *next; ;,练习:,2、下列程序运行结果。 #include#includeusing namespace std;struct Student int num; string name; ;,void main()void fun1(Student);Student stu;stu.num=1001;=Li;fun1(stu);endl;void fun1(Student stu)stu.num=1002;=Wang;,运行结果:1001Li,练习:,3、下列程序运行结果。 #include#includeusing namespace std;struct Student int num; char name80; ;,void main()void fun1(Student *);Student stu;stu.num=1001;strcpy(,Li);fun1(,运行结果:1002Wang,练习:,4、下列程序运行结果。 #include#includeusing namespace std;struct Student int num; char name80; ;,void main()void fun1(Student ,运行结果:1002Wang,练习:,5、结构体类型定义如下: struct Student string name; int num; ;下列正确的开辟释放结构体动态内存的是:_。A) new Student; delete Student;B) Student *p; new Student; delete p;答案:D,C) Student *p; p= new Student; delete p;D) Student *p; p=new Student; delete p;,1、有时需要使几种不同类型的变量存放到同一段内存单元中。例:可把一个整型变量、一个字符型变量、一个双精度型变量放在同一个地址开始的内存单元中。,7.2 共用体 7.2.1 共用体的概念,2、这种使几个不同的变量共占同一段内存的结构, 称为共用体(union)类型的结构(或联合类型)。3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB34T5460-2026景区自导式解说服务规范
- 第66套讲解课件
- 第五单元面积课件
- 初中政治做题方法课件
- 2026‑2031年中国松木行业市场调查研究及发展前景预测报告
- 成长主题内容课件
- 辽宁大连市部分学校2026-2027学年八年级上学期10月月考历史试题(含答案)
- 成长足迹工作课件
- 初中英语游戏课件
- 智能家电智能物流配送系统分析方案
- 高三试卷:北京市海淀区2024-2025学年高三上学期期中考试2025届北京海淀区高三期中物理试题及答案
- 品牌策划考试题库及答案
- 2025年事业单位笔试-广西-广西财务(医疗招聘)历年参考题库含答案解析(5套)
- 2013-2022北京高中合格考化学汇编:海水中的重要元素-钠和氯
- 李子奈 计量经济学 课后答案
- 教育管理学陈孝彬
- 2024年09月江苏2024年江苏农商行省联社校园招考笔试历年参考题库附带答案详解
- 生殖医院管理制度内容
- 白内障手术巡回配合要点
- 第一章~三章 综合 检测试卷2023-2024学年北师大版数学七年级上册
- 第四章-国防动员
评论
0/150
提交评论