版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 结构体,结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型 结构体可以容纳需要的任意多数据项 结构体中的变量称为结构体元素或结构体成员,struct student charname11; intgrade; intnumber; ;,姓名 年级 学号,学生,声明结构体变量,一旦定义了结构体,就可以声明一个或多个该类型的变量 示例:struct student h1; 这条语句将会预留足够的内存来存放该结构体中的所有项,struct student charname11; intgrade; intnumber; h1, h2;,struct student h1; st
2、ruct student h2; struct student h3, h4;,定义时,声明结构体变量,先定义,后声明,结构体类型与结构变量的最大区别在于:结构变量占有一定的内存空间,而结构体类型只是一种数据类型的结构描述,并不占用内存空间。 struct box float length; float width; float height; ; 它表明struct box结构体类型由大括号中所列的一些数据项组成,共需占用4x3=12个字节。 在此之后,若进行结构变量的定义如: struct box box1; 表明box1为struct box结构体类型变量,它占用了12个字节的内存单元。
3、,初始化结构体,student 类型的变量 h1 和 h2 可以按照下面的方式进行声明和初始化:,struct student h1 = “张三”, 3, 20050101; struct student h2 = “李四”, 3, 20050102;,struct student charname11; intgrade; intnumber; ;,结构体中使用的赋值语句,可以使用一条简单的赋值语句将一个结构体变量的值赋给另一个相同类型的结构体变量 例如,如果 h1 和 h2 是同一类型的结构体变量,那么下列语句是有效的: h2 = h1;,访问结构体元素,结构体元素通过使用点运算符(.)来
4、引用,这个运算符也称为成员运算符 语法: 结构体变量名.元素名 示例: cin h1. name;,#include void main() struct student char name10; int chinese; int english; score; ; coutscore.chinese; coutscore.english; /为结构体元素赋值,cout姓名: endl; cout语文: score.chineseendl; cout英语: score.englishendl; /输出结构体元素,结构体范例,结构体数组,首先定义结
5、构体,然后声明该类型的数据变量 示例: struct student stu5; 访问数组 stu的第三个元素中的变量 number : stu2.number,结构体数组的初始化,结构体数组是通过用一对大括号将其元素值列表括起来进行初始化的 示例:,struct student stu3 = “张三”, 3, 20050101, “李四”, 3, 20050102, “赵飞”, 3, 20050103 ,【例】计算学生的平均成绩并统计出不及格的人数。 #include struct stu int num; char name20; char sex; float score; studen
6、t3=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;,for(i=0;i3;i+) sum+=studenti.score; if(studenti.score60) n+=1; coutsumendl; average=sum/3; coutaverageendlnendl; ,结构体指针,结构体指针是通过在结构体变量名前放置一个星号(*)来进行声明的 - 运算符用于通过指针来访问结构体的元素 示例: struct
7、 student *p, h1; p = ,这三种用于表示结构成员的形式是完全等效的。 结构变量.成员名 (*结构指针变量).成员名 结构指针变量-成员名 请注意分析下面几种运算: s-n 得到s指向的结构变量中的成员n的值 s-n+ 得到s指向的结构变量中的成员n的值,用完该值后使 它加1 +s-n 得到s指向的结构变量中的成员n的值使之加1,【例】通过结构指针引用结构体成员。 #include iostream.h struct stu int num; char name20; char sex; float score; student1=102,Zhang ping,M,78.5,*
8、s; void main() s= ,指向结构数组,当结构指针指向一个结构数组时,该指针变量的值是整个结构数组的首地址。,【例】用指针变量输出结构数组。 #include iostream.h struct 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;snumnameendl; ,结构指针作函数参数,使用结构指
9、针,即用指向结构变量(或数组)的结构指针作函数参数进行传送,这时由实参向形参传递的是地址,属于“地址传递”方式,减少了时间和空间上的开销。,【例】用结构指针变量作函数参数编程,计算一组学生的平均成绩 #include iostream.h struct 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 average(struct stu *ps) int n=0,i; float av
10、e,s=0; for(i=0;iscore; ave=s/3; coutaverage=aveendl; void main() struct stu *s; s=student; average(s); ,动态存储分配函数,分配内存空间函数malloc,分配内存空间函数calloc,释放内存空间函数free,分配内存空间函数malloc 调用形式:(类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为“size”字节的连续空间。函数的返回值为该空间的首地址;若此函数未能成功的执行,则返回的值为0。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表
11、示把返回值强制转换为该类型指针。 例如:pc=(char *) malloc (100);表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。,分配内存空间函数calloc 调用形式:(类型说明符*) calloc(n,size) 功能:在内存动态存储区中分配n块长度为“size”字节的连续空间。函数的返回值为该空间的首地址;若此函数未能成功的执行,则返回的值为0。 例如:语句ps=(struct stu*) calloc(2,sizeof(struct stu);中的函数sizeof(struct stu)是求struct
12、stu结构体类型的长度。因此该语句的意思是:按照struct stu的长度分配2块连续区域,强制转换为struct stu类型,并把其首地址赋予指针变量ps。,释放内存空间函数free 调用形式:free (void*ptr); 功能:释放ptr所指向的内存空间,ptr指向被释放区域的首地址,被释放区应是由malloc或calloc函数所分配的空间。ptr是一个无类型的指针变量。,【例】分配一块区域,输入一个学生数据。 #include iostream.h #include malloc.h #include string.h void main() struct stu int num;
13、char name20; char sex; float score; *s;,s=(struct stu*)malloc(sizeof(struct stu); s-num=102; strcpy(s-name,Zhang ping); s-sex=M; s-score=62.5; coutnumnamesexscoreendl; free(s); ,链表的使用,链表是一种常见的、重要的数据结构,它采用动态的分配办法为一个结构体分配内存空间。 一方面需要时就分配一块空间用来存放,从而节约了宝贵的内存资源;且便于删除与加入。 另一方面,在动态分配时,每个结点之间可以是不连续的(结点内是连续的)
14、,结点之间的联系是通过指针来实现的,即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域。 这样一种连接方式,如同一条一环接一环的链子,在数据结构中称之为“链表”。,struct stu int num; int score; struct stu *next; ; 在该结构体中前两个成员项组成数据域,最后一个成员项next构成指针域,它是一个指向struct stu类型的结构指针变量。,单链表的常用操作:结点的插入、删除、检索和排序等。,建立链表,【例】编写一个建立单向链表的函数,存放学生数据。 #include #include malloc.h
15、#define NULL 0 /*令NULL为0,用它表示空地址*/ #define LEN sizeof (struct stu) struct stu long int num; float score; struct stu *next; ;,int n; struct stu *creat() /*此函数返回一个指向链表头的指针*/ struct stu *head,*p1,*p2; n=0;/*n为结点的个数*/ p1=p2=(struct stu *)malloc(LEN);/*开辟一个新单元*/ cinp1-nump1-score; head=NULL; while(p1-num
16、!=0) n=n+1; if (n=1)head=p1; else p2-next=p1;,p2=p1; p1=( struct stu *)malloc(LEN); cinp1-nump1-score; p2-next=NULL; return(head);/*返回链表的头地址*/ 图7-1、图7-2、图7-3、图7-4、图7-5表示出creat函数的执行过程。,图7-1,图7-2,图7-3(a),图7-3(b),图7-3(c),图7-4(a),图7-4(b),图7-4(c),图7-5,链表的输出,将链表中各结点的数据依次输出,首先要知道链表头元素的地址。程序执行过程可见图7-6所示。 【例
17、】写一个函数,输出链表中所有结点。 void print(head) /*由实参将已有的链表的头指针传给被调函数*/ struct stu *head; struct student *p; p=head; /* p指向头结点*/ while(p!=NULL) coutnumscorenext; /*使p指向下一个结点*/ ,图7-6,链表的删除操作,从一个链表中删除一个结点,并不是真正从内存中把它抹去,而是把它从链表中分离开来。 分析:设两个指针变量p1和p2,先使p1指向第一个结点。删除一个结点有两种情况: 一种情况是要删除结点是第一个结点,此时只需使head指向第二个结点即可,即head
18、=p1-next,其过程如图7-7所示。 另一种情况是被删除结点不是第一个结点,可使被删除结点的前一结点指向被删结点的后一结点,即p2-next=p1-next,其过程如图7-8所示。 【例】写一个函数,删除链表中的指定结点,以指定的学号作为删除结点的标志。函数dele编写如下: struct stu * dele(struct stu *head, long int num) struct stu *p1,*p2;,链表的删除操作,if(head=NULL) /*如为空表, 输出提示信息*/ return head; p1=head; while (p1-num!=num /*不是第一个结点
19、,使要删除结点从链表中脱离*/,链表的删除操作,n=n-1; free(p1); else CoutThe node not been foud!; return head; /*返回head值*/ ,图7-7,图7-8(a),图7-8(b),图7-8(c),链表的插入操作,设被插入结点的指针为p0 可在四种不同情况下插入: 第一种情况是原链表是空链表,只需使head指向被插入结点即可,见图7-9(a)。 第二种情况是插入到第一个结点之前。 p0-next=p1;head=p0; 见图7-9(b)。 第三种情况是在其它位置插入,见图7-9(c)。 p0-next=p1;p2-next=p0;
20、最后一种情况是在表末插入,见图7-9(d)。 p1-next=p0;p0-next=NULL;,【例】写一个函数,在学生数据链表中,按学号顺序插入一个结点。 struct stu * insert(struct stu *head, struct stu *stud) struct stu *p0,*p1,*p2; p1=head;/*指向第一个结点*/ p0=stud; /*指向要插入的结点*/ if(head=NULL) /*空表插入*/ head=p0; p0-next=NULL; /*将p0指向的结点作第一个结点*/,else while(p0-nump1-num) ,else p1-
21、next=p0; p0-next=NULL; /*在表末插入*/ n=n+1; return (head); ,图7-9(a),图7-9(b),图7-9(c),图7-9(d),栈,栈是一种线性表,对栈的所有操作发生在这个表的同一端,该端称为栈的“顶”,另一端称为栈的“底”。 由于插入和删除都在栈顶进行,因此删除的将是最新插入的成员,所以栈又被称为“后进先出表(LIFO表或下推表)”。 描述一个栈通常需要一个变量和三个函数:变量用于记录当前的栈顶位置;函数包括将数据项压入栈的push()、从栈顶弹出一个成员的pop()、读栈顶成员的top()。有时还需要引入一个变量标识栈内数据对象数目或者栈底的
22、位置。,栈通常以顺序方式存储。 如果栈中所有项目类型相同,并且项目总数具有上限,那么这个栈可以一维数组方式实现,这种实现方式栈的基本操作十分简单,缺点是对栈成员的总数有限制,且成员一般要具有相同类型。 栈的比较灵活的实现方式是采用单链表。,联合体,将几种不同类型的变量存放在同一段内存单元中的结构称为“联合体”,也称为“共用体”。 “联合体”与“结构体”有一些相似之处,但两者有本质上的不同。在结构体中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和;而在联合体中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。,联合体类型的声明,声明一个联合体类型的一般形式为: union ; 例如: union perdata int class; char office10; ;,在使用联合体类型数据时要注意它具有以下一些特点: (1)一个联合变量,每次只能赋予一个成员值。 (2)联合变量中起作用的成员是最后一次存放的成员。 (3)不允许对联合变量作初始化赋值,赋值只能在程序中进行。,【例】编写程序使用联合体类型数据来保存数据。 #include void main() union t char *name; int age; int income; ; union t list;,coutsizeof
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年四川省万源市高二生物下册期末考试模拟卷及参考答案【突破训练】
- 2026年江西省瑞金市高二生物下册期末考试模拟卷带答案(考试直接用)
- 2026年广东省罗定市高二生物下册期末考试考试卷(名师系列)附答案
- 2026年四川省绵竹市高二生物下册期末考试模拟卷含答案AB卷
- 2026年江苏省海门市高二生物下册期末考试模拟卷【考点精练】附答案
- 2025年辽宁省新民市高二生物下册期末考试考试卷及参考答案【综合题】
- 七年级语文下期期末学业监测试题含答案(完整版)
- 2026年湖南省资兴市高二生物下册期末考试考试卷附参考答案(模拟题)
- 2026年山西省永济市高二生物下册期末考试模拟卷(全优)附答案
- 2026年贵州省仁怀市高二生物下册期末考试测试卷附参考答案【夺分金卷】
- 醉里乾坤大壶中日月长-初中语文九年级第六单元名著导读《水浒传》整本书阅读精读研讨课 公开课一等奖创新教学设计
- 深基坑开挖与支护施工监理实施细则
- 钢-混组合连续梁支座预顶升施工工艺
- 《汽车底盘电控系统实训工单(AR版)》课后部分参考答案 廖光宙
- 《疫苗管理法》法律法规解读课件
- 农商银行强化公司治理年工作总结-银行工作总结
- TANIA 012-2021 阿克苏奶馕生产技术规程
- GB 4569-2000摩托车噪声限值及测试方法
- 网络路由重发布
- 招标代理机构廉洁从业措施
- DB225065-2021装配式建筑评价标准
评论
0/150
提交评论