c++-幻灯片第六章

上传人:F****n 文档编号:88130976 上传时间:2019-04-19 格式:PPT 页数:77 大小:152.50KB
返回 下载 相关 举报
c++-幻灯片第六章_第1页
第1页 / 共77页
c++-幻灯片第六章_第2页
第2页 / 共77页
c++-幻灯片第六章_第3页
第3页 / 共77页
c++-幻灯片第六章_第4页
第4页 / 共77页
c++-幻灯片第六章_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《c++-幻灯片第六章》由会员分享,可在线阅读,更多相关《c++-幻灯片第六章(77页珍藏版)》请在金锄头文库上搜索。

1、第六章,结构体与简单链表,6.1 结构体 6.2 链表概念 6.3 链表的基本操作 6.4 链表的复杂操作,6.1 结构体,结构体是一种导出数据类型,它由若干个数据项组成,每个数据项可以是基本数据类型,也可以是导出数据类型。在现实生活中,有时需解决某种问题:如对学生的基本信息进行处理(查找、排序等)。,学号 姓名 C+成绩,图6-1学生基本信息,6.1.1 结构体类型的定义 定义一个结构体类型的一般形式为: struct 结构体名 成员表列 ; 图6-1学生基本信息可以定义成如下结构体类型。 struct student int num; char name20; float CPPscore

2、; ;,注:struct是关键字 ;num、name、CPPscore等不同类型的数据项;student 是一个类型名;最后的分号不能省略。,6.1.2结构体类型变量的定义 定义结构体类型的变量,有以下三种方法: 1.先声明结构体类型再定义变量名 例如: student student1,student2; student是在6.1.1中定义好的结构体类型,student1和student2就是两个用户自己定义的student结构体类型的变量。,2.在声明类型的同时定义变量 例如:struct day int hour; int minute; int second; d1,d2; 定义了两个

3、day 类型的变量d1、d2。,3.直接定义结构体类型变量 例如:struct int num; char sex; s1,s2; 在定义了结构体类型的变量后,系统会为它分配内存单元。其所占存储空间的大小为各个成员所占内存单元之和。例如student1和student2在内存中各占28byte(4+20+4=28),结构体变量是一个整体,要访问其数据成员,要用成员运算符“”指定该成员属于哪个变量。 对结构体变量进行初始化有以下几种常用的方法: 1. 在定义时进行初始化 struct student int num; char name20; char sex; float CPPscore;

4、sd1=40301,”YangKe”,M,89.5;,6.1.3结构体类型变量的初始化与引用,2.用对象流cin进行初始化 cinsd1.numsd1.namesd1.sexsd1.CPPscore; 3.使用赋值语句进行初始化 sd1.num=40301; sd1.name=” YangKe”; /错误 sd1.sex=M; sd1.CPPscore=89.5;,结构体变量的引用应遵循以下规则: 1.不能将一个结构体变量作为一个整体进行输入输出。 例如:cinsd1; /错误 2.允许将一个结构体变量直接赋值给另一个具有相同类型的结构体变量。 例如:student sd2; sd2=sd1;

5、 则变量sd2的各个成员变量与 sd1的成员变量具有相同的值。sd2.num的值也为40301。,若有定义: struct int num; char sex; s1=40301,M; struct int num; char sex; s2; 此时s2=s1;是错误的。s1,s2属于两个不同的结构体类型的变量。,3.对成员变量可以像普通变量一样进行各种运算(依成员变量的类型而定)。 例如:char a20; strcpy(a, sd1.name); sd1.CPPscore+; 注意:结构体成员可以是另一个结构体类型的变量(见下例)。,struct date int month; int d

6、ay; int year; struct student int num; char name20; date birthday; student1; student类型中的birthday成员就是一个date结构体类型的变量。 如果某成员本身又是一个结构体类型,则只能通过多级的分量运算,对最低一级的成员进行引用。 格式为:结构体变量.成员.子成员. .最低级子成员 如:引用结构体变量student1中的birthday成员: student1.birthday.year,student1.birthday.month,6.1.4指向结构体变量的指针,一个结构体变量的指针就是给该变量所分配内存

7、段的起始地址。可以定义一个指针变量,用来指向一个结构体变量。此时该指针变量的值就是结构体变量的起始地址。 下面通过一个例子来说明指向结构体变量的指针变量的使用。,例6-1 指向结构体变量的指针变量的使用 # include “iostream.h” # include “string.h” void main( ) struct student /声明了 student结构体类型 long int num; char name20; char sex; float CPPscore; ;,student stu_1; /定义了student类型的变量 stu_1 student *p; /p是

8、指向结构体student类型的指针变量 p=,coutnumnamesexCPPscoreendl ; ,程序解读: (1)成员变量name是个字符数组,给它赋值时要用字符串拷贝函数。strcpy(stu_1.name,” YangKe”);而不能用赋值运算符。stu_1.name=” YangKe”; (2)以下三种形式等价: 结构体变量.成员名 (*p).成员名 p-成员名,注意:结构体的成员不能是自身的结构体变量,但可以是指向自身的结构体类型的指针变量。 例如: struct node long int num; float CPPscore; node *next; / next是指向

9、node的指针变量 node m; /错误 ;,运行结果: NO:40301 name: YangKe sex:M CPPscore:89.5 NO:40301 name: YangKe sex:M CPPscore:89.5 NO:40301 name: YangKe sex:M CPPscore:89.5,6.1.5 结构体数组,结构体数组的定义方法和结构体变量相似,只需说明它为数组类型即可。 struct stu int num; char *name; char sex; float score; boy5; 以上示例定义了一个结构体数组boy,共有5个数组元素,boy0boy4。每个

10、数组元素都具有stu的结构形式,都是一个结构体类型的变量。,对结构体数组可以作初始化赋值,例如: struct stu int num; char *name; char sex; float score; boy5=101,“Li ping“,M,45, 102,“Zhang ping“,M,62.5, 103,“He fang“,F,92.5, 104,“Cheng ling“,F,87, 105,“Wang ming“,M,58 ;,注意: 1.可将一个结构体数组元素赋值给同一个结构体类型数组中的另一个元素或赋给同一类型的变量。 例如:boy2=boy0; stu aa; aa=stu0

11、; 2.不能把结构体数组元素作为一个整体直接进行输入输出,只能对单个成员进行输入输出。 例如:cin boy2;/wrong cinboy0.sex;/right,6.1.6用结构体变量作函数参数,结构体类型变量可作为函数的参数,函数返回值的类型也可为结构体类型。 当函数的形参与实参为结构体类型的变量时,这种结合方式属于值调用方式,即属于值传递。要求实参与相应的形参必须是同一类型的结构体变量。,例6-2 结构体类型变量作为函数的参数 #include struct sint m; float x; void swap(s s1,s s2) s t; t=s1,s1=s2, s2=t; /变量值

12、的交换 s fun(s s1,s s2) s t; t.m=s1.m+s2.m; t.x=s1.x+s2.x; return t; ,void main() s r1=100,200,r2=300,400; swap(r1,r2); coutr1.mtr2.mendl; s y; y=fun(r1,r2); cout“y.m=”y.mt”y.x=”y.x; ,运行结果:300 y.m=400 y.x=600,程序解读: (1)swap函数中形参s1和s2是结构体s类型的变量。 (2)因为形参与实参之间参数的传递方式属于值传递,因此swap函数中形参s1和s2的值进行了交换,但并没有影响到实参r

13、1和r2的值。所以r1.m依然等于100。 (3)fun函数的返回值类型为结构体类型,即s类型。函数的功能是分别求出两个结构体类型变量中对应的成员变量的和,即s1.m+s2.m;和s1.x+s2.x;求出的和存放在局部结构体变量t中。函数返回t的值。,例6-3 建立一个学生档案的结构体数组,描述一个学生的信息:姓名,年龄,C+成绩,并输出已建的学生档案。 算法: (1)定义一个描述学生信息的结构体类型。 (2)通过输入语句cin输入某个学生的信息。 (3)处理多个学生信息时,因为已经限定学生信息都一致,所以定义一个结构体类型的数组,对每个数组元素进行输入、输出的处理。,#include str

14、uct stu char name8; int age; float cscore; ; stu input(stu x) cinx.namex.agex.cscore ; return x; void output(stu x) cout x.nametx.age“t“x.cscoreendl ;,void main() stu s5; cout“请输入5个学生的信息:n“; cout“姓名 年龄 C语言分数n“; for(int I=0;I5;I+) sI=input(sI); cout“姓名 年龄 C语言分数n“; for( I=0;I5;I+) output(sI); ,调试与运行:

15、请输入5个学生的信息: “姓名 年龄 C语言分数 李易 18 89 王华 19 78 苏三 20 67 李朋 17 90 张辉 18 88 “姓名 年龄 C语言分数 李易 18 89 王华 19 78 苏三 20 67 李朋 17 90 张辉 18 88,程序解读: (1)该程序中学生信息的输入、输出是用函数完成的。input函数对形参x的成员变量赋值。通过函数返回x的值。在主函数中,用赋值语句接收返回值。即sI=input(sI);完成对结构体数组元素的赋初值。 (2)程序中要处理多个学生的信息,注意输入、输出格式。,6.2 链表概念,6.2.1 遍历结构体变量 定义一个结构体类型,该结构体的成员中包含一个指向自身的结构体类型的指针变量。这样就可以实现随机分布的结构体变量的遍历。 定义一个简单的结构体,如下: struct node long int num; float CPPscore; node *next; ;,node1,node2,node3,node4,num,score,next,如图6.2所示num成员含有结构体中的实际数据信息,next成员是指向另一个node的指针变量。这种结构体变量,我们称为结点。通过每个结点的next

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号