版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C程序设计课件第07章第第7章章 结构体结构体C程序设计课件第07章n结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型n结构体可以容纳需要的任意多数据项n结构体中的变量称为结构体元素或结构体成员struct studentcharname11;intgrade;intnumber;姓名姓名年级年级学号学号学生学生C程序设计课件第07章声明结构体变量n一旦定义了结构体,就可以声明一个或多个该类型的变量n示例:struct student h1;n这条语句将会预留足够的内存来存放该结构体中的所有项struct studentcharname11;intgrade;intnumber
2、; h1, h2;struct student h1; struct student h2; struct student h3, h4;定义时定义时, ,声明结构体变量声明结构体变量先定义先定义, ,后声明后声明C程序设计课件第07章 结构体类型与结构变量的最大区别在于:结构变量占有一定的内存空间,而结构体类型只是一种数据类型的结构描述,并不占用内存空间。 struct box float length; float width; float height; ; 它表明struct box结构体类型由大括号中所列的一些数据项组成,共需占用4x3=12个字节。 在此之后,若进行结构变量的定义如
3、: struct box box1; 表明box1为struct box结构体类型变量,它占用了12个字节的内存单元。C程序设计课件第07章初始化结构体nstudent 类型的变量 h1 和 h2 可以按照下面的方式进行声明和初始化:struct student h1 = “张三张三”, 3, 20050101;struct student h2 = “李四李四”, 3, 20050102;struct studentcharname11;intgrade;intnumber;C程序设计课件第07章结构体中使用的赋值语句n可以使用一条简单的赋值语句将一个结构体变量的值赋给另一个相同类型的结构体
4、变量n例如,如果 h1 和 h2 是同一类型的结构体变量,那么下列语句是有效的:h2 = h1;C程序设计课件第07章访问结构体元素n结构体元素通过使用点运算符(.)来引用,这个运算符也称为成员运算符n语法:结构体变量名.元素名n示例:cin h1. name;C程序设计课件第07章n#include nvoid main()nnstruct studentnnchar name10;nint chinese;nint english;nscore;ncout;ncoutscore.chinese;ncoutscore.english;n /为结构体元素赋值为结构体元素赋值ncout姓名: e
5、ndl;ncout语文: score.chineseendl;ncout英语: score.englishendl;n/输出结构体元素结构体范例结构体范例C程序设计课件第07章结构体数组n首先定义结构体,然后声明该类型的数据变量n示例:struct student stu5;n访问数组 stu的第三个元素中的变量 number :stu2.numberC程序设计课件第07章结构体数组的初始化n结构体数组是通过用一对大括号将其元素值列表括起来进行初始化的n示例:struct student stu3 =“张三张三”, 3, 20050101,“李四李四”, 3, 20050102,“赵飞赵飞”,
6、 3, 20050103C程序设计课件第07章【例】计算学生的平均成绩并统计出不及格的人数。#include struct stu int num;char name20;char sex;float score;student3=200001,Li li,W,99,200002,Wang hai,M,85,200003,Liu ying,W,50;void main() int i,n;float average,sum;n=0;sum=0;C程序设计课件第07章for(i=0;i3;i+) sum+=studenti.score;if(studenti.score60) n+=1;cout
7、sumendl;average=sum/3;coutaverageendln 运算符用于通过指针来访问结构体的元素n示例:struct student *p, h1;p = &h1;coutname;C程序设计课件第07章 这三种用于表示结构成员的形式是完全等效的。 结构变量.成员名 (*结构指针变量).成员名 结构指针变量-成员名 请注意分析下面几种运算: s-n 得到s指向的结构变量中的成员n的值 s-n+ 得到s指向的结构变量中的成员n的值,用完该值后使 它加1 +s-n 得到s指向的结构变量中的成员n的值使之加1C程序设计课件第07章【例】通过结构指针引用结构体成员。#incl
8、ude iostream.hstruct stu int num;char name20;char sex;float score;student1=102,Zhang ping,M,78.5,*s;void main() s=&student1; /*给结构指针变量赋值*/coutstudent1.numendl;cout(*s).num(*s).nameendl;coutnumnameendl;C程序设计课件第07章指向结构数组指向结构数组 当结构指针指向一个结构数组时,该指针变量的值是整个结构数组的首地址。 C程序设计课件第07章【例】用指针变量输出结构数组。#include i
9、ostream.hstruct stu long int num;char name20;char sex;float score;student3=200001,Li li,W,99,200002,Wang hai,M,85,200003,Liuying ,W,50;void main() struct stu *s; for(s=student;sstudent+3;s+) coutnumnameendl;C程序设计课件第07章结构指针作函数参数结构指针作函数参数 使用结构指针,即用指向结构变量(或数组)的结构指针作函数参数进行传送,这时由实参向形参传递的是地址,属于“地址传递”方式,减少
10、了时间和空间上的开销。C程序设计课件第07章【例】用结构指针变量作函数参数编程,计算一组学生的平均成绩【例】用结构指针变量作函数参数编程,计算一组学生的平均成绩#include iostream.hstruct stu long int num;char name20;char sex;float score;student3=200001,Li li,W,99,200002,Wang hai,M,85,200003,Liuying ,W,50;C程序设计课件第07章void average(struct stu *ps) int n=0,i;float ave,s=0;for(i=0;isc
11、ore; ave=s/3;coutaverage=avenum=102;strcpy(s-name,Zhang ping);s-sex=M;s-score=62.5;coutnumnameendl;coutsexscoreendl;free(s);C程序设计课件第07章链表的使用链表的使用 链表是一种常见的、重要的数据结构,它采用动态的分配办法为一个结构体分配内存空间。 一方面需要时就分配一块空间用来存放,从而节约了宝贵的内存资源;且便于删除与加入。 另一方面,在动态分配时,每个结点之间可以是不连续的(结点内是连续的),结点之间的联系是通过指针来实现的,即在结点结构中定义一个成员项用来存放下一
12、结点的首地址,这个用于存放地址的成员,常把它称为指针域。 这样一种连接方式,如同一条一环接一环的链子,在数据结构中称之为“链表”。C程序设计课件第07章struct stustruct stu int num; int num; int score; int score; struct stu struct stu * *next;next; 在该结构体中前两个成员项组成数据域,最后一个成员项在该结构体中前两个成员项组成数据域,最后一个成员项nextnext构构成指针域,它是一个指向成指针域,它是一个指向struct stustruct stu类型的结构指针变量。类型的结构指针变量。 C程序设
13、计课件第07章单链表的常用操作:结点的插入、删除、检索和排序等。单链表的常用操作:结点的插入、删除、检索和排序等。新项目插在表头新项目插在表头新项目插在表中间新项目插在表中间新项目新项目infoinfo1 1infoinfo3 30infoinfo2 2新项目插在表尾新项目插在表尾新项目新项目infoinfo1 1infoinfo3 30infoinfo2 2新项目新项目infoinfo1 1infoinfo3 30infoinfo2 2新项目新项目0infoinfo1 1infoinfo3 3infoinfo2 2C程序设计课件第07章 建立链表建立链表【例】编写一个建立单向链表的函数,存放
14、学生数据。#include #include #include malloc.h#include malloc.h#define NULL 0 #define NULL 0 / /* *令令NULLNULL为为0 0,用它表示空地址,用它表示空地址* */ /#define LEN sizeof (struct stu) #define LEN sizeof (struct stu) struct stustruct stu long int num; long int num; float score; float score; struct stu struct stu * *next;n
15、ext; ; C程序设计课件第07章 int n; int n; struct stu struct stu * *creat() creat() / /* *此函数返回一个指向链表头的指针此函数返回一个指向链表头的指针* */ / struct stu struct stu * *head,head,* *p1,p1,* *p2;p2; n=0; n=0;/ /* *n n为结点的个数为结点的个数* */ / p1=p2=(struct stu p1=p2=(struct stu * *)malloc(LEN);)malloc(LEN);/ /* *开辟一个新单元开辟一个新单元* */ /
16、cinp1-nump1-score; cinp1-nump1-score; head=NULL; head=NULL; while(p1-num!=0) while(p1-num!=0) n=n+1; n=n+1; if (n=1)head=p1; if (n=1)head=p1; else p2-next=p1; else p2-next=p1;C程序设计课件第07章 p2=p1; p2=p1; p1=( struct stu p1=( struct stu * *)malloc(LEN);)malloc(LEN); cinp1-nump1-score; cinp1-nump1-score;
17、 p2-next=NULL; p2-next=NULL; return(head);return(head);/ /* *返回链表的头地址返回链表的头地址* */ / 图7-1、图7-2、图7-3、图7-4、图7-5表示出creat函数的执行过程。C程序设计课件第07章图7-1C程序设计课件第07章图7-2C程序设计课件第07章图7-3(a)C程序设计课件第07章图7-3(b)C程序设计课件第07章图7-3(c)C程序设计课件第07章图7-4(a)C程序设计课件第07章图7-4(b)C程序设计课件第07章图7-4(c)C程序设计课件第07章图7-5C程序设计课件第07章链表的输出链表的输出将链
18、表中各结点的数据依次输出,首先要知道链表头元素的地址。将链表中各结点的数据依次输出,首先要知道链表头元素的地址。程序执行过程可见图程序执行过程可见图7-67-6所示。所示。【例】写一个函数,输出链表中所有结点。【例】写一个函数,输出链表中所有结点。void print(head) void print(head) / /* *由实参将已有的链表的头指针传给被调函数由实参将已有的链表的头指针传给被调函数* */ /struct stu struct stu * *head; head; struct student struct student * *p; p; p=head; p=head;
19、/ /* * p p指向头结点指向头结点* */ /while(p!=NULL) while(p!=NULL) coutnumscoreendl; / coutnumscorenext; p=p-next; / /* *使使p p指向下一个结点指向下一个结点* */ / C程序设计课件第07章图7-6C程序设计课件第07章链表的删除操作链表的删除操作 从一个链表中删除一个结点,并不是真正从内存中把它抹去,而是把它从链表中分离开来。 分析:设两个指针变量p1和p2,先使p1指向第一个结点。删除一个结点有两种情况: 一种情况一种情况是要删除结点是第一个结点,此时只需使head指向第二个结点即可,即
20、head=p1-next,其过程如图7-7所示。 另一种情况另一种情况是被删除结点不是第一个结点,可使被删除结点的前一结点指向被删结点的后一结点,即p2-next=p1-next,其过程如图7-8所示。【例】写一个函数,删除链表中的指定结点,以指定的学号作为删除结点的标志。函数dele编写如下: struct stu struct stu * * dele(struct stu dele(struct stu * *head, long int num)head, long int num) struct stu struct stu * *p1,p1,* *p2;p2; C程序设计课件第07
21、章链表的删除操作链表的删除操作if(head=NULL) if(head=NULL) / /* *如为空表,如为空表, 输出提示信息输出提示信息* */ / return head; return head; p1=head; p1=head; while (p1-num!=num & p1-next!=NULL) /while (p1-num!=num & p1-next!=NULL) /* *当不是要删除的结当不是要删除的结点,而且也不是最后一个结点时,继续循环点,而且也不是最后一个结点时,继续循环* */ / p2=p1;p1=p1-next; p2=p1;p1=p1-n
22、ext; / /* *后移一个结点后移一个结点* */ / if(p1-num=num) if(p1-num=num) / /* *找到要删除的结点找到要删除的结点* */ / if(p1=head)head=p1-next; / if(p1=head)head=p1-next; /* *为第一结点为第一结点headhead指向第二指向第二结点结点* */ /else p2-next=p1-next; else p2-next=p1-next; / /* *不是第一个结点,使要删除结点从链表中不是第一个结点,使要删除结点从链表中脱离脱离* */ / C程序设计课件第07章链表的删除操作链表的删
23、除操作n=n-1;n=n-1;free(p1);free(p1); else else CoutThe node not been foud!; Coutnext=p1;head=p0; p0-next=p1;head=p0; 见图见图7-9(b)7-9(b)。 第三种情况是在其它位置插入,见图第三种情况是在其它位置插入,见图7-9(c)7-9(c)。 p0-next=p1;p2-next=p0;p0-next=p1;p2-next=p0; 最后一种情况是在表末插入,见图最后一种情况是在表末插入,见图7-9(d)7-9(d)。 p1-next=p0;p0-next=NULL;p1-next=p
24、0;p0-next=NULL;C程序设计课件第07章【例】写一个函数,在学生数据链表中,按学号顺序插入一个结点。【例】写一个函数,在学生数据链表中,按学号顺序插入一个结点。struct stu struct stu * * insert(struct stu insert(struct stu * *head, struct stu head, struct stu * *stud) stud) struct stu struct stu * *p0,p0,* *p1,p1,* *p2; p2; p1=head;p1=head;/ /* *指向第一个结点指向第一个结点* */ / p0=stu
25、d; p0=stud; / /* *指向要插入的结点指向要插入的结点* */ /if(head=NULL) if(head=NULL) / /* *空表插入空表插入* */ / head=p0; head=p0;p0-next=NULL;p0-next=NULL; / /* *将将p0p0指向的结点作第一个结点指向的结点作第一个结点* */ / C程序设计课件第07章else else while(p0-nump1-num)&(p1-next!=NULL) while(p0-nump1-num)&(p1-next!=NULL) p2=p1; p2=p1; p1=p1-next;
26、 p1=p1-next; / /* *找插入位置找插入位置* */ / if(p0-numnum) if(p0-numnum) if(head=p1)head=p0; if(head=p1)head=p0;/ /* *在第一结点之前插入在第一结点之前插入* */ / else p2-next=p0; /else p2-next=p0; /* *在其它位置插入在其它位置插入* */ / p0-next=p1;p0-next=p1; C程序设计课件第07章else else p1-next=p0; p1-next=p0; p0-next=NULL;p0-next=NULL; / /* *在表末插入
27、在表末插入* */ / n=n+1;n=n+1;return (head);return (head); C程序设计课件第07章图7-9(a)C程序设计课件第07章图7-9(b)C程序设计课件第07章图7-9(c)C程序设计课件第07章图7-9(d)C程序设计课件第07章栈栈栈是一种栈是一种线性表线性表,对栈的所有操作发生在这个表的同一端,该端称为栈,对栈的所有操作发生在这个表的同一端,该端称为栈的的“顶顶”,另一端称为栈的,另一端称为栈的“底底”。由于插入和删除都在栈顶进行,因此删除的将是最新插入的成员,所以由于插入和删除都在栈顶进行,因此删除的将是最新插入的成员,所以栈又被称为栈又被称为“
28、后进先出表后进先出表(LIFO表或下推表)表或下推表)”。描述一个栈通常需要一个变量和三个函数:变量用于记录当前的栈顶位描述一个栈通常需要一个变量和三个函数:变量用于记录当前的栈顶位置;函数包括将数据项压入栈的置;函数包括将数据项压入栈的push()、从栈顶弹出一个成员的、从栈顶弹出一个成员的pop()、读栈顶成员的读栈顶成员的top()。有时还需要引入一个变量标识栈内数据对象数目。有时还需要引入一个变量标识栈内数据对象数目或者栈底的位置。或者栈底的位置。stackstackINFOINFONODENODE* *datadatapNextpNextdatadatapNextpNextdatad
29、atapNextpNext.栈通常以顺序方式存储。栈通常以顺序方式存储。如果栈中所有项目类型相同,并且项目如果栈中所有项目类型相同,并且项目总数具有上限,那么这个栈可以一维数总数具有上限,那么这个栈可以一维数组方式实现,这种实现方式栈的基本操组方式实现,这种实现方式栈的基本操作十分简单,缺点是对栈成员的总数有作十分简单,缺点是对栈成员的总数有限制,且成员一般要具有相同类型。限制,且成员一般要具有相同类型。 栈的比较灵活的实现方式是采用单链表。栈的比较灵活的实现方式是采用单链表。C程序设计课件第07章联合体联合体 将几种不同类型的变量存放在同一段内存单元中的结构称为“联合体”,也称为“共用体”。
30、 “联合体”与“结构体”有一些相似之处,但两者有本质上的不同。在结构体中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和;而在联合体中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。C程序设计课件第07章联合体类型的声明联合体类型的声明声明一个联合体类型的一般形式为:声明一个联合体类型的一般形式为:union union ; ; 例如:例如:union perdata union perdata int class; int class; char office10;char office10;C程序设计课件第07章在使用联合体类型数据时要注意它具有以下一些特点
31、:在使用联合体类型数据时要注意它具有以下一些特点:(1 1)一个联合变量,每次只能赋予一个成员值。)一个联合变量,每次只能赋予一个成员值。(2 2)联合变量中起作用的成员是最后一次存放的成员。)联合变量中起作用的成员是最后一次存放的成员。(3 3)不允许对联合变量作初始化赋值,赋值只能在程序中进行。)不允许对联合变量作初始化赋值,赋值只能在程序中进行。C程序设计课件第07章【例】编写程序使用联合体类型数据来保存数据。【例】编写程序使用联合体类型数据来保存数据。#include void main() union t char *name;int age;int income;union t list;C程序设计课件第07章coutsizeof(union t*)endl;/*输出联合体类型长度输出联合体类型长度*/=Zhang hai;/*第一次赋值第一次赋值*/coutendl;list.age=20; /*第二次赋值第二次赋值*/coutlist.ageendl;list.income=2500; /*第三次赋值第三次赋值*/coutlist.incomeendl;coutlist.agelist.incomeendl;/*输出各成员值输出各成员值*/C程序设计课件第07章 枚举类型声明的一般形式为:枚举类型
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卫生检验员岗位技能2026年考试题及答案
- 2026年建筑防水工程技术规范试题及答案
- 卫生间地面防水施工工艺及施工方法
- 企业电脑维修外包合同
- 2026年P气瓶充装考试题库附答案
- 2026年国家义务教育质量监测小学生心理健康测试试卷及答案
- 危房改造工程施工材料管理保证措施
- 变风量(VAV)系统调试专项方案
- 机械设备报废更新施工工艺
- 烟台大学物理学就业前景分析
- 雨课堂学堂在线学堂云《人工智能与创新(南开)》单元测试考核答案
- 某地块土壤污染状况调查汇报PPT模板框架
- 校园超市招标文件
- 模拟CMOS集成电路设计课程设计实验报告(二级放大器的设计)
- 儿童感觉统合能力发展评定量表(含原始分与标准分转换表)988
- GB/T 18570.3-2005涂覆涂料前钢材表面处理表面清洁度的评定试验第3部分:涂覆涂料前钢材表面的灰尘评定(压敏粘带法)
- 肝衰竭机制及治疗进展课件
- 史料学(全套课件)
- 回转窑基础知识培训课件
- (名师整理)最新中考语文《非连续性文本阅读》专题复习精品课件
- STAR CCM+培训基础 课件
评论
0/150
提交评论