引用、结构体和共同体.ppt_第1页
引用、结构体和共同体.ppt_第2页
引用、结构体和共同体.ppt_第3页
引用、结构体和共同体.ppt_第4页
引用、结构体和共同体.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章 引用、结构体和共同体 教学内容 7.1 引用 7.2 结构体 7.3 共同体 7.4 用typedef声明类型 1 7.1 引用什么是变量的引用 对一个数据可以使用“引用”,这是C+对C的一个 重要补充。引用是一种新的变量类型,它的作用是 为一个变量起一个别名。假如有一个变量a,想给 它起一个别名b,可以这样写: 以上语句声明了b是a的引用,即b是a的别名。经过 这样的声明后,a和b的作用相同,都代表同一变量 。 2 7.1 引用引用的简单使用 【例7-1】 引用和变量的关系。 #include #include using namespace std; int main() int a = 10; int /声明b是a的引用 a = a * a;/a的值变化了,b的值也应一起变化 cout (结果为5,3) /using namespace std; int main() void swap(int int i = 3, j= 5; swap(i, j); cout using namespace std; int main() void sort(int /函数声明,形参是引用类型 int a, b, c; /a,b,c是需排序的变量 int a1, b1, c1; /a1,b1,c1最终的值是已排好序的数列 cout a b c; /输入a,b,c a1 =a; b1 =b; c1 = c; sort(a1, b1, c1); /调用sort函数,以a1,b1,c1为实参 cout j) change(i, j); /使i k) change(i, k); /使 i k) change(j, k); /使 j float temp; float fn1(float r) temp = r*r*3.14; return temp; float return temp; 【例7-6】 有关引用返回的4种形式。 运行结果为: 78.5 78.5 78.5 78.5 void main() float a = fn1(5.0); /1 float /2:warning float c = fn2(5.0); /3 float /4 cout using namespace std; float temp = r*r*3.14; return temp; void main() fn2(5.0) = 12.4; /警告错误:返回的是局部作用域内的变量 cout /using namespace std; double* fn(const double *pd) static double ad = 32; ad += *pd; cout double ad += pd; cout struct Person char name20; unsigned long id; float salary; ; Person alone4 = “jone“, 12345, 339.0, “david“, 13916 , 449.0, “marit“, 27519, 311.0, “jasen“, 42876, 623.0; void main() Person temp; for(int i = 1; i alonej+1.salary) temp = allonej; allonej = allonej+1; alonej+1 = allonej; for(int k = 0; k struct Person char name20; unsigned long id; float salary; ; void Print(Person pr) cout struct Person char name20; unsigned long id; float salary; ; void Print(Person char name20; float score; struct student *next; ; 7.2.2静态链表 25 void main() struct student a=10011,“zhangsan“,592, b=10012,“lisi“,581, c=10013,“wangwu“,656; struct student *head,*p; head= a.next= b.next= c.next=NULL; for(p=head;p!=NULL;p=p-next) coutnumnamescore; 26 7.2.3.1 动态存储分配函数 与静态链表不同,动态链表可以动态地分配存储,即在程 序运行过程中根据需要动态地开辟新结点。常用的动态内 存分配函数有以下三个。使用这些函数,应将头文件 “stdlib.h”或“malloc.h”包含到程序中。 (1)malloc函数 函数原型:void *malloc(unsigned size); 功能:在内存的动态存储区中分配size字节的连续空间。 返回值为所分配存储区的起始地址,分配不成功则返回 NULL。 【例如】 char *p; p=(char *)malloc(8); 【说明】分配8字节的连续存储空间,并转换为字符类型。 p代表首地址。 7.2.3 动态链表 27 【注意】函数返回值为void指针类型,使用时要用强制类型转 换将其转换成所需数据类型。如以下程序片断利用动态内存分 配函数建立一个长度事先不确定的浮点型数组: int n,i; float *a; scanf(“%d”, a=(float *)malloc(n*sizeof(float); for(i=0;i #include struct student *create(int n) struct student *head=NULL,*p1,*p2; int i; for(i=1;inum, p1-next=NULL; if(i=1) head=p1; else p2-next=p1; p2=p1; return(head); 【例10.7】编写函数建立动态链表,结点个数作函数形参 ,返回链表头指针。 32 (2)动态链表的输出 先让指针变量p指向第一个结点,输出该结点的值;然后后移 一个结点,再输出;如此重复,直到表尾结点。 图为链表输出示意图(p代表指针p后移一个结点 后指向的位置,p”代表后移两个结点后的位置) head 33 【例10.8】编写函数输出动态链表。 程序的算法描述如图10.16所示: #include void print(struct student *head) struct student *p=head; while(p!=NULL) printf(“学号:%d 成绩:%3fn“,p-num, p-score); p=p-next; 34 图10.17 删除结点C示意图 (3)动态链表结点的删除 要删除一个结点,只需从第一个结点出发沿链表 搜索,找到待删除结点后,修改该结点前驱结点 的指针域,使其指向待删除结点的后继结点即可 35 图10.18 删除指定学号的链表结点 输 出 原 表 为 空 Y N Y N NY 【例10.9】编写函数删除指定学号的学生结点,以头指针 和学号作参数。 【注意】程序中只是 将结点从链表中删除 ,该结点所占用的内 存由系统在程序执行 完毕后释放。也可以 调用free()函数在 程序执行过程中动态 释放内存。考虑如何 实现? 【思考】函数的返回 值类型能否为空? 36 #include struct student *del(struct student *head,int num) struct student *p1,*p2; if(head=NULL) printf(“原表为空!n“);return(NULL); else p1=head; while(p1-num!=nump1=p1-next; if(p1-num=num) if(p1=head)head=p1-next; else p2-next=p1-next; printf(“学号为%d的学生已被删除n“,num); else printf(“学号为%d的学生不存在n“,num); return(head); 37 (4)动态链表结点的插入 将结点插入到链表的指定位置,比如将图10.19中结点b插入 到结点a与结点c之间,只需修改结点b指针域的值,使其指向 结点c;然后令结点a的指针指向结点b。如此以来,原链表中 由结点a到结点c的链接被断开,结点b被插入到链表中。 38 Y N Y Y N N 图10.20 在有序动态链表中插入结点 【例10.10】设链表中各结点按学号由小到大排列,编 写函数插入一个新结点,使链表仍按原顺序排列。 39 #include struct student *insert(struct student *head, struct student *stud) struct student *p0,*p1,*p2; p1=head;p0=stud; if(head=NULL) head=p0;p0-next=NULL; else while(p0-nump1-num) p1=p1-next; if(p0-numnum) if(head=p1)head=p0; else p2-next=p0; p0-next=p1; else p1-next=p0; p0-next=NULL; return(head); 40 (5)动态链表的综合操作 【例10.11】在主函数中调用上述子函数实现链表的建立 、输入、输出、删除及插入。 41 #include #include void main() struct student *head,*stud; int n,k; printf(“请输入学生个数:n“);scanf(“%d“, printf(“请按学号输入各学生的信息:n“); head=create(n); printf(“原链表为:n“);print(head); printf(“输入要删除学生的学号:n“);scanf(“%d“, head=del(head,k); printf(“删除后链表为:n“);print(head); stud=(struct student*)malloc(sizeof(struct student); printf(“输入欲插入学生的学号及成绩n“); scanf(“%d%f“, head=insert(head,stud); printf(“插入后链表为:n“);print(head); 【思考】修改程序使得插入或者删除的结点个数可变。 42 7.2 结结构体动态分配和撤销内存的运算符 C+提供了较简便而功能较强的运算符new和delete来取 代malloc和free函数。注意new和delete是运算符,不是 函数,因此执行效率高。虽然为了与C语言兼容,C+仍 保留malloc和free函数,但建议用户不要使用,而用new 和delete运算符。new运算符的例子: 43 【例7-13】 开辟空间以存放一个结构体变量。 #include #include using namespace std; struct Student/声明结构体类型Student string name;int num; char sex; ; int main() Student *p;/定义指向结构体类型Student的数据的指针变量 p = new Student; /用new运算符开辟一个存放Student型数据的空间 p-name = “Wang Fun“; /向结构体变量的成员赋值 p-num = 10123; p-sex = m;/输出各成员的值 cout name num sex endl; delete p; /撤销该空间 return 0; 44 7.3 共用体共用体的概念 有时需要将几种不同类型的变量存放到同一段内 存单元中。例如,可把一个整型变量、一个字符 型变量、一个双精度型变量放在同一个地址开始 的内存单元中(见图)。 45 7.3 共用体对共用体变量的访问方式 不能引用共用体变量,而只能引用共用体变量中 的成员。例如,下面的引用方式是正确的: a.i(引用共用体变量中的整型成员i) a.ch(引用共用体变量中的字符型成员ch) a.f(引用共用体变量中的双精度型成员d) 不能只引用共用体变量。 例如: cout a;是错误的,应该写成“cout a.i;”或“cout a.ch;”等。 46 7.3共用体共用体类型数据的特点 共用体类型数据的特点如下: (1)使用共用体变量的目的是希望用同一个内存段存放 几种不同类型的数据。但请注意在每一瞬时只能存放其 中一种,而不是同时存放几种。 (2)能够访问的是共用体变量中最后一次被赋值的成员 ,在对一个新的成员赋值后原有的成员就失去作用。 (3)共用体变量的地址和它各成员地址都是同一地址。 (4)不能对共用体变量名赋值;不能企图引用变量名来 得到一个值;不能在定义共用体变量时对它初始化;不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论