ImageVerifierCode 换一换
格式:PPT , 页数:45 ,大小:514KB ,
资源ID:5382698      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-5382698.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第7章 结构体与链表ppt.ppt)为本站会员(涵涵文库)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

第7章 结构体与链表ppt.ppt

1、第7章 结构体与链表,学习目的与要求:,理解并掌握结构体的定义和应用,掌握类型定义符typedef的使用方法,理解并掌握链表的定义与使用方法,了解共用体的定义及使用方法,了解枚举变量的使用方法,基本内容,结构体,结构体是程序员根据需要定义的一种数据类型。组成结构体的数据称为结构体的成员,这些成员来共同描述一个相关的对象。,struct structureNametype member1;type member2; ;,struct Personchar name20;char sex;int age;int height; ;,结构体,由于结构体是程序设计者声明的一种数据类型,是对具体实例的抽

2、象,所以在声明一个结构体时,不要实例化,即不要对成员赋初值。,struct Point int x=0; /error 无法存储x.int y=0; /error ;,结构体,结构体成员除基本数据类型外,还可为指针或结构体类型。,struct Dateint year;int month;int day; ; struct Person1char *name; /指针类型struct Date birthday; /结构体类型int height; ;,结构体类型变量的定义,(1)先定义结构体类型,再定义结构体变量。struct Person ps1,ps2; (2)在定义一个结构体类型的同时

3、,定义结构体变量。 struct Pointint x; pt; (3)直接定义结构体变量,省略结构体名称。 struct int x; pt;,结构体类型变量的定义,(1)结构体类型与结构体变量是两个不同的概念,只能对结构体变量赋值、存取或运算,但不能对结构体类型赋值、存取和运算。(2)在编译时,系统根据结构体所有成员的大小只对变量分配存储空间,而声明类型时不分配空间。(3)结构体类型中的成员名可以与程序中的变量名同名,但它们表示不同的对象。例如在结构体struct Person中的成员“age”与程序中的变量“age”名字相同,意义不同。,结构体成员的访问,结构体变量名.成员名,struc

4、t Point pt; pt.x=0; /给结构体变量pt的成员赋值 printf(“x=%n“, pt.x); /输出x的值,结构体成员的访问,例7-1 对一个人的信息(姓名和生日)进行操作。,解题思路:首先定义生日结构体类型,包括出生年、月、日,再定义“人”的结构体类型,包括姓名和生日。定义“人”结构体变量,对其进行赋值并输出。,#include #include struct Dateint year;int month;int day; ; struct Person1 char name20;struct Date birthday; ;,struct Person1 ps1=“Zh

5、ang“,1988,11,20,ps2; printf(“输入相关信息(姓名和出生年月日):n“); scanf(“%s“,ps1.name); /输入姓名 scanf(“%d%d%d“,结构体变量的初始化,(1)在声明结构体变量时,可以像数组一样对其进行初始化。,struct Person ps=“zhang“, m,20,180; struct Person ps=“zhang“;,(2)如果没有在声明时对结构体变量初始化,以后的赋值只能逐个成员进行。,struct Person ps1=“zhang“,m,20,180,ps2; ps2=“Gao“,f,19,168; /错误,不能对变量

6、整体赋值 strcpy(ps2.name,“Gao“); /正确 ps2.sex=f; /正确 ps2.age=19; /正确 ps2.height=168; /正确,结构体数组,由于结构体变量本身也是一种变量,因此可以定义结构体数组。结构体数组的每一个元素都具有相同的结构体类型。,struct Person ps2;,struct Person ps2=“Zhangwei“,m,20,180,“Lihong“,f,18,165;,结构体数组,例7-2 已知5个学生的成绩,找出成绩最优者和最差者。学生信息包括学号、姓名和成绩。,解题思路:定义一个学生(Student)结构体类型,然后定义一个大

7、小为5的学生结构体数组stu,通过扫描数组stu中的所有元素,找出最高者和最低者的成绩分别放在变量maxScore和minScore中。,struct Student int ID;char* name;float score; ; struct Student stu =101 ,“Zhang“,88.5,102,“Wang“,77.8,103,“Liu“,55.6, 104,“Li“,66.4, 105,“Sun“,99.7;,for(i=1;imaxScore) /查找最高分indexHigh=i;maxScore=stui.score;else if(stui.scoreminScor

8、e) /查找最低分indexLow=i;minScore=stui.score; ,指向结构体的指针,可以声明一个指向结构体类型的指针变量,用指针变量访问结构体的成员,此时要用指向运算符“-”代替成员运算符“.”。,struct Date dt,*dtPtr; /声明一个指向结构体类型的指针dtPtr dt.year=2013; /给结构体的成员赋值 dtPtr-month=12; /通过指向结构体的指针变量给成员赋值 (*dtPtr).day=28; /通过指向结构体的指针变量给成员赋值,(1)结构体变量.成员名 (2)(*结构体指针变量).成员名 (3)结构体指针变量-成员名,指向结构体的

9、指针,例7-3 计算平面上两点之间的距离。,解题思路:首先声明一个点结构体类型Point,成员为点的x,y坐标,然后定义2个结构体变量,最后计算两点之间的距离。,struct Pointint x;int y; ;,struct Point pt1,pt2,*p1,*p2; float dist, deltaX, deltaY; p1=,指向结构体的指针,例7-4 已定义了“人”结构体,找出3个人中身高最高者和他们的平均年龄。,struct Person char name20; char sex;int age;int height; ;,解题思路:首先定义一个结构体类型struct Per

10、son,并定义该类型的结构体数组ps。定义一个指向结构体的指针变量pt,将数组的首地址赋给指针变量。根据要求初始化数组。通过循环和指针变量的变化找出身高最高者并计算平均年龄,最后输出结果。,struct Person ps3=“zhang“,m,20,180,“Li“,f,18,165,“Gao“,m,19,183,*pt; int sum=0, index, maxH=0, i; /index记录最高者的下标 float aver; /平均年龄 pt=ps; /将数组的首地址赋给指针变量 printf(“姓名 性别 年龄 身高n“); for(i=0;iname,pt-sex,pt-age,

11、pt-height);sum+=pt-age; if(pt-heightmaxH) /求height的最大值index=i;maxH=pt-height;pt+; aver=(float)sum/3;,结构体与函数,声明一个函数原型,主要告知编译器函数的返回类型和形参类型及个数。既然结构体是一种类型,那么结构体可作为函数返回类型,也可作为形参类型。定义一个传值类型函数时,系统并未对形参开辟内存空间,只有在函数调用、实参传递给形参时,系统才为形参开辟内存,产生一个实参拷贝,形参与实参具有不同的内存地址。因结构体变量占据内存较大,若将该结构体作为函数参数,调用函数时,要产生较大的实参副本,调用函数

12、的开销较大。,结构体与函数,例7-5 编写函数求平面上两点间的距离。,解题思路:定义一个坐标“点”的结构体类型,定义一个求两点距离的函数distance,通过给定的平面上的两个点,调用函数distance,即可求得结果。,struct Pointint x;int y; ;,float distance(struct Point pt1, struct Point pt2) float deltaX, deltaY, dist; deltaX =pt1.x-pt2.x;deltaY =pt1.y-pt2.y;dist=sqrt(deltaX*deltaX+deltaY*deltaY);retu

13、rn dist; int main ()struct Point t1=0,1,t2=2,3;float d;d=distance(t1,t2);printf(“Distance is %fn“,d);return 0; ,结构体与函数,函数调用开销较大,效率低。若要减少调用函数时的开销,可用指向结构体类型的指针作为函数参数。在函数调用时,实参传递给形参的仅是实参变量的地址,形参并未产生一个结构体变量的拷贝,此时形参与实参共用同一地址。,float distance (struct Point *p1, struct Point *p2)float dX, dY, d;dX=p1-x-p2 -

14、x;dY=p1-y-p2-y;d=sqrt(dX*dX+dY*dY);return d;,结构体与函数,int main () struct Point pt1=0,1,pt2=2,3;float d=distance( ,在调用函数distance()时,因为内存并未为形参变量p1、p2开辟两个pt1、pt2的副本,p1共享pt1的地址,p2共享pt2的地址,因此函数调用效率较高。,基本内容,结构体与函数,C语言允许将已存在的基本数据类型和用户自定义的类型起一个别名,方法是使用关键字typedef。,typedef oldType newType;,typedef int INT; /将in

15、t起一个新名称INT INT i,j; /声明两个整型变量 typedef struct tagPointint x;int y; Point; /定义一个结构体类型Point Point pt1,pt2; /声明两个Point类型变量,基本内容,链表,链表是一种线性数据结构,仅有一个前驱结点和后继结点。链表长度无需事先确定,并且插入、删除结点等操作简单,因而具有广泛的应用。链表由结点组成,一个结点包括两部分,一部分是用户需要的信息,称为数据域(data),一部分是下一个结点的地址,称为指针域(next)。,链表不必像数组一样在内存中用连续空间存储,可用不连续的空间存储每个结点,用指针将每个结

16、点串联起来即可。结点可组织成一个有数据域和指向下一个结点的指针域的结构体。,链表,struct NodedataType data; /数据域struct Node *next; /指针域 ;,链表,例7-7 建一个员工工资的链表,链表有两个结点。,解题思路:声明一个员工工资的结构体类型,成员包括职工号(ID)、工资(salary)和指针变量(next),将第1个结点的地址赋给头指针Head,将第2个结点的地址赋给第1个结点的next成员,将第2个结点的next成员赋成NULL,形成一个简单的链表。,typedef struct Nodeint ID;float salary;struct N

17、ode *next; Employee;,Employee*pNew,*Head,*ppNew=(Employee *)malloc(sizeof(Employee); pNew-ID=101; pNew-salary=650; Head=pNew; pNew=(Employee*)malloc(sizeof(Employee);pNew-ID=102; pNew-salary=780; Head-next=pNew; pNew-next=NULL;,链表,例7-8 建立5个员工的链表,并对链表进行遍历、查找、插入和删除操作。,1、建立单链表的方法一般有两种:头插法和尾插法。,尾插法建立链表:

18、首先建立第一个结点作为头结点,然后动态生成第二个结点链在第一个结点之后,最后将尾结点的指针域赋为NULL,返回头结点的指针。链表中结点的顺序与输入数据的顺序相同。,链表,例7-8 建立5个员工的链表,并对链表进行遍历、查找、插入和删除操作。,Employee * Create_T(int n)Employee *Head,*cur,*pNew;int i;Head=cur=NULL;for(i=0;iID, /返回头指针 ,尾 插 法 建 立 链 表,链表,例7-8 建立5个员工的链表,并对链表进行遍历、查找、插入和删除操作。,头插法建立链表:首先建一个仅有一个头结点的链表,并将头结点的指针域

19、赋为NULL。因指向头结点的指针Head固定不变,每次生成一个新结点就插在头结点之后,直至插入所有结点。链表中结点的顺序与输入数据的顺序相反。,链表,例7-8 建立5个员工的链表,并对链表进行遍历、查找、插入和删除操作。,Employee * Create_H(int n)Employee *Head,*pNew;int i;Head=(Employee*)malloc(sizeof(Employee) ); /建头结点printf(“输入第1个员工的信息:n“);scanf(“%d,%f“, ,头 插 法 建 立 链 表,链表,例7-8 建立5个员工的链表,并对链表进行遍历、查找、插入和删除

20、操作。,2、链表的遍历,遍历一个链表就是访问链表中的所有结点。首先设一个指针变量p,指向链表中的第一个结点,当结点p不为空(NULL)时,输出p所指结点的信息,然后指针后移,逐个结点进行输出,直至输出所有结点。,void Print(Employee *Head)Employee *p;p=Head;printf(“n输出链表中的相关信息:n“);while(p)printf(“ID:%dtsalary :%.2fn“,p-ID,p-salary);p=p-next; /指针后移 ,链表,例7-8 建立5个员工的链表,并对链表进行遍历、查找、插入和删除操作。,3、查找某个结点,通过参数传递要查

21、找的内容,遍历整个链表,每访问一个结点,判断结点中的信息是否满足要求,若满足返回结点的地址。若遍历完毕,没有找到满足要求的结点,则返回空(NULL)。,Employee *Search_Node(Employee *Head,int id) /在链表中查找工号为id的结点Employee *p=Head;while(p ,链表,例7-8 建立5个员工的链表,并对链表进行遍历、查找、插入和删除操作。,4、增加某个结点,s=(Employee*)malloc(sizeof(Employee); s-ID=id; s-salary=sala; s-next=p-next; p-next=s;,链表,

22、例7-8 建立5个员工的链表,并对链表进行遍历、查找、插入和删除操作。,5、删除某个结点,p-next=q-next; free(q);,基本内容,共用体,与结构体类似,共用体也是不同类型成员的集合。与结构体中成员分别占用各自的内存不同,共用体中的所有成员占用同一内存。共用体内存是分时共享的,在某一时刻,只能有一个成员占用。共用体所占内存的大小为成员中占据内存最大的成员大小。,union unionNametype1 var1;type2 var2; ;,定义共用体的目的是为了节省和高效使用内存,在某一时刻仅使用一个成员而不使用其他成员时,可将这些成员组成一个共用体。,共用体,例7-9 设有若

23、干教师与学生的数据,教师数据有姓名、年龄、职业和工资。学生数据有姓名、年龄、职业和一门课成绩。编写程序,输入人员数据,并在屏幕上显示出来。,解题思路:定义一个结构体数组person,用来存储教师和学生的信息。由于教师和学生数据中有工资和成绩一项不同,应定义一个共用体类型。若职业是教师,则该成员是工资,若职业是学生,则该成员是成绩。在输入数据时,根据输入职业的不同,输入不同的数据。最后输出所有数据。,typedef structchar name20;int age;char job10;unionint salary;float score;data; Person;,共用体,Person p

24、ersonN; int i; printf(“输入%d个人员姓名、年龄、职业和工资或成绩:n“,N); for(i=0;iN;i+)scanf(“%s%d“,personi.name, ,基本内容,枚举类型,在实际问题中,有些变量仅取有限的几个值。例如,颜色有赤、橙、黄、绿、青、蓝、紫,星期有Sunday、Monday、Saturday等。为便于检测变量取值的合法性和明了起见,C语言提供了枚举类型来定义可将变量值一一列举出的变量类型。,enum TypeName constant1,constant2,constantn;,enum Weekday Sun,Mon,Tue,Wed,Thu,Fr

25、i,Sat;,enum ColorRed,Green,Blue color1,color2;,枚举类型,例7-10 投掷骰子游戏。骰子共有六个面,分别代表1、2、3、4、5、6。游戏开始首先玩家投掷一次骰子,若为6则赢,若为1则输,否则记下此数作为幸运点数。然后继续投掷骰子,若出现幸运点数则赢,若出现1则输。投掷骰子用随机函数模拟。,解题思路:首先产生一个1到6之间的随机数,判断该数是1还是6,若是两数之一,则输出“Lost”或“Won”,游戏结束。否则,用变量luckPoint记录此数,作为幸运数。重新产生一个新数,若此数是1或幸运数,输出结果,游戏结束。否则,再重新产生随机数,继续判定,直

26、至出现幸运数或1为止。,枚举类型,int ducePoint,luckPoint; enum Status Won,Lost,GoOn myStatus; /枚举三种状态:输、赢、继续 srand(time(0); /随机数种子 ducePoint=luckPoint=1+rand()%6; /产生1-6之间随机数 printf(“第一次出现的点数是%d.n“,ducePoint); if(ducePoint!=1 /switch,枚举类型,while(myStatus=GoOn)printf(“按Enter键继续.n“);getchar();/接收回车键ducePoint=1+rand()%6;printf(“重新获取的点数是:%dn“,ducePoint);if(ducePoint=luckPoint)printf(“你的幸运点数是%d.n“,luckPoint);myStatus=Won;break;else if(ducePoint=1)myStatus=Lost;break; ,基本内容,本章小结,本章介绍了结构体和共用体两种复合结构;本章介绍了类型定义符typedef的使用;本章介绍了链表的定义及使用;本章介绍了枚举类型;,本章结束,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报