240 likes | 370 Views
结构与联合. 内容提要:. 1 、结构的基本概念 2 、结构的定义与初始化 3 、结构成员的访问 4 、结构指针 5 、联合的定义与使用. 结构. 引入课题: 结构是一种用户自定义类型, C++ 中的内定义数据类型只能用来描述简单类型,对于包含一个或多个数据项,各数据项具有相同或不同的类型,必须要用户自定义类型,结构类型能够胜任。 在 C++ 中 结构 ( structure )与类几乎是完全一样的类型,差别仅仅在于默认情况下结构的成员为公有的。 一、结构的定义格式 : struct 结构类型名 { 成员定义 1 ; 成员定义 2 ;
E N D
结构与联合 内容提要: 1、结构的基本概念 2、结构的定义与初始化 3、结构成员的访问 4、结构指针 5、联合的定义与使用
结构 引入课题: 结构是一种用户自定义类型, C++中的内定义数据类型只能用来描述简单类型,对于包含一个或多个数据项,各数据项具有相同或不同的类型,必须要用户自定义类型,结构类型能够胜任。 在C++中结构(structure)与类几乎是完全一样的类型,差别仅仅在于默认情况下结构的成员为公有的。 一、结构的定义格式: struct 结构类型名{ 成员定义1; 成员定义2; }; //最后的分号不可少
结构 定义格式实例: struct inventory { //库存货物 char description[15] ; //货物名称 char no[10] ; //货号 int quantity ; //库存数量 double cost ; //成本 double retail ; } ; //零售价格 struct employee{ //员工 char name[27] ; //员工姓名 char address[30] ; //家庭住址 long int zip ; //邮政编码 long int telenum ; //联络电话 double salary ; }; //工资
结构 二、变量定义与初始化: 结构是一种派生数据类型,定义结构时并不分配存储空间,只有定义了结构类型的变量,编译系统才为结构变量分配存储空间。定义变量方法如下: inventory car , motor ; 初始化是用花括号中顺序填入结构中的(公有数据)成员的初始值完成的: employee emp1={“李明”,“洪山路2号”,23500,3700666,2478.0}, emp2={“张俊”,“教育巷15号”,23500,3700389,1989.0}; 结构变量的访问与类一样,使用成员访问操作符,对成员进行访问: 格式:变量名 . 成员名
结构 说明: (1)同结构类型的变量之间也可以作为整体相互赋值(复制)。不能将一个结构体变量作为一个整体进行输入和输出,只能对结构体变量中的各个成员分别进行输入和输出。 cout<<student1; //错误 cout<<student1.num; //正确 (2)结构变量也可以作为函数的参数和返回值,结构作为参数可以按值(复制)进行传递的,也可以按引用传递。 (3)在程序文件中强烈推荐将结构类型的定义放在所有函数的外面,这样程序文件中的各个函数可以按需要在各个函数中声明局部的结构变量。在各函数中定义结构类型,即使两个函数中定义的完全一样,系统也完全认为是两种结构类型。
(4)结构可以嵌套: struct mail { char address[30] ; //地址 long int zip ; //邮政编码 long int telenum ; };//电话号码 structemployee { charname[25] ; //员工姓名 mail addinfo ; //结构作为成员,嵌套 double salary ; };//工资 注意:在使用时用若干个成员运算符,一级一级地找到最低一级的成员。
三、结构成员的访问 定义结构变量之后就可以利用它存取数据,系统对结构变量提供的运算符有: . 直接指定成员 ->间接指定成员 = 赋值
直接指定成员:左边是结构变量,右边是结构变量中的一个成员,运算结果是结构变量中的成员变量。直接指定成员:左边是结构变量,右边是结构变量中的一个成员,运算结果是结构变量中的成员变量。 间接指定成员:左边是结构指针变量,右边是结构指针变量所指结构中的一个成员,运算结果是指针变量所指结构中的一个成员变量。 赋值:两边为同类型的变量,把右边变量的值拷贝到左边的变量中。可以连续使用。 对结构体变量的成员可以像普通变量一样进行各种运算。 可以引用结构体变量成员的地址,也可以引用结构体变量的地址。
struct Student { int num; char name[20]; char sex; int age; Date birthday; char addr[30]; }student1,student2={10002,″Wang Li″, ′f′,5,23,1982,89.5}; #include <iostream> using namespace std; struct Date { int month; int day; int year; };
int main( ) • { student1=student2; • cout<<student1.num<<endl; //输出student1中的num成员的值 • cout<<student1.name<<endl; //student1中的name成员的值 • cout<<student1.sex<<endl; //student1中的sex成员的值 • cout<<student1.birthday.month<<′/′<<student1.birthday.day<<′/′<<student1.birthday.year<<endl; • cout<<student1.score<<endl; • return 0; • } 运行结果如下: 10002 Wang Li f 5/23/1982 89.5
四、结构指针 一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。
例题:通过指向结构体变量的指针引用结构体变量中的成员例题:通过指向结构体变量的指针引用结构体变量中的成员 • Student stu; • Student *p=&stu; • stu.num=10301; • stu.name="Wang Fun"; • stu.sex=′f′; • stu.score=89.5; • cout<<stu. num<<" "<<stu.name<<" " • <<stu.sex<<" "<<stu.score<<endl; • cout<<(*p)>num<<" "<<(*p).name<<"" • <<(*p).sex<<" "<<(*p).score <<endl; • return 0; • } #include <iostream> #include <string> using namespace std; int main( ) { struct Student { int num; string name; char sex; float score; };
运行结果如下: 10301 Wang Fun f 89.5 10301 Wang Fun f 89.5 C++提供了指向结构体变量的运算符->,例如p->num表示指针p当前指向的结构体变量中的成员num。p->num 和(*p).num等价
例题:用结构体变量和指向结构体变量的指针构成数据结构链表例题:用结构体变量和指向结构体变量的指针构成数据结构链表 链表有一个“头指针”变量,图中以head表示,它存放一个地址。该地址指向一个元素。链表中的每一个元素称为“结点”,每个结点都应包括两个部分: 一是用户需要用的实际数据,二是下一个结点的地址。 链表是一种常见的重要的数据结构,最简单单向链表结构(如下图所示)
struct Student { int num;//实际数据1 float score;//实际数据2 Student *next; //存放下一结点地址的指针变量 }; 链表中各元素在内存中的存储单元可以是不连续的。要找某一元素,可以先找到上一个元素,根据它提供的下一元素地址找到下一个元素。因此利用结构体变量和指针来实现该数据结构。
每一个结点都属于Student类型,在它的成员next中存放下一个结点的地址。每一个结点都属于Student类型,在它的成员next中存放下一个结点的地址。
代码:#define NULL 0 #include <iostream> struct Student { long num; float score; struct 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=&a; //将结点a的起始地址赋给头指针head a.next=&b; //将结点b的起始地址赋给a结点的next成员 b.next=&c; c.next=NULL; //结点的next成员不存放其他结点地址 p=head; //使p指针指向a结点 do { cout<<p->num<<" "<<p->score<<endl; p=p->next; //使p指向下一个结点 } while(p!=NULL); //输出完c结点后p的值为NULL return 0;}
联合 一、联合的定义 union共同体名 { 类型 成员名1; 类型 成员名2; }; 联合与结构的区别是:结构的各成员同时被分配了各自独立的内存区,而联合的各个成员的存储的开始地址都相同,所以在任一时刻联合变量只能存储一个成员。 系统为联合变量分配空间时按需要最大存储量的成员大小分配内存空间。
二、应用: 对联合对象中成员的访问也有两种方式: . -> 结构与联合在变量初始化上有所不同,系统允许对结构中的每一个数据成员按照定义的次序进行初始化,但只允许对联合中的第一个数据成员进行初始化,不允许对其他数据成员初始化。
例题:使用联合举例 利用一个数组保存一个单位的职工记录,假定每个职工含有编号、姓名、性别、类别和职称五项数据,其中类别取整数:1、2、3之中的值,1表示干部级别,2表示教师级别,3表示工人级别。在干部类别中分为:“juji”、”chuji”、”keji”、”keyuan”四个职称。在教师类别中分:”jiaoshou”、”fujiaoshou”、”jiangshi”、”zhujiao”四个职称。 代码如下: struct worker { chatr num[6]; char name[12]; char sex; short kind; union{ char cadre[8];//干部职称 char techer[12]; short worker; }; };
void Input(worker a[],int n) { for(int i=0;i<n;i++) cout<<“please input no”<<i+1<<“recorder”<<endl; cing>>a[i].num>>a[i].sex>>a[i].kind; switch(a[i].kind) { case 1: cin>>a[i].cadre;break; case 2: cin>>a[i].teacher; break; case 3: cin>>a[i].worker; }}}
void output(worker a[],int n) { for(int i=0;i<n;i++) { cout<<sew(6)<<a[i].num; cout<<sew(6)<<a[i].name cout<<sew(6)<<a[i].sex cout<<sew(12; switch(a[i].kind) { case 1: cin>>a[i].cadre; break; case 2: cin>>a[i].teacher; break; case 3: cin>>a[i].worker; } cout<<endl; void cout(worder a[],int n) { int c1,c2,c3; c1=c2=c3=0; for(int i=0;i<n;i++) {switch(a[i].kind) { case 1: c1++; break; case 2: c2++; break; case 3: c3++;break; } cout<<“cadres:”<<c1<<endl; cout<<“teacher:”<<c2<<endl; cout<<“worker:”<<c3<<endl; }
void main() { int n=8; worker *a=new worker[n]; input(a,n); cout<<endl; output(a,n); cout<<endl; count(a,n); delete[]a;}