c语言第十章.ppt_第1页
c语言第十章.ppt_第2页
c语言第十章.ppt_第3页
c语言第十章.ppt_第4页
c语言第十章.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2020/9/7,1,第10章 自定义数据类型,前面学的是基本类型和数组(同一类型元素组成的构造类型)。 有时需要把不同类型的数据组合成一个有机的整体(这些数据是互相联系的),形成一个自定义数据类型。 如:一个学生的学号、姓名、性别、年龄、家庭住址、成绩等,它们属于不同的数据类型。 这就是结构体(记录)。,2020/9/7,2,10.1 结构体 10.2 共用体 10.3 用typeof定义数据类型 10.4 枚举类型 10.5 链表,第10章 自定义数据类型,2020/9/7,3,10.1.1 结构体类型定义 10.1.2 结构体变量的定义 10.1.3 结构体变量的引用 10.1.4 结构

2、体变量的初始化 10.1.5 结构体数组 10.1.6 指向结构体类型指针,10.1 结构体,2020/9/7,4,10.1.1 结构体类型定义(p213),struct 结构体名 数据类型 成员名; 数据类型 成员名; ;,成员类型 可以是基本型或构造型,标识符 缺省为无名结构体,标识符 亦称域,struct 结构体名 与基本类型名(如 int、char等) 地位、作用相同。是自定义类型名,而非变量名,2020/9/7,5,例 struct student short int num; char name20; char sex; short int age; float score; ch

3、ar addr30; ;,结构体类型定义 描述结构的组织形式,结构体类型的定义,2020/9/7,6,10.1.2 结构体变量的定义,struct 结构体名 类型符 成员名; 类型符 成员名; ;,例 struct student int num; char name20; char sex; int age; float score; char addr30; ;,一. 先定义结构体类型,后定义结构体变量,struct 结构体名 变量名表;,struct student stu1,stu2;,2020/9/7,7,例 struct student int num; char name20;

4、char sex; int age; float score; char addr30; ;,二. 定义结构体类型的同时定义结构体变量,struct 结构体名 类型符 成员名; 类型符 成员名; ;,变量名表列 ;,stu1,stu2 ;,2020/9/7,8,三. 直接定义结构体变量,用无名结构体直接定义 变量只能一次,struct 类型符 成员名; 类型符 成员名; ;,变量名表列 ;,2020/9/7,9,例 struct date int month; int day; int year; ;,例 struct student int num; char name20; struct

5、date int month; int day; int year; birthday; stu;,成员可以是 结构体,struct student int num; char name20; struct date birthday; stu;,2020/9/7,10,10.1.3 结构体变量的引用,成员(分量)运算符 优先级: 1 结合性:从左向右,引用方式:结构体变量名.成员名,例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,strcpy(stu2

6、.addr, ”QingDao”;),stu1.age+; stu2.score=stu1.score+2;,引用规则:不能整体引用,只能引用变量的成员,stu2.addr=” QingDao”;,2020/9/7,11,例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2;,stu1.birthday.month=12;,可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用,2020/9/7,12,10.1.4 结构体变量的初始化,s

7、truct 结构体名 类型符 成员名; 类型符 成员名; . ; struct 结构体名 结构体变量=初始数据;,2020/9/7,13,例 struct student int num; char name20; char sex; int age; char addr30; stu1=101,“Wang Lin”,M,19, “Dalian”;,如果某成员本身又是结构类型,则该成员的初值为一个初值表。如,student=“000102”, “张三”,1980,9,20。,10.1.4 结构体变量的初始化,2020/9/7,14,10.1.5 结构体数组,以同时定义为例: struct st

8、udent int num; char name20; char sex; int age; stu3;,一、结构体数组的定义 三种形式: 后定义 同时定义 直接定义,2020/9/7,15,struct student int num; char name20; char sex; int age; ; struct student stu =101,“Wanglin”,M,20, 103,“Ligang”,M,19, 107,“Liuyan”,F,19;,全部初始化时维数可省,二、结构体数组初始化,分行初始化,顺序初始化,101,“Wanglin”,M,20, 103,“Ligang”,M

9、,19, 107,“Liuyan”,F,19;,2020/9/7,16,三、结构体数组引用,引用方式: 结构体数组名下标.成员名,struct student int num; char name20; char sex; int age; stu3;,stu1.age+;,strcpy(,”Zhaodahai”);,2020/9/7,17,例1、统计候选人选票程序,以”#”为结束,每个候选人应该有两项:姓名、得票数,struct person char name20; int count; leader3=“Li”,0,“Zhang”,0,”Wang“,0;,投票:输入候选

10、人姓名 唱票:与leader中的名字比较,若相同则计数,2020/9/7,18,#include “stdio.h” #include “string.h” void main() int k,m; char leader_name20; gets(leader_name); while(strcmp(leader_name,”#”)!=0) for(m=0;m3;m+) if(strcmp(leader_name,)=0) leaderm.count+; gets(leader_name); for(k=0;k3;k+) printf(%5s:%dn,leaderk.

11、name, leaderk.count); ,struct person char name20; int count; leader3=“Li”,0,“Zhang”,0,”Wang“,0;,2020/9/7,19,10.1.6 指向结构体类型数据的指针,1. 指向结构体变量的指针,定义形式:struct 结构体名 *结构体指针名; 例 struct student *p;,2020/9/7,20,引用方式: ()成员名,等价于结构体变量成员名,括弧不可省,成员名,1.指向结构体变量的指针,如:(*p).num=0503012; p-num=0503012; stu1.num=0503012;

12、,10.1.6 结构体指针,struct student stu1,*p;,注:运算符“.”和 “-” 的优先级高于其他运算符,2020/9/7,21,试分析以下几种运算:,p-n P-n+ +p-n,p指向的结构体变量的成员 n 的值,p 指向的结构体变量中的成员 n 的值加 1(后加),p 指向的结构体变量中的成员 n 的值加 1(先加),2020/9/7,22,例3:,void main( ) struct student long int num;char name20; char sex;float score; ; struct student stu_1,*p; p = ,202

13、0/9/7,23,2.指向结构体数组的指针,例4:,struct student int num;char name20; char sex;int age; stu = 10101, 李林, M, 18, 10102, 张奋, M, 19, 10104, 王敏, F, 20; void main( ) struct student *p; printf( 学号 姓名 性别 年龄n); for(p = stu; p num, p-name, p-sex, p-age); ,2020/9/7,24,p = stu,p+1,p+2,2.指向结构体数组的指针,stu0,stu1,stu2,2020/

14、9/7,25,例5 有4个学生,每个学生包括学号、姓名、 成绩,要求找出成绩最高者的姓名和成绩。,分析:数据结构 每个学生的信息存放到结构体中 struct student int num; char name20; int score; ; struct student stu4存放4个学生的信息,2020/9/7,26,struct student int num;char name20;int score; ; void main() struct student stu4, *p; int i, temp = 0;int max; for (i=0; i max) max = stui

15、.score;temp = i; p = stu + temp; printf(学号:%dt姓名:%st成绩:%dn, p-num, p-name, p-score ); ,2020/9/7,27,结构体变量作为函数参数,用结构体变量的成员作参数-值传递 用指向结构体变量或数组的指针作参数-地址传递 用结构体变量作参数-多值传递,效率低,2020/9/7,28,struct data int a, b, c; ; main() void func(struct data); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; print

16、f(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func(arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); void func(struct data parm) printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Process.n); parm.a=18; parm.b=5; parm.c=parm.a*parm.b; printf(par

17、m.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Return.n); ,例 用结构体变量作函数参数,2020/9/7,29,struct data int a, b, c; ; main() void func(struct data *parm); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func( ,

18、例 用结构体指针变量作函数参数,2020/9/7,30,结构体变量作为函数参数,总结 注意:ANSI C允许用整个结构体作为函数的参数传递,但是必须保证实参与形参的类型相同 把一个完整的结构体变量作为参数传递,虽然合法,但要将全部成员值一个一个传递,既费时间又费空间,开销大,因此一般不采用 在函数中要结构体中成员变量的值,需要传结构体指针变量或结构体地址,2020/9/7,31,函数的返回值为结构体类型,struct student input() /*输入一个学生的数据*/ int i; struct student stud; scanf(%ld,/*返回结构体数据*/ ,函数的返回值可以

19、是结构体类型。例如,定义了结构体数组: struct student stud100; 数据输入可由如下形式的语句实现: for(i=0;i100; i+) studi=input(); 函数input()的功能是输入一个结构体数据,并将输入结构体数据作为返回值,返回给第i个学生记录,实现第i个学生的数据输入,2020/9/7,32,链表概述,所谓链表是指若干个数据项(每个数据项称为一个“结点”)按一定的原则连接起来。每个数据项都包含有若干个数据和一个指向下一个数据项的指针,依靠这些指针将所有的数据项连接成一个链表。,2020/9/7,33,链表概述,struct student long n

20、um; float score; struct student *next ; struct student *head;,2020/9/7,34,一个简单链表示例:,2020/9/7,35,链表的基本操作,链表的建立 从链头到链尾:新结点插入到链尾 从链尾到链头:新结点插入到链头 链表的插入操作 根据一定的条件,把新结点插入到指定位置 链表的删除操作 根据一定的条件,删除一个或多个结点 链表的输出操作 链表的查找操作,2020/9/7,36,建立一个如下图的简单链表,它由三个 学生数据的结点组成,并输出各结点的数 据。,2020/9/7,37,#include #include #defin

21、e null 0 struct student long num; float score; struct student *next; ; main( ) struct student a, b, c, *head, *p; a.num=99101; a.score=89.5; a.next= ,2020/9/7,38,#include #include #define null 0 struct student long num; float score; struct student *next; main( ) int i;struct student *head, *p,*q; fo

22、r(i=1; inext=null; scanf(%ld, %f, ,2020/9/7,39,动态建立链表操作 (从链头到链尾),., p-next = q;, q = malloc(sizeof (struct node); q-data = ai;, for(i=0; in; i+), q-next = NULL;, p = q;,注:#define NULL 0,2020/9/7,40,动态链表的建立(尾部插入新节点),举例,struct student char name20; long num; struct student *next; *head, *p, *q;,null,he

23、ad,p,q=(struct student *)malloc(sizeof(student);,null,strcpy(qname, zhang san);,qnum=9901012; qnext=null;,pnext=q;,p=q;,各域值,p,q,2020/9/7,41,#include #include #define null 0 struct link int data; struct link *next; ; main( ) int i=0, j; struct link *head, *p, *q; char c; head=null; printf(nPlease pre

24、ss i to insert one new node.); while(1) c = getchar( ); if(c!=i ,2020/9/7,42,建立链表操作(从链尾到链头),head,., head = p;, p = malloc(sizeof (struct node); p-data = ai;, for(i=0; in; i+), p-next = head;,2020/9/7,43,链表的插入操作,.,., p-next = q;, q = malloc(sizeof (struct node); q-data = x;, if(p满足插入条件), q-next = p-n

25、ext;,2020/9/7,44,链表的删除操作,.,., p-next = q-next;, free(q);, q = p-next;, if(p-next满足删除条件),2020/9/7,45,链表的输出操作,.,., p = p-next;, while(p), printf(%d, p-data);,2020/9/7,46,链表的查找操作,.,., p2=p1;p1=p1-nxet ;, while(num!=p1-num ,2020/9/7,47,10.2 共用体(p223),该栏目按 性别填写 不同内容,共用体,共用体(Union)是将不同的数据类型组合在一起,共同占用同一段内存

26、的用户自定义数据类型。,2020/9/7,48,union 共用体名 数据类型 成员名; 数据类型 成员名; . ;,例 union data short int i; char ch; float f; ;,共用体是构造数据类型,也叫联合体 用途:使几个不同类型的变量共占一段内存(相互覆盖) 共用体类型定义形式:,2020/9/7,49,形式之一: union data short int i; char ch; float f; a,b;,共用体变量的定义,共用体变量定义分配内存, 长度=最长成员所占字节数,共用体变量任何时刻 只有一个成员存在,其它形式略,2020/9/7,50,共用体变

27、量引用 引用方式:,共用体指针名-成员名,共用体变量名.成员名,(*共用体指针名).成员名,不能引用共用体变量,只能引用其成员,2020/9/7,51,共用体变量引用 引用方式及规则:,例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); (),不能引用共用体变量,只能引用其成员,最后一次是a.f,不是a.i 编译通过,运行结果不对,共用体变量中起作用的成员是最后一次存放的成员,2020/9/7,52,共用体变量引用 引用方式及规则:,不能引用共用体变量,只能引用其成员 共用体变量中起作用的成员是最后一次存放的成员,不能在定义共用体变量时初始化,例 union

28、 int i; char ch; float f; a=1,a,1.5; (),2020/9/7,53,例 将一个整数按字节输出,void main() union int_char int i; char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch1=%o,ch0=%on ch1=%c,ch0=%cn, x.ch1,x.ch0,x.ch1,x.ch0); ,i=60501,“%o”,x.i: 0110000101000001,0 6 0 5 0 1,“%o%o”,x.ch1,x.ch0: 0110000101000001,1 4 1 1 0

29、 1,“%c%c”,x.ch1,x.ch0: 0110000101000001,(141)8=(97)10=a (101)8=(65)10=A,ch1=141,ch0=101,ch1=a,ch0=A,(24897)10=(110000101000001)2,2020/9/7,54,共同体与结构体的异同 共同体与结构体都是由多个成员分量组成的一个整体; 共同体与结构体在定义、说明和使用(成员引用、指针)上十分相似。 结构体:多个成员分量分别占用不同的存储空间构成一个整体;成员分量之间是相互独立的,所进行的各种操作互不影响。 共同体:多个成员分量共同占用同一存储空间;成员分量之间是相互联系的,所进

30、行的操作相互依赖。,2020/9/7,55,10.3 用typedef定义类型,用户自定义类型 标准类型(如int、char、long、double等):系统已经定义好的数据类型,用户可以直接使用,无须再进行定义。 用户自定义类型:用户根据自己的实际要求,自己定义的新的数据类型。 除结构、共同体等类型之外,还可以用类型说明语句typedef定义新的类型说明符来代替已有的类型。,2020/9/7,56,使用typedef定义已有类型的别名。该别名与标准类型名一样,可用来定义相应的变量。,typedef定义类型步骤 按定义变量方法先写出定义体 如 int i; 将变量名换成新类型名 如 int I

31、NTEGER; 最前面加typedef 如 typedef int INTEGER; 用新类型名定义变量 如 INTEGER i,j;,10.3 用typedef定义类型,2020/9/7,57,例 定义数组类型 int a100; int ARRAY100; typedef int ARRAY100; ARRAY a,b,c;, int a100,b100,c100;,例 定义指针类型 char *str; char *STRING; typedef char *STRING; STRING p,s10;, char *p; char *s10;,10.3 用typedef定义类型,2020

32、/9/7,58,例 定义结构体类型 struct date int month; int day; int year; d;,例 定义结构体类型 struct date int month; int day; int year; DATE;,例 定义结构体类型 typedef struct date int month; int day; int year; DATE;,例 定义结构体类型 DATE birthday, *p;, struct date int month; int day; int year; birthday, *p;,2020/9/7,59,【例10.8】设有一个教师与学

33、生通用的表格,教师数据有姓名、年龄、职业、办公室四项。学生有姓名、年龄、职业、班级四项。其中,学生的职业为“S”,教师职业为“T”。 void main() typedef struct char name20; int age; char job; union int class; char office20; depa; PERSON; PERSON body2; int i;,2020/9/7,60,strcpy(,Bill Chan); strcpy(,Robert Wilson); body0.age=18; body1.age=38; body0.job=S; body1.job=T; body0.depa.class=2; strcpy(body1.depa.office, B1-101); printf(nametagetjobtclass/officen); printf(=n); for(i=0;i2;i+) if(bod

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论