




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在C语言中可由用户构造的三种数据类型: 用typedef说明一种新类型名 结构体类型 结构体类型的说明 结构体类型的变量数组和指针变量的定义 给结构体变量数组赋初值 引用结构体变量中的数据 函数之间结构体变量的数据传递 利用结构体变量构成链表 共用体 共用体类型的说明和变量定义 共用体变量的引用 一般形式为: typedef 类型名 标识符; 其中,“类型名”必须是在此语句之前已有定义的类型标识符 “标识符”是一个用户定义标识符,用作新的类型名 typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未 产生新的数据类型,原有类型名依然有效 typedef int INTEGER; 把一个用户命名的标识符INTEGER说明成int类型的类型名 在此说明之后,可以用标识符INTEGER来定义整型变量例如: INTEGER m, n; 等价于int m, n; 也就是说:INTEGER是int的一个别名为了便于识别,一般习惯 将新的类型名用大写字母表示 例如 一个结构体类型可以由若干个称为成员的成分组成不同的结构体类 型可根据需要,由不同的成员组成,各个成员的类型可以不同,这是结构体与 数组的重要区别 当需要把一些相关信息组合在一起时,采用结构体类型很方便 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)紧跟在结构体类型说明之后进行定义 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)先说明结构体类型,再单独进行变量定义例如: 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 student 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 ; 例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) (*指针变量名) .成员名 其中点号.称为成员运算符;箭头-称为结构指向运算符,它由减号-和大 于号构成,它们之间不得有空格。 1 .对结构体变量成员的引用 1)若要引用结构体变量std中的sex 成员,可写作: std.sex /*通过结构体变量引用*/ ps-sex /*通过指针变量引用*/ (*ps).sex /*通过指针变量引用*/ 注意,这时指针变量ps必须已指向确 切的存储单元 若要引用arr0中的sex成员,可用 arr0.sex,不能用arr.sex 1 .对结构体变量成员的引用 例如 struct student char name12; char sex; struct date birthday; float sc4; std, arr5, *ps; ps = 2)若要引用std中的sc2时,可用 std.sc2或ps -sc2或(* ps).sc2, 不能用std.sc。C语言不允许对数组 整体访问(字符串除外),只能逐个引 用其元素 3)若结构体变量中的成员是作为字 符串使用的字符型数组,如结构体中 的成员name,其引用形式可以是 或ps -name或(* ps).name 或arr0. name 1 .对结构体变量成员的引用 例如 struct student char name12; char sex; struct date birthday; float sc4; std, arr5, *ps; ps = 4)结构体变量中内嵌结构体变量成 员的引用 访问结构体变量中各内嵌结构体成 员时,必须逐层使用成员名定位例 如, std.birthday.year ps -birthday.year (* ps).birthday.year 1 .对结构体变量成员的引用 例如 struct student char name12; char sex; struct date birthday; float sc4; std, arr5, *ps; ps = 1)以下对相应变量中的name成员所进行的操作都是合法的: scanf(% s, ); 或 gets( ); pstd = scanf (% s, pstd -name); 或 gets ( pstd-name); for ( i =0; i sex ); 或 std-sex =getchar ( ); for( i =0; i dirthday.year ); for( i =0; i sc j ); for ( i =0; i typedef struct char s10; int t; ST; getdata ( ST *p ) /*形参为结构体类型的指针变量*/ scanf (% s %d, p-s, main ( ) ST a; getdata ( /*结构体变量的地址作实参*/ printf (% s, % dn, a.s, a.t ); 例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 对比向函数传递结构体数组名和向函数传递结构体变量名的区别 main( ) 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() 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 ; px = return px; main() ST y, * p; y.a =999; y.b = X ; printf(y.a =%d y.b =%cn, y.a, y.b ); p =fun ( y ); printf(* p).a =%d (* p).b =%cn, (* p).a, p-b ); 例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 ); main( ) USER sp N; getdata ( sp ); getsort ( sp ); outdata ( sp ); 例14 .5 读入五位用户的姓名和电话号码 ,按姓名的字典顺序排列后,输出用户的姓 名和电话号码 第一页 6 .函数的返回值可以是指向结构体变量的指针类型 void getdata ( USER *sp ) int i; printf (Enter name for ( i =0; i 0) k =j; temp =sp k; sp k = sp i; sp i = temp; /*结构体整体赋值*/ 例14 .5 读入五位用户的姓名和电话号码 ,按姓名的字典顺序排列后,输出用户的姓 名和电话号码 第三页 6 .函数的返回值可以是指向结构体变量的指针类型 当一个结构体中有一个或多个成员的基类型就是本结构体 类型时,把这种结构体称为可以“引用自身的结构体” 例如: struct link char ch; struct link *p; a; 在这里, p是一个可以指向struct link类型变量的指针成员,因 此, a.p = struct node *next; ; typedef struct node NODETYPE; main() NODETYPE a, b, c, * h, * p; a.data =10; b.data =20; c.data =30; /*给变量中的data域赋值*/ h = /*将结点相连*/ a.next = b.next = c.next = 0 ; p =h; while( p ) /*移动p,使之依次指向abc,输出它们data域中的值*/ printf(% d , p -data ); p=p-next; /* p顺序后移*/ printf(n); 例14 .6 一个简单的链表: main函数中定义的变量abc都是结构体变量,它们都含有data和next两 个成员;变量h和p是指向NODETYPE结构体类型的指针变量,它们与结构 体变量abc中的成员变量next类型相同 执行程序中的赋值语句后,形成如图所示的存储结构 在此例中,链接到一起的每个结点(结构体变量abc)都是通过定义,由系 统在内存中开辟固定的不一定连续的存储单元,在程序执行的过程中, 不可能人为地再产生新的存储单元,称这种链表为“静态链表” 1 .结构体中含有可以指向本结构体的指针成员 在程序执行过程中,根据需要动态分配的存储单元,其地址不一定是连续的,利 用链表的存储结构反映数据之间的相互联系在链表的每个结点中,除了要有 存放数据本身的数据域外,至少还需要有一个指针域,用它来存放下一个结点 元素的地址,以便通过这些指针把各结点连接起来,从而形成如图所示的链表 链表中的每个存储单元都由动态存储分配获得,这样的链表称为“动态链表” 链表的每个结点只有一个指针域,每个指针域存放着下一个结点的地址,因此, 这种链表只能从当前结点找到后继结点,故称为“单向链表” 2 .动态链表的概念 单向链表的每个结点由两个成员组成:一个是整型的成员;一个是指向自身结 构的指针类型成员结点的类型定义如下: 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 *) malloc ( sizeof ( SLIST) ); r =h ; scanf(% d, while ( c ! = -1) s =( SLIST *) malloc ( sizeof ( SLIST) ); s -data =c; r-next =s; r =s; scanf(% d, r-next = 0 ; return h ; 例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 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的前趋结点 3)在单向链表中插入结点 在进行插入操作的过程中,可能遇到三种情况: 链表非空,值为x的结点存在,新结点应插在该结点之前 链表非空,但值为x的结点不存在,按要求,新结点应插在表尾 链表为空表,这种情况相当于值为x的结点不存在,新结点应插在表尾,即插在 头结点之后,作为表的第一个结点 3)在单向链表中插入结点 例14 .9 编写函数insert_snode,它的功能是:在值为x的结点前插入值为y 的结点,若值为x的结点不存在,则插在表尾 #include #include insert_snode ( SLIST *head, int x, int y ) SLIST *s,* p,* q; s =( SLIST *) malloc ( sizeof ( SLIST) ); s-data =y; q =head; p =head-next; while ( ( p ! = 0 ) p =p-next; s-next =p; q-next =s; 3)在单向链表中插入结点 例14 .9 编写函数insert_snode, 它的功能是:在值为x的结点前插 入值为y的结点,若值为x的结点 不存在,则插在表尾 为了删除单向链表中的某个结点,首先要找到待删结点的前趋结点,然后将此 前趋结点的指针域去指向待删结点的后续结点( q -next =p -next),最后释放 被删结点所占存储空间( free( p)即可下图示意了结点的删除操作 4)删除单向链表中的结点 共用体的类型说明和变量的定义方式与结构体的类型说 明和变量定义的方式完全相同,不同的是,结构体变量中的成 员各自占有自己的存储空间,而共用体变量中的所有成员占有 同一个存储空间 1 .共用体类型的说明 形式 union共用体标识名 类型名1 共用体成员名1; 类型名2 共用体成员名2; 类型名n 共用体成员名n; ; 例如 union un_1 int i; float x; char ch; ; 其中union是关键字,是共用体类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软件与应用技能考试题库及答案
- 入学考试题库及答案大学
- 乳山国企考试题库及答案
- 融媒实务考试题及答案
- 2025年养老机构退出运营合同协议
- 2025货车司机劳务合同范本
- 理论考试题及答案
- 2025年城市电力网络工程施工总包合同
- 2025年住宅合作开发协议书样本
- 2025劳动合同补充协议
- 医院重症护理技能竞赛理论考试(CRRT)试题及答案
- 2025年新乡事业单位招聘考试笔试试卷(附答案)
- 厦门闽南话趣味教学课件
- 2025年秋期新课标人教版六年级上册数学全册教案(核心素养教案)
- 2025秋人教版八年级上册历史全册重点知识点早背晚默
- 2025年标准货物出口合同范本(中英文版)
- 2025年新钢铁安全员考试题库及答案
- 人教版四年级上册数学各单元教材分析(1-4单元)
- 2025版电子购销合同模板
- 护理中医小讲课课件
- 学校均衡编班管理办法
评论
0/150
提交评论