《结构体共同体和用户定类型》由会员分享,可在线阅读,更多相关《结构体共同体和用户定类型(30页珍藏版)》请在金锄头文库上搜索。
1、第十四章、结构体、共同体和用户定义类型 14.1 结构体与共用体类型数据的定义方法和引用方法一、用一、用typedef说明一种新的类型名说明一种新的类型名格式:格式:typedef类型名类型名标识符标识符;例子:例子:typedefintINTEGER;INTEGERm,n;/等价于等价于intm,n;Typedefchar*CHARP;CHARPp;/等价于等价于char*p;二、结构体类型二、结构体类型一般格式:一般格式:struct结构体标识符名结构体标识符名类型名类型名1结构体成员名表结构体成员名表1;类型名类型名2结构体成员名表结构体成员名表2;类型名类型名n结构体成员名表结构体成员
2、名表n;;例如:例如: structdateintyear,month,day;注意:注意:1、类类型型名名1-类类型型名名n不不仅仅可可以以是是简简单单数数据据类类型型,也也可可以以复杂的构造类型,包括结构类型。复杂的构造类型,包括结构类型。例如:例如:structstudentcharname12;charsex;stuctdatebirthday;floatsc4;2、结结构构体体类类型型只只是是说说明明了了这这种种类类型型结结构构的的模模式式,这这时时没没有分配内存空间。有分配内存空间。结构体类型变量、数组和指针变量的定义结构体类型变量、数组和指针变量的定义(1)紧跟在机构体类型说明之
3、后)紧跟在机构体类型说明之后例如:例如:structstudentcharname12;charsex;stuctdatebirthday;floatsc4;std,pers3,*pstd;结构体类型变量、数组和指针变量的定义结构体类型变量、数组和指针变量的定义(2)无名结构体类型之后)无名结构体类型之后例如:例如:structstd,pers3,*pstd;(3)先说明结构体类型,再单独进行变量定义先说明结构体类型,再单独进行变量定义例如:例如:struct;structstudentstd,pers3,*pstd;(4)用typedeftypedefstructcharname12;cha
4、rsex;structdatebirthday;floatsc4;STREC;STRECstd,pers3,*pstd;给结构体变量、数组赋初值给结构体变量、数组赋初值1、给结构体变量赋初值、给结构体变量赋初值所赋初值顺序放在花括号种,结构体成员顺序一一赋所赋初值顺序放在花括号种,结构体成员顺序一一赋值,对于为给初值的成员系统自动给定值值,对于为给初值的成员系统自动给定值例如:例如:structstudentcharname12;charsex;stuctdatebirthday;floatsc4;std=“LiMing”,M,1962,5,10,88,76,85.5,90;2、结构体数组赋初
5、值、结构体数组赋初值例:例:structbookcardcharnum5;floatmoney;bk3=“NO.1”,35.5,“NO.2”,25.0,“NO.3”,55.7;结构体类型变量的引用结构体类型变量的引用在定义了结构体变量后,可以采用下列方法引用在定义了结构体变量后,可以采用下列方法引用结构体类型的变量:结构体类型的变量:结构体变量名结构体变量名.成员名成员名这里这里.是成员是成员(分量分量)运算符,它在所有的运算符,它在所有的运算符中优先级最高。运算符中优先级最高。对于指针指针变量名-成员名(*指针变量名).成员名例如:structstudentcharname12;charse
6、x;stuctdatebirthday;floatsc4;std,arr5,*ps;ps=&std;std.sexps-sex(*ps).sexps-sc2函数之间结构体变量的数据传递和普通其他简单数据类型相同.(1)向函数传递结构体变量中的单个成员数据(2)向函数传递整个结构体变量中的数据。(3)传递结构体变量的地址(指针)。例题14.1#includetypeofstructchars10;intt;STgetdata(ST*p)scanf(“%s%d”,p-s,&p-t);main()STa;getdata(&a);printf(“%s,%dn”,a.s,a.t);(4)向函数传递结构体
7、数组名(5)函数返回值是结构体类型(6)函数返回值是结构体变量指针三、利用结构体变量构成链表三、利用结构体变量构成链表链表作为一种常用的、能够实现动态存储分配的数据结构,在数据结构课程中有详细介绍。为方便没有学过数据结构的读者,本书从应用角度,对链表作一简单介绍。l头指针变量head指向链表的首结点。l每个结点由2个域组成:1)数据域存储结点本身的信息。2)指针域指向后继结点的指针。l尾结点的指针域置为“NULL(空)”,作为链表结束的标志 链表概述链表概述 数组数组 顺序存储结构顺序存储结构 随机存取随机存取 逻辑关系上相邻的两个元素在物理位置上也相邻逻辑关系上相邻的两个元素在物理位置上也相
8、邻1.1.数组的致命弱点:数组的致命弱点:(1)(1)在对数组进行插入或删除操作时,需移动大量数组元素在对数组进行插入或删除操作时,需移动大量数组元素(2)(2)在数组的长度是固定的而且必须预先定义,数组的长在数组的长度是固定的而且必须预先定义,数组的长度难以缩放,对长度变化较大的数据对象要预先按最大空度难以缩放,对长度变化较大的数据对象要预先按最大空间分配,使存储空间不能得到充分利用间分配,使存储空间不能得到充分利用 在单链表,通常称它的数据元素为结点,每个结在单链表,通常称它的数据元素为结点,每个结点都是一个结构体,至少包括两个成员:存储数据元点都是一个结构体,至少包括两个成员:存储数据元
9、素信息的成员称为数据域;存储直接后继结点存储位素信息的成员称为数据域;存储直接后继结点存储位置的成员称为指针域置的成员称为指针域. . 显然,链表结点的指针域存放的地址类型与它自身显然,链表结点的指针域存放的地址类型与它自身的类型是相同的。的类型是相同的。 这就是这就是C C语言中较为特殊的递归结构体或自引用语言中较为特殊的递归结构体或自引用结构体,这种结构体具指向自身结构体的指针,一结构体,这种结构体具指向自身结构体的指针,一般在实现链表、树等数据结构时会用到这种特殊的般在实现链表、树等数据结构时会用到这种特殊的结构体。结构体。每个链表都有一个每个链表都有一个“头指针头指针”headhead
10、,整个链表的访问整个链表的访问必须从头指针开始进行,头指针指示链表中的第一个必须从头指针开始进行,头指针指示链表中的第一个结点的存储位置,习惯上将结点的存储位置,习惯上将“头指针头指针”headhead指示的链指示的链表简称为链表表简称为链表headhead,下同。同时,由于最后一个数据下同。同时,由于最后一个数据元素没有直接后继结点,则链表中最后一个结点的指元素没有直接后继结点,则链表中最后一个结点的指针为针为“空空”(NULLNULL,即空地址)。即空地址)。 要使用链表,首先应定义结点的类型,再定义相应要使用链表,首先应定义结点的类型,再定义相应的结构体变量。例如,前面链表中结点的结构类
11、型可的结构体变量。例如,前面链表中结点的结构类型可以定义为:以定义为:structstruct student student char name10 char name10; structstruct student *next student *next; ; 其中,其中,nextnext为指针变量,其类型为结构体类型为指针变量,其类型为结构体类型studentstudent,它可存储一个它可存储一个studentstudent结构体类型变量的地结构体类型变量的地址,即实现链表中指向下一个结点的指针域。址,即实现链表中指向下一个结点的指针域。 这是一个递归定义,它在结构体这是一个递归定义,
12、它在结构体studentstudent的定义的定义未完成时又引用它定义其它的变量(指针变量)。未完成时又引用它定义其它的变量(指针变量)。 单向链表1.单行链表的建立操作步骤:(1)读取数据(3)生成新节点(3)将数据存入节点的成员变量中(4)将新的节点插入到链表中。2.单向表的插入(3)遍历链表(4)删除单向链表的节点q-next=p-next;free(p);三、共同体类型说明:union共同体表示名类型名1共同体成员名1;类型名n共同体成员名n;例如:Unionun_1inti;floatx;charch;共同体变量的定义unionun_1inti;floatx;charch;s1,s2,*p;注意:(1)共同体变量所有成员共享存储空间。与结构体区别:结构体的每个成员分别占有独立的存储空间;而共同体重所有的成员共享一段公共的存储空间;例如un_1类型变量s1的存储如下:(2)共同体变量中所有成员的首地址与该变量地址相同。如&s1=&s1.i=&s1.x。(3)共同体变量在定义时,只能对用第一个成员的类型值进行初始化。共用体变量的引用可以用下面的形式引用共用体变量:共用体变量名.成员名对于指针指针变量名-成员名(*指针变量名).成员名例如:s1.x=123.4;s1.i=100;printf(“%fn”,s1.x);