1、结构的定义 一、数据类型 内定义:系统中内定义的数据类型,系统为它们规定了相应的取值范围和操作,在程序中可以直接使用。 自定义:类型使用之前必须先进行定义,用户自定义该类型的数据成员和函数成员。(结构、联合、类),二、结构类型的定义格式: struct 结构类型名 成员定义1成员定义2成员定义n ;,例:struct Person char name10bool sex;int age;float pay; ;,三、结构使用说明 1、结构的成员类型 可以是除自身以外的任何已有类型。 可以是任何已有类型的指针类型。 2、结构类型的作用域 定义在函数外:具有全局作用域 定义在 内:具有局部作用域
2、3、程序中同一作用域内不能有重复的类型名。 4、同一结构类型定义中,不能有相同的成员名。,5、不完整定义: struct 结构类型名 例:struct BB; struct AA char a; BBb; struct BB int b; AA a; 若一个结构类型在定义之前使用,则应在使用前加上它的不完整定义。,结构变量的定义和初始化 一、用结构类型名定义变量 struct结构类型名 变量名=初始化数据|同类型变量名,; 1、struct可写可不写。 2、初始化数据由所有的成员值构成。(若有成员值缺省,则自动置0) 3、|表示前后两项任选其一。,例:struct Arith char op;
3、 int a,b; int xx=40; 则:Arith x,y; Arith z1= + ,10,xx, z2= ,60, z3=z1; Arithd=,二、定义结构类型的同时定义变量 struct 结构类型名 成员定义1成员定义2成员定义n 变量名=初始化数据|同类型变量名,;,例:struct AAA char s20;int top; a1=”Microsoft ”,0, a2=a1, a3, ap;,三、定义无名结构类型的同时定义变量 struct 成员定义1成员定义2成员定义n 变量名=初始化数据|同类型变量名,;,例:struct BBB char name10;structin
4、t yy,mm,dd;birth; bx=” xxk ”,55,3,27;,四、结构类型的大小 结构类型的大小等于它所有数据成员的大 小之和。 例:struct Arith char op; int a,b; 则Arith的大小为: sizeof(Arith)=sizeof(char)+sizeof(int)+ sizeof(int)=1+4+4=9 个字节 注:所有的指针都占4个字节。,五、动态结构变量和动态结构数组的创建和删除 例:Arithp=new Arith;Aritha=new Arithn;delete p;delete a;,结构成员的访问操作 一、赋值(=) 1、=两边为同类
5、型的结构变量,将右边变量的值赋给左边的变量。 2、=可以连续使用,且结合性为从右向左。 例:struct Arith char op; int a,b; Arith z1= + ,10,40, z2, z3; 则:z2=z1; z3=z1; z3=z2=z1;,二、直接访问(.) 直接访问操作符的左边是一个结构变量, 右边是该结构变量中的一个成员。 例:struct Arithchar op; int a,b; Arith z1= + ,10,40; Arith a2= + ,3,7, - ,10,5; 则有:z1.op= + , z1.a=10, z1.b=40a1.op= - , a1.a
6、=10, a1.b=5,三、间接访问()间接访问操作符的左边是一个结构指针变量,右边是该结构指针变量所指结构中的一个成员。 例:struct Arith char op; int a,b; Arith z1= + ,10,xx; Arithd= 则:d op= + , d .a=10, d .b=40 指针成员名 (指针).成员名 如: d op=(d).op=z1.op,设计一个存储人员记录的结构类型person,要存储人员的姓名、性别、年龄以及工资信息。,struct personchar name10;bool isMale;int age;float pay; ;,设计一程序,输入若干
7、人员记录并保存在一个结构数组中,然后输出这些人员的记录信息。,#include #include #define MaxPersons 10,struct personchar name10;bool isMale;int age;float pay; ;,person aMaxPersons;,void input(int n) int i,k;person x;for(i=0;ix.name;cink;x.isMale=(k!=0);cinx.agex.pay;ai=x; ,void output(int n) for(int i=0;in;i+) coutai.name ;cout(ai
8、.isMale?”男”:”女”) ;coutai.age ai.payendl; ,void main() int n;cinn;input(n);output(n); ,结构与函数 一、结构作为函数的参数。二、函数的返回值为结构。,例:从保存有学生记录的结构数组中查找一个给定学号的记录,若能找到,返回指向该记录的指针以示查找成功,否则返回空指针以示查找失败。,结构是一种类型,它能够使用在允许简单类型使用的所有地方,当然也允许作为函数的参数类型和返回值类型。,Struct Student /学生记录结构Char num8; /学号Char name10; /姓名 Short grade; /成
9、绩 ;,定义学生记录结构:,Student * search(Student s, int n, const Student /未找到,返回空指针0(或使用符号 常量NULL) ,void output(Student *s, int n) cout.setf(ios:left);for(int i=0;in;i+) couti setw(8)si.numsetw(12)si.name;coutsetw(5)si.gradeendl;coutendl;,void main() Student a5=“ch231”,”王广敏”,69,“ec115”,” 刘文”,82,“dt327”,”古明”,7
10、2,“cs102”,”张平”,78,“bx214”,”张文远”,65;int n=5;Student x, *p;coutx.num;,p=search(a,n,x); if(p)coutnumnamegradeendlendl; else cout“没找到学号为”x.num“的 记录”endl; output(a,n); ,假定要查找的学号为bx214,则程序输入和运行结果如下:,请输入一个待查学生的学号:bx214,bx214 张文远 65,结构与链表 一、一种特殊的结构类型 含有数据域和一个指向自身结构的指针域。 例:struct IntNode int data; /结点的值域IntN
11、odenext; /结点的指针域 这种类型的变量称为结点。,二、链表 通过指针域next使若干个结点依次链接起来形成链表。 例:四个IntNode类型的结点,其值分别为 48,56,72和83。构成的链表如下:,48,56,72,83,f,1、表头指针、表头结点、表尾结点、前驱结点、后继结点 2、链表中的结点通常是使用new操作符动态分配产生的,当不需要这些结点时,应用delete将其释放,收回结点所占用的空间。 三、链表的有关操作1、new2、delete,设计并测试以下函数: 1、void create(IntNode *释放链表f所占用的动态空间,void create(IntNode
12、*,for(int i=1;ix;p-next=new IntNode;p=p-next;p-data=x;p-next=NULL; ,void create1(IntNode * ,void traverse(IntNode *f) while(f) coutdatanext; coutendl; ,void deletelist(IntNode *f) while(f) IntNode *p=f;f=f-next;delete p; ,void main() IntNode *head1=NULL, *head2=0;int n;coutn;create(head1,n);traverse
13、(head1);create1(head2,n);traverse(head2);deletelist(head1);deletelist(head2); ,结构与操作符重载 一、操作符重载对操作符进行重新定义,使其适用于特定类型的变量。 二、操作符重载函数的定义格式 单目操作符重载函数的定义格式: 返回类型 operator单目操作符(一个用户类型 参数说明)函数体 双目操作符重载函数的定义格式: 返回类型 operator双目操作符(第一参数说明,第二参数说明)函数体,三、操作符重载函数的调用格式 单目操作符重载函数的调用格式: 单目操作符 实参 operator单目操作符(实参) 双目操
14、作符重载函数的调用格式: 第一个实参 双目操作符 第二个实参 operator双目操作符(第一个实参,第二个实参),struct Studentchar name15;/姓名char sex; /性别float score; /成绩;,bool operator(Student & r1,Student & r2) if (r1.scorer2.score)return true;elsereturn false:,void main() Student a4“abc”,m,420,“def“,f,638; “ghi”,m,560, “jkl“,f,375;Student xa0;for(in
15、t i1;iai) xai;coutx.name x.sex x.scoreendl; ,联合 一、结构与联合的比较: struct stype char ch;int gr;intpt;double db; ;,union utype char ch;int gr;intpt;double db; ;,相同点: 1、都是用户自定义的数据类型,由若干个数据成员组成。 2、类型的定义格式相似。 3、变量的定义格式相似。 如:stype x; utype y; 4、成员的访问相似 如:utype y; utypep= 则:y.ch, y.gr, y.pt, y.dbpch, pgr, ppt, p
16、db,不同点: 1、变量的初始化不同:结构变量中可对每个数据成员进行初始化。联合变量中只允许对第一个数据成员进行 初始化。 2、存储空间不同:结构变量中为所有的数据成员分配存储空间。联合变量中只为最大的数据成员分配存储空间。,3、有效性不同: 任一时刻,结构中的所有成员都是有效的。 任一时刻,联合中只有一个成员是有效的。 4、大小不同 结构的大小为各数据成员的大小之和。 联合的大小为所有数据成员的最大值。 如:sizeof(stype)=1+4+4+8=17个字节sizeof(utype)=max(1,4,4,8)=8个字节,二、匿名联合 类型定义中既没有类型名又没有变量。 例:struct ABC char ch;union int ia; float fa;ABCpa;x, px=,1、匿名联合通常被定义在一个结构或类 类型的内部,联合中的成员直接作为所在结构或类中的成员使用,但任一时刻只有一个有效。 2、ABC中包含三个成员:ch,ia,pa或ch,fa,pa 3、sizeof(ABC)=1+4+4=9个字节,