结构体、共用体和用户定义类型.ppt

上传人:本田雅阁 文档编号:2097373 上传时间:2019-02-13 格式:PPT 页数:49 大小:3.87MB
返回 下载 相关 举报
结构体、共用体和用户定义类型.ppt_第1页
第1页 / 共49页
结构体、共用体和用户定义类型.ppt_第2页
第2页 / 共49页
结构体、共用体和用户定义类型.ppt_第3页
第3页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《结构体、共用体和用户定义类型.ppt》由会员分享,可在线阅读,更多相关《结构体、共用体和用户定义类型.ppt(49页珍藏版)》请在三一文库上搜索。

1、第14章 结构体共用体和用户定义类型,第14章 结构体共用体和用户定义类型,在C语言中可由用户构造的三种数据类型:,第14章 结构体共用体和用户定义类型,用typedef说明一种新类型名 结构体类型 结构体类型的说明 结构体类型的变量数组和指针变量的定义 给结构体变量数组赋初值 引用结构体变量中的数据 函数之间结构体变量的数据传递 利用结构体变量构成链表 共用体 共用体类型的说明和变量定义 共用体变量的引用,用typedef说明一种新类型名,一般形式为: typedef 类型名 标识符; 其中,“类型名”必须是在此语句之前已有定义的类型标识符 “标识符”是一个用户定义标识符,用作新的类型名 t

2、ypedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型,原有类型名依然有效,typedef int INTEGER; 把一个用户命名的标识符INTEGER说明成int类型的类型名在此说明之后,可以用标识符INTEGER来定义整型变量例如: INTEGER m, n; 等价于int m, n; 也就是说:INTEGER是int的一个别名为了便于识别,一般习惯将新的类型名用大写字母表示,例如,结构体类型,一个结构体类型可以由若干个称为成员的成分组成不同的结构体类型可根据需要,由不同的成员组成,各个成员的类型可以不同,这是结构体与数组的重要区别 当需要把一些相关信息组

3、合在一起时,采用结构体类型很方便,struct结构体标识名 类型名1 结构成员名表1; 类型名2 结构成员名表2; 类型名n 结构成员名表n; ; 其中struct是关键字,是结构体类型的标志“结构体标识名”和“结构成员名”都是用户定义的标识符“结构体标识名”是可选项,形式,结构体类型的说明,结构体类型结构体类型的说明,struct student char name12; char sex; struct int year; int month; int day; birthday; float sc4; ;,例如,结构体类型结构体类型的变量数组和指针变量的定义,1)紧跟在结构体类型说明之后

4、进行定义 struct student char name12; char sex; struct date birthday; float sc4; std, pers3, * pstd; 变量std的结构如图所示 具有这一结构体类型的变量中只能存放一组数据结构体变量中的各成员在内存中按说明中的顺序依次排列,结构体类型结构体类型的变量数组和指针变量的定义,2)在说明一个无名结构体类型的同时,直接进行定义 struct char name12; char sex; struct date birthday; float sc4; std, pers3, * pstd;,3)先说明结构体类型,再

5、单独进行变量定义例如: struct char name12; char sex; struct date birthday; float sc4; ; struct student std, pers3, * pstd;,结构体类型结构体类型的变量数组和指针变量的定义,4)使用typedef说明一个结构体类型名,再用新类型名来定义变量 typedef struct char ame12; char sex; struct date brthday; float sc4; STREC; STREC std, pers3, * pstd;,结构体类型 给结构体变量数组赋初值,struct stu

6、dent char name12; char sex; struct date birthday; float sc4; std =Li Ming, M ,1962,5,10,88,76,85.5,90; 变量std的内容如图所示,对结构体变量赋初值时, C编译程序按每个成员在结构体中的顺序一一对应赋初值,对于后面未赋初值的成员,系统将自动为数值型和字符型数据赋初值零,1 .给结构体变量赋初值,结构体类型 给结构体变量数组赋初值,例1: struct bookcard char num5; float money; bk3 = NO.1,35.5, NO.2,25.0, NO.3,66.7 ;

7、,例2: struct char ch; int i; float x; arr23 = a ,1,3 e10 , a ,2,4 e10 , a ,3,5 e10 , /*第一行*/ b ,1,6 e5 , b ,2,7 e5 , b ,3,8 e5 /*第二行*/ ;,2 .给结构体数组赋初值,结构体类型 引用结构体变量中的数据,若已定义了一个结构体变量和基类型为同一结构体类型的指针变量,并使该指针指向同类型的变量,则可用以下三种形式来引用结构体变量中的成员 1)结构体变量名.成员名 2)指针变量名-成员名 3) (*指针变量名) .成员名 其中点号.称为成员运算符;箭头-称为结构指向运算符

8、,它由减号-和大于号构成,它们之间不得有空格。,1 .对结构体变量成员的引用,结构体类型 引用结构体变量中的数据,1)若要引用结构体变量std中的sex成员,可写作: std.sex /*通过结构体变量引用*/ ps-sex /*通过指针变量引用*/ (*ps).sex /*通过指针变量引用*/ 注意,这时指针变量ps必须已指向确切的存储单元 若要引用arr0中的sex成员,可用arr0.sex,不能用arr.sex,1 .对结构体变量成员的引用,结构体类型 引用结构体变量中的数据,2)若要引用std中的sc2时,可用std.sc2或ps -sc2或(* ps).sc2,不能用std.sc。C

9、语言不允许对数组整体访问(字符串除外),只能逐个引用其元素 3)若结构体变量中的成员是作为字符串使用的字符型数组,如结构体中的成员name,其引用形式可以是std.name或ps -name或(* ps).name或arr0. name,1 .对结构体变量成员的引用,结构体类型 引用结构体变量中的数据,4)结构体变量中内嵌结构体变量成员的引用 访问结构体变量中各内嵌结构体成员时,必须逐层使用成员名定位例如, std.birthday.year ps -birthday.year (* ps).birthday.year,1 .对结构体变量成员的引用,结构体类型 引用结构体变量中的数据,1)以下

10、对相应变量中的name成员所进行的操作都是合法的: scanf(% s, std.name); 或 gets( std.name); pstd =,2 .对结构体变量中的成员进行操作,结构体类型 引用结构体变量中的数据,2)以下对相应变量中的sex成员进行操作: scanf (% c, ,2 .对结构体变量中的成员进行操作,结构体类型 引用结构体变量中的数据,3)以下对相应变量中的birthday成员中的year进行操作: scanf (% d, ,2 .对结构体变量中的成员进行操作,结构体类型 引用结构体变量中的数据,4)以下对相应变量中的成员数组sc中的元素进行操作: for ( j =0

11、; j sc j ); for ( i =0; i 3; i+) for ( j =0; j 5; j+) scanf (% f, ,结构体类型 引用结构体变量中的数据,4 .相同类型结构体变量之间的整体赋值 相同类型的结构体变量之间可进行整体赋值,3 .通过指针变量引用结构体成员的注意事项 当通过指针变量来引用结构体成员,并且与+-等运算符组成表达式时,应当根据运算符的优先级别来确定表达式的含义,结构体类型函数之间结构体变量的数据传递,结构体类型函数之间结构体变量的数据传递,#include typedef struct char s10; int t; ST; getdata ( ST *

12、p ) /*形参为结构体类型的指针变量*/ scanf (% s %d, p-s, ,结构体类型函数之间结构体变量的数据传递,例14 .1 通过函数给结构体成员赋值,结构体类型函数之间结构体变量的数据传递,#include typedef struct int num; double mark; REC; void sub1( REC x ) x.num=23; x.mark=81.5; void sub2( REC y) y0. num=12; y0. mark =77.5; ,结构体类型函数之间结构体变量的数据传递,例14 .2 对比向函数传递结构体数组名和向函数传递结构体变量名的区别,m

13、ain( ) REC a=16,90.0 , b =16,90.0 ; sub1( a); printf(A ) % d, %5.1 lfn, a.num, a.mark); sub2( b); printf(B) % d, %5.1 lfn, b0. num, b0. mark); ,A)16,90.0 B)12,77.5,结果,结构体类型函数之间结构体变量的数据传递,#include typedef struct int a; char b; ST; ST fun ( ST x) /*函数的返回值类型是结构体类型ST */ x.a =99; x.b = S ; return x; main

14、() ST y; y.a=0; y.b=A ; printf(y.a =%d y.b =%cn, y.a, y.b ); y=fun ( y); printf(y.a =%d y.b =%cn, y.a, y.b ); ,例14 .3 通过函数返回结构体类型的值,y.a=0 y.b=A y.a=99 y.b=S,结果,5 .函数的返回值是结构体类型,结构体类型函数之间结构体变量的数据传递,#include typedef struct int a; char b; ST; ST *fun ( ST x) /*函数的返回值是ST *类型*/ ST *px; x.a =100; x.b = C ;

15、 px = ,例14 .4 通过函数的返回值返回指向结构体变量的指针,y.a =999 y.b =X (* p).a =100 (* p).b =C,结果,6 .函数的返回值可以是指向结构体变量的指针类型,结构体类型函数之间结构体变量的数据传递,#include stdio.h #include string.h #define N 5 typedef struct char name20; char num10; USER; void getdata ( USER *sp ); void getsort ( USER *sp ); void outdata ( USER *sp ); mai

16、n( ) USER sp N; getdata ( sp ); getsort ( sp ); outdata ( sp ); ,例14 .5 读入五位用户的姓名和电话号码,按姓名的字典顺序排列后,输出用户的姓名和电话号码,第一页,6 .函数的返回值可以是指向结构体变量的指针类型,结构体类型函数之间结构体变量的数据传递,void getdata ( USER *sp ) int i; printf (Enter name ,例14 .5 读入五位用户的姓名和电话号码,按姓名的字典顺序排列后,输出用户的姓名和电话号码,第二页,6 .函数的返回值可以是指向结构体变量的指针类型,结构体类型函数之间结

17、构体变量的数据传递,void getsort ( USER *sp ) int i, j, k; USER temp; for ( i =0; i 0) k =j; temp =sp k; sp k = sp i; sp i = temp; /*结构体整体赋值*/ ,例14 .5 读入五位用户的姓名和电话号码,按姓名的字典顺序排列后,输出用户的姓名和电话号码,第三页,6 .函数的返回值可以是指向结构体变量的指针类型,结构体类型 利用结构体变量构成链表,当一个结构体中有一个或多个成员的基类型就是本结构体类型时,把这种结构体称为可以“引用自身的结构体” 例如: struct link char c

18、h; struct link *p; a; 在这里, p是一个可以指向struct link类型变量的指针成员,因此, a.p =&a是合法的表达式,由此构成的存储结构如图所示,1 .结构体中含有可以指向本结构体的指针成员,结构体类型 利用结构体变量构成链表,#include struct node int data; struct node *next; ; typedef struct node NODETYPE; main() NODETYPE a, b, c, * h, * p; a.data =10; b.data =20; c.data =30; /*给变量中的data域赋值*/

19、h = ,例14 .6 一个简单的链表:,结构体类型 利用结构体变量构成链表,main函数中定义的变量abc都是结构体变量,它们都含有data和next两个成员;变量h和p是指向NODETYPE结构体类型的指针变量,它们与结构体变量abc中的成员变量next类型相同 执行程序中的赋值语句后,形成如图所示的存储结构 在此例中,链接到一起的每个结点(结构体变量abc)都是通过定义,由系统在内存中开辟固定的不一定连续的存储单元,在程序执行的过程中,不可能人为地再产生新的存储单元,称这种链表为“静态链表”,1 .结构体中含有可以指向本结构体的指针成员,结构体类型 利用结构体变量构成链表,在程序执行过程

20、中,根据需要动态分配的存储单元,其地址不一定是连续的,利用链表的存储结构反映数据之间的相互联系在链表的每个结点中,除了要有存放数据本身的数据域外,至少还需要有一个指针域,用它来存放下一个结点元素的地址,以便通过这些指针把各结点连接起来,从而形成如图所示的链表 链表中的每个存储单元都由动态存储分配获得,这样的链表称为“动态链表” 链表的每个结点只有一个指针域,每个指针域存放着下一个结点的地址,因此,这种链表只能从当前结点找到后继结点,故称为“单向链表”,2 .动态链表的概念,结构体类型 利用结构体变量构成链表,单向链表的每个结点由两个成员组成:一个是整型的成员;一个是指向自身结构的指针类型成员结

21、点的类型定义如下: struct slist int data; struct slist *next; ; typedef struct slist SLIST;,3 .单向链表,结构体类型 利用结构体变量构成链表,(1)建立带有头结点的单向链表 建立单向链表的主要操作步骤如下: 读取数据 生成新结点 将数据存入结点的成员变量中 将新结点插入到链表中重复上述操作直至输入结束,3 .单向链表,结构体类型 利用结构体变量构成链表,#include #include SLIST *creat_slist1() int c; SLIST *h, * s, * r; h =( SLIST *) mal

22、loc ( sizeof ( SLIST) ); r =h ; scanf(% d, ,例14 .7 编写函数creat_slist1,建立如图14.5所示的带有头结点的单向链表结点数据域中的数值从键盘输入,以-1作为输入结束标志链表的头结点的地址由函数值返回,main() SLIST *head; head =creat_slist1 ( ); ,结构体类型 利用结构体变量构成链表,#include #include void print_slist ( SLIST *head ) SLIST *p; p=head-next; if ( p= 0 ) printf (Linklist is

23、null! n); else printf (head); do printf (% d, p-data ); p =p-next; while ( p ! = 0 ); printf(endn); ,2)顺序访问链表中各结点的数据域 例14 .8 编写函数print_slist,顺序输出单向链表各结点数据域中的内容,结构体类型 利用结构体变量构成链表,在单向链表中插入结点,首先要确定插入的位置当待插结点插在指针p所指的结点之前称为“前插”;当待插结点插在指针p所指的结点之后称为“后插”图示意了“前插”操作过程中各指针的指向 图中用s来指向新开辟的结点;用p指向插入的位置;q指向p的前趋结点,

24、3)在单向链表中插入结点,结构体类型 利用结构体变量构成链表,在进行插入操作的过程中,可能遇到三种情况: 链表非空,值为x的结点存在,新结点应插在该结点之前 链表非空,但值为x的结点不存在,按要求,新结点应插在表尾 链表为空表,这种情况相当于值为x的结点不存在,新结点应插在表尾,即插在头结点之后,作为表的第一个结点,3)在单向链表中插入结点 例14 .9 编写函数insert_snode,它的功能是:在值为x的结点前插入值为y的结点,若值为x的结点不存在,则插在表尾,结构体类型 利用结构体变量构成链表,#include #include insert_snode ( SLIST *head,

25、int x, int y ) SLIST *s,* p,* q; s =( SLIST *) malloc ( sizeof ( SLIST) ); s-data =y; q =head; p =head-next; while ( ( p ! = 0 ) ,3)在单向链表中插入结点 例14 .9 编写函数insert_snode,它的功能是:在值为x的结点前插入值为y的结点,若值为x的结点不存在,则插在表尾,结构体类型 利用结构体变量构成链表,为了删除单向链表中的某个结点,首先要找到待删结点的前趋结点,然后将此前趋结点的指针域去指向待删结点的后续结点( q -next =p -next),最

26、后释放被删结点所占存储空间( free( p)即可下图示意了结点的删除操作,4)删除单向链表中的结点,共用体,共用体的类型说明和变量的定义方式与结构体的类型说明和变量定义的方式完全相同,不同的是,结构体变量中的成员各自占有自己的存储空间,而共用体变量中的所有成员占有同一个存储空间,共用体,1 .共用体类型的说明,其中union是关键字,是共用体类型的标志 un_1是共用体标识名,共用体,2 .共用体变量的定义 共用体变量的定义和结构体变量的定义相似,也可以采用四种方式,这里变量s1的存储空间如图所示,共用体,2 .共用体变量的定义 共用体变量的定义和结构体变量的定义相似,也可以采用四种方式,共用体,1 .共用体变量中成员的引用 共用体变量中每个成员的引用方式与结构体完全相同,可以使用以下三种形式之一: 1)共用体变量名.成员名 2)指针变量名-成员名 3) (*指针变量名).成员名 2 .共用体变量的整体赋值 两个类型相同的共用体变量之间可以进行赋值操作 3 .向函数传递共用体变量的值 同结构体变量一样,共用体类型的变量可以作为实参进行传递,也可以传送共用体变量的地址,共用体,例14 .10 利用共用体类型的特点分别取出short型变量高字节和低字节中的两个数,给un的成员a赋值后,内存中数据的存储情况如图所示,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1