《级C语言程序设计》第9章结构体与共用体.ppt
《《级C语言程序设计》第9章结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《《级C语言程序设计》第9章结构体与共用体.ppt(68页珍藏版)》请在三一办公上搜索。
1、第9章 结构体与共用体,9.1 结构体,上表中某一学生的数据是由学生的学号、姓名、性别、年龄、家庭地址等数据项组成的,这些数据项是一组逻辑上相关的数据,如果将这些数据项分割开来孤立地考虑它们的属性,将导致操作的不便或逻辑错误。在C语言中,将这种由多个不同类型的数据项组合在一起形成的数据类型,称为结构体类型。,表9-1 学生表,9.1.1 结构体类型的定义,结构体类型定义的一般形式:struct 标识符 类型名1 成员名1;类型名2 成员名2;类型名n 成员名n;,9.1.1 结构体类型的定义,例1 对某一学生数据(由学生的学号、姓名、性别、年龄、家庭地址等数据项组成)的结构体类型定义如下:st
2、ruct student int num;char name20;char sex;int age;char addr30;,(5)结构体类型定义的嵌套。例2:若某一学生数据包括学号、姓名、性别、出生年月、家庭地址,其中出生年月包括出生的年、月、日三个数据,则对某一学生数据的结构体类型定义如下:,再定义student结构体:struct student int num;char name20;char sex;struct date birthday;char addr30;,先定义date结构体:struct dateint year;int month;int day;,9.1.1 结构体
3、类型的定义,9.1.2 结构体变量的定义,结构体变量的定义有三种处理方式:(1)先定义结构体类型,再定义结构体变量。例1:struct student int num;char name20;char sex;int age;char addr30;/*定义结构体类型struct student*/struct student a,b;/*定义a、b为结构体类型struct student的变量*/,9.1.2 结构体变量的定义,(2)在定义结构体类型的同时定义结构体变量。例2:struct student int num;char name20;char sex;int age;char a
4、ddr30;a,b;,9.1.2 结构体变量的定义,(3)直接定义结构类型变量。例3:struct int num;char name20;char sex;int age;char addr30;a,b;,9.1.3 结构体变量的引用,(1)引用结构体变量的成员。格式:结构体变量名成员名struct dateint year;int month;int day;,struct student int num;char name20;char sex;struct date birthday;char addr30;struct student a,b;a.name=Li Fang;b.bir
5、thday.day=12;,9.1.3 结构体变量的引用,对结构体变量中的成员都可以像同类型的普通变量一样进行各种运算。例3:a.num=060001+5;b.birthday.day+;(2)结构体变量作为一个整体引用.结构体变量不可以作为整体进行输入输出,但可以作为函数的参数或返回值而被整体引用,也可以将一个结构体变量作为一个整体赋给另一个具有相同类型的结构体变量。例1:struct student a,b;a=b;,(3)引用结构体变量的地址或成员的地址struct student a,b;scanf(%d,9.1.3 结构体变量的引用,9.1.4 结构体变量的初始化,结构体变量的初始化
6、形式有如下两种:(1)struct 标识符 类型名1 成员名1;类型名2 成员名2;类型名n 成员名n;变量名=数据表;,例1:struct student int num;char name20;char sex;int age;char addr30;a=060001,Li Fang,F,18,Wuhan;,(2)结构体类型名 变量名=数据表;例2:struct student int num;char name20;char sex;int age;char addr30;struct student a=060001,Li Fang,F,18,Wuhan;,9.1.3 结构体变量的引用
7、,9.2 结构体数组,9.2.1 结构体数组的定义结构体数组定义的一般形式:结构体类型名 数组名常量表达式;例1:struct student int num;char name20;char sex;int age;char addr30;/*定义结构体类型struct student*/struct student a5;/*定义a5结构体类型struct student的数组*/,9.2.2 结构体数组元素的引用,格式:结构体数组名元素下标.结构体成员名 例1:struct student int num;char name20;char sex;int age;char addr30;
8、a5;a0.num=060001;a1.name=Lin Hong;,一个结构体数组元素相当于一个结构体变量,其处理方法与结构体变量的处理方法相同,9.2.2 结构体数组元素的引用,例2:struct student int num;char name20;char sex;int age;char addr30;a5;scanf(%d,9.2.3 结构体数组的初始化,结构体数组也可以在定义的同时进行数组元素的初始化。例如:struct student int num;char name20;char sex;int age;char addr30;a5=060001,Li Fang,F,18
9、,Wuhan,060230,Lin Hong,F,16,Changsha;,;,9.2.4 应用举例,例9.1 输入如表9-1所示的学生情况登记表,按学号顺序整理输出该表。分析如下:1、定义学生类型及学生数组:2、输入学生信息3、输出学生信息(程序由学生和老师共同完成),struct student int num;char name20;char sex;int age;char addr30;a5;,9.3 结构体指针,结构体指针变量:如果用一个指针变量指向一个结构体变量,即存储该结构体变量所占据的内存单元的起始地址,则该指针变量称为结构体指针变量。结构体指针变量也可以用来指向结构体数组中
10、的元素。,9.3.1 结构体指针变量的定义,结构体指针变量的定义形式如下:结构体类型名*指针变量名;例如:struct student*p,a;p=,9.3.2 引用指针所指向的结构体变量的成员,通过指针变量引用结构体变量的成员有如下两种方式:(1)(*结构体指针).成员名例如:(*p).num(2)结构体指针-成员名例如:p-num,9.3.3 指向结构体数组的指针,对于已定义的结构体数组,若用一个变量来存放该结构体数组在内存中的首地址,则该变量为指向结构体数组的指针变量。例如:struct student*p,a5;p=a;例9.2 用指向结构体数组的指针处理例9.1(按学号顺序整理输出学
11、生情况登记表。),9.4 结构体与函数,1结构体变量作为函数的形参的三种形式:(1)以结构体变量的成员作为参数,传递结构体变量的成员的值。(2)以结构体变量作为参数,直接传递结构体变量的值。在ANSI C标准中允许用结构变量作为函数的参数进行整体传送,即直接将实参结构体变量的各个成员的值逐个传递给形参结构体变量的对应成员。注意,实参与形参必须是相同结构体类型的变量。(3)以结构体指针作为参数,传递结构体变量的地址。通过结构体变量的整体传递可以实现函数参数的传递,但这要将结构体变量的全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的办法就是使用
12、指针,即用指针变量作函数参数进行传送。这时由实参传递给函数形参的只是地址,从而减少了时间和空间的开销。,例9.3 利用函数完成结构体变量的输入输出。(阅读书中程序)2结构体类型作为函数的返回值类型其一般定义形式:结构体类型名 函数名(形参表)函数体 例(p168),9.4 结构体与函数,9.5 链表,C语言中,变量存储空间的分配分为静态分配和动态分配两种方式。(1)静态分配方式:先在程序的声明部分进行定义,然后在程序编译时分配适当的存储单元。这些存储单元一经分配,在它的生存期内是固定不变的。(2)动态分配方式:在程序执行期间,通过“申请”分配指定的存储空间来存储数据,当有闲置不用的存储空间时,
13、又可以随时将其释放。前面章节中处理的变量都是在程序的声明部分定义的变量,在程序编译时分配存储单元,是静态分配方式。本章下面要介绍的是通过动态分配方式,在程序执行期间,通过“申请”分配的动态的存储单元,以及动态分配的存储单元构成的“链表”结构。,9.5.1 链表的概念,例1:利用C语言在计算机中存储三个学生的计算机成绩,如果有定义int a3,则其内存单元分配情况如下:,9.5.1 链表的概念,例2:用链表存储方式来存储三个同学的计算机成绩。,可直观地表示如下:,9.5.2 动态分配函数,1malloc函数函数格式:void*malloc(unsigned int size)函数功能:在内存的动
14、态存储区中分配一个长度为size的存储单元。例1:int*p;long*lp;struct student*head;p=(int*)malloc(2);/*分配一个整型存储单元(占用2个字节),用p指向该存储单元*/lp=(long*)malloc(sizeof(long);/*分配一个长整型存储单元,用lp指向该存储单元,长整型存储单元所占字节数由函数sizeof(long)求得*/head=(struct student*)malloc(sizeof(struct student);/*分配一个struct student结构体类型的存储单元,用head 指向该存储单元*/上述函数siz
15、eof(类型名)求出指定类型的存储单元所占字节数,9.5.2 动态分配函数,2calloc函数函数格式:void calloc(unsigned int n,unsigned int size);函数功能:在内存的动态存储区域中分配n个长度为size的连续存储单元。形参n和size均为无符号整数,n是连续存储单元的个数,size是一个存储单元占用的字节数。函数的返回值为分配的连续存储单元的起始地址;如果分配不成功,则返回值为0。例2:int*p;p=(int*)calloc(3,sizeof(int);/*分配3个连续的存储单元,并将其起始地址赋给整型指针变量p*/,9.5.2 动态分配函数,
16、3free函数函数格式:void free(void*ptr);函数功能:释放由指针变量ptr指向的内存区域。其中,ptr是一个指针变量,指向最近一次调用函数malloc或calloc时所分配的存储空间的首地址。通过函数free将已分配的内存区域交还系统,使系统可以重新对其进行分配。例3:int*p;p=(int*)calloc(3,sizeof(int);free(p);,9.5.3 链表的基本操作,1链表节点的定义链表中的任一个节点都包括两个数据项,一个是节点自身的数据信息,称为节点的数据域,另一个是下一节点的地址值,称为节点的指针域。struct node datatype data;s
17、truct node*next;datatype是数据域的类型,可以是前面所介绍的任意C语言类型。显然,链表节点的指针域存放的地址类型与它自身的类型是相同的。,例1:存储三个同学的计算机成绩的链表存储方式如下:,上述链表中节点的定义如下:struct node int data;struct node*next;链表的头指针定义如下:struct node*head;,9.5.3 链表的基本操作,2链表的基本操作链表的基本操作主要有链表的建立、节点的访问、节点的插入、节点的删除等。(1)链表的建立。链表的建立是一个动态存储空间分配和形成链接关系的过程。用尾插法建立链表的过程如下:1)建立一个空
18、链表,即head=NULL。2)请分配新节点存储单元,对新节点的数据域和指针域赋值。由于新插入的节点总是尾节点,因此,它的指针域的值为空(即NULL)。3)将新节点链接到链表的尾部:4)重复步骤2)3),继续插入新节点直到结束。,例1:存储三个同学的计算机成绩的链表存储方式如下:,上述链表中节点的定义如下:struct node int data;struct node*next;链表的头指针定义如下:struct node*head;,9.5.3 链表的基本操作,例9.4 用链表存储学生的计算机成绩。程序段如下:,struct node*creat()struct node*head,*p,
19、*q;n=0;head=NULL;p=(struct node*)malloc(LEN);scanf(%d,#define NULL 0#define LEN sizeof(struct node)struct node int data;struct node*next;int n;,q,p,(2)链表节点的访问。链表节点的访问过程如下:1)取链表头指针head。2)用一个指针p指向链表的第一个节点,即p=head。3)访问p所指节点。4)移动指针p,使它指向下一节点,即p=p-next。5)重复步骤3)和4),直到指针p为空。,9.5.3 链表的基本操作,例9.5 输出例9.4建立的链表中
20、所有学生的计算机成绩。程序段如下:,#define NULL 0#define LEN sizeof(struct node)struct node int data;struct node*next;void print(struct node*head)struct node*p;p=head;while(p!=NULL)printf(%d,p-data);p=p-next;,p,p,p,(3)链表节点的插入。其操作过程主要有两个子过程:确定插入位置;插入新节点。插入条件的要求主要有以下几种情况:新节点插入在第i个节点之前(或后)。新节点插入在节点数据等于某一指定数据的节点之前(或后)。新
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 级C语言程序设计 语言程序设计 结构 共用
链接地址:https://www.31ppt.com/p-5024464.html