计算机二级考试c语言3

上传人:第*** 文档编号:49796709 上传时间:2018-08-03 格式:PPT 页数:43 大小:1.86MB
返回 下载 相关 举报
计算机二级考试c语言3_第1页
第1页 / 共43页
计算机二级考试c语言3_第2页
第2页 / 共43页
计算机二级考试c语言3_第3页
第3页 / 共43页
计算机二级考试c语言3_第4页
第4页 / 共43页
计算机二级考试c语言3_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《计算机二级考试c语言3》由会员分享,可在线阅读,更多相关《计算机二级考试c语言3(43页珍藏版)》请在金锄头文库上搜索。

1、本章重点 三种用户构造的数据类型:10.1 用typedef说明一种新类型名 typedef:对已有的类型,说明一个新的类型标识符10.2 结构体类型 struct:把具有相互关系的不同类型数据组成一个有机整体 。10.3 共用体 union:使几种不同类型的变量共用一段存储空间第10章 结构体(struct)、共用体(union)和 用户自定义类型(typedef)10.1 用typedef说明一种新类型名语言允许用typedef说明一种新类型名,说明新 类型名的语句一般形式为: typedef 类型名 标识符;/用标识符来代表已存在 的“类型名”,并未产生新的数据类型,原有类型名 依然有效

2、。typedef int INTEGER/可用INTEGER来代替int作 整型变量的类型说明 例如:INTEGER a,b; 等效于:int a,b; 又如:typedef char * CHARP;( CHARP表示指向字 符型数据的指针类型)CHARP p;等效于:char *p;10.2 结构体类型结构体类型说明的一般形式是: struct 结构体标识名 类型名1 结构成员名表1;类型名2 结构成员名表2; 类型名n 结构成员名表n; ; 其中struct是关键字,是结构体类型的标志。“结构体标识名” 和“结构成员名”都是用户定义的标识符。其中“结构体标识 名”是可选项,在说明中可以不

3、出现。成员表列由若干个成员 组成,由一对大括号括起来,每个成员都是该结构的一个组成 部分,对每个成员也必须作类型声明,花括号 最后的分号不能 省。以学生档案为例,说明结构体类型的说明方法: 姓名(name):字符串 性别(sex):字符型 出生日期(birthday):date结构体 四门课成绩(sc):一维实型数组 例如:struct dateint year,month,day;struct student char name12;char sex;struct date birthday;float sc 4; 10.2.2 结构体类型的变量的定义 定义结构体类型变量、数组和指针变量如下

4、3种方法 : 1紧跟在结构体说明之后进行定义。例如:struct student /结构体类型说明char name12;char sex;struct date birthday;float sc 4;std,pers3,*pstd; / std为结构体类型变量;pers3为结构体类型数组; pstd为指向结构体类型的指针2先说明结构体类型,再单独进行变量定义。例如: struct student /结构体类型说明 char name12,sex; struct date birthday; float sc 4; struct student std,pers3,*pstd; 3 使用ty

5、pedef说明结构体类型名,用新类型名定义变量。如 : typedef struct /结构体类型说明 char name12,sex; struct date birthday; float sc 4; STREC;/ STREC是新结构体类型名,能唯一标识此结构体 STREC std,pers3,*pstd; 10.2.3 给结构体变量、数组赋初值 1.给结构体变量赋初值:所赋初值顺序放在一对花括号中 例如:struct student /结构体类型说明char name12,sex;struct date birthday;float sc 4;std=“Li Ming”,M,1962,

6、5,10,88,76,85.5,90; 2.给结构体数组赋初值struct bookcardchar num5;float money;bk3=“No.1”,35.5,“No.2”,25.0,“No.3”,66.7;/*bk0 bk1 bk2 */10.2.4 引用结构体变量中的数据 1.对结构体变量成员引用的三种方式: (1)结构变量名.成员名/.表示成员运算符 (2)指针变量名-成员名/-表示结构指向运算符 (3)(*指针变量名).成员名 struct student /结构体类型说明 char name12,sex; struct date birthday; float sc 4; s

7、td,arr5,*ps; ps=(1)若要引用结构体变量std中的sex成员,可写作:std.sex /*通过结构体变量引用*/ps-sex /*通过指针变量引用*/(*ps).sex /*通过指针变量引用*/ (2)若要引用结构体变量std中的数组成员sc中的元素 sc2,可写作:std.sc2、 ps-sc2 、 (*ps). sc2 (3)若结构体变量中的成员是作为字符串使用的字符 型数组,如结构体中的成员name,其引用形式可 写作:std.name 、 ps-name 、 (*ps). name (4)若要引用结构体变量std中内嵌成员,可写作: std.birthday.year

8、、 ps-birthday.year 、 (*ps). birthday.year 2.通过指针变量引用结构体成员应注意运算符的优先 级顺序:()-(结构指向运算符).(结构体成员运算符) 高于 !+ - *(间接运算符) 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; void main() REC a=16,90.0,b=16,90.0; sub1(a); printf(“A)%d,%5.1lfn“,a.num,a.mark); sub2(b);

9、printf(“B)%d,%5.1lfn“,b0.num,b0.mark); 5. 函数的返回值是结构体类型#include typedef struct int a;char b; ST; ST fun(ST x) /函数的返回值类型是结构体类型ST x.a=99;x.b=S; return x; void main() ST y;y.a=0;y.b=A; printf(“y.a=%d y.b=%cn“,y.a,y.b); fun(y); 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);

10、 6. 函数的返回值可以是指向结构体变量的指针类型 例10.4 通过函数返回值返回指向结构体变量的指针。 #include typedef struct int a;char b; ST; ST *fun(ST x) /函数的返回值类型是ST*类型 ST *px; x.a =100;x.b=C; px= return px; /形参重新分配空间void 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=%c.n“,(*p).a,p-b); pri

11、ntf(“y.a=%d y.b=%c.n“,y.a,y.b); 10.2.6 利用结构体变量构成链表(数据域+指针域) 1.结构体中含有可以指向本结构体的指针成员 当一个结构体中有一个或多个成员的基类型是本结构 体类型时,即为“引用自身的结构体”。例如: typedef struct node int data;/data为数据域 struct node *next;/next表示指向本结构体类型的指针 , NODETYPE; 静态链表:由系统在内存中开辟固定的、不一定连续 的存储单元,在程序执行过程中,不能人为产生新的 存储单元,也不能人为开辟新单元。例10.6 一个简单的链表:#inclu

12、de typedef struct node int data; struct node* next; NODETYPE; void main() NODETYPE a, b, c, *head, *p; a.data=10; b.data=20; c.data=30;/给变量中的data域赋值 head=/将结点相连 a.next= b.next= c.next=0; p=head; printf(“head“); while(p)/移动p依次指向a,b,c,输出它们data域中的值 printf(“-%d“,p-data);p=p-next; /p顺序后移 printf(“-endn“);

13、 2. 动态链表 链表中的每个存储单元都由动态存储分配获得,每个 结点包括存储数据本身的数据域和存放下一个结点 元素地址的指针域。链表用一个头指针head来指向链 表的开始,head中存放了链表第一个结点的地址。 3.单向链表 单向链表:链表的每个结点只有一个存放下一个结点 地址的指针域,只能从当前结点找到后继结点。链表 的建立、结点数据域的输出、结点的插入和删除。 结点的类型定义:typedef struct slistint data;struct slist* next;SLIST;(1)建立带头结点的单向链表主要操作步骤:读取数据生成新结点将数据存入结点的成 员变量将新结点插入链表 (

14、2)顺序访问链表中各结点的数据域只需利用一个工作指针使得:p=p-next (3)在单向链表中插入结点 当把s指向的新结点插入到p所指向的结点之前步骤 : 用s来指向新开辟的结点用p指向插入的位置 q指向p的前驱结点 即s-next=p; q-next=s; (4)删除单向链表中的结点q-next =p-next;(1)编写函数creat_slist1,建立带有头结点的单向链表。结点数据域中的数 值从键盘输入,以-1作为输入结束标志。链表的头结点的地址由函数值返 回。 (2)编写函数print_slist,顺序输出单向链表各结点数据域中的内容。 (3)编写函数insert_snode,它的功能

15、是:在值为x的结点前插入值为y的结 点,若值为x的结点不存在,则插在表尾。(4)删除单向链表中的结点。 #include #include typedef struct slist int data; struct slist* next; SLIST;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; void print_slist(SLIST *head) /顺序输出单向链表各结点数据域中的内容 SLIST* p=head-next; /p指向头结点后的第一个结点 if(p=0)printf(“Linklist is null!n“);/链表为空(只有头结点) else printf(“head“); do printf(“-%d“,p-data); /输出当前结点数据域中的值 p

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号