用户自定义数据类型.ppt

上传人:牧羊曲112 文档编号:6055370 上传时间:2023-09-18 格式:PPT 页数:60 大小:642KB
返回 下载 相关 举报
用户自定义数据类型.ppt_第1页
第1页 / 共60页
用户自定义数据类型.ppt_第2页
第2页 / 共60页
用户自定义数据类型.ppt_第3页
第3页 / 共60页
用户自定义数据类型.ppt_第4页
第4页 / 共60页
用户自定义数据类型.ppt_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《用户自定义数据类型.ppt》由会员分享,可在线阅读,更多相关《用户自定义数据类型.ppt(60页珍藏版)》请在三一办公上搜索。

1、第九章 用户自定义数据类型,第九章 用户自定义数据类型一、结构体的概念及使用二、结构体数组三、结构体指针四、链表的概念及基本操作五、共用体的概念及使用六、9.6 枚举类型七、9.7 用typedef定义类型,系统给定的数据类型,在基本类型基础上自己定义的,C语言的数据类型,考虑一个学生的基本信息包括:学号、姓名、性别、年龄、成绩、住址等。这对一名学生来说是一个整体,可以反映出学生的基本情况,如果用单个变量分别表示这几项,例如:sum:学号 name10:姓名 sex:性别 age:年龄 score:成绩 addr30:住址 不能体现出它们之间的内在联系。所以,希望有一种变量,来表示所有这些数据

2、,也就是,把这些基本变量,作为一个整体构成一个新的变量,这种变量就是我们要介绍的结构体变量。,9.1 结构体,结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型结构体类型定义,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;,成员类型可以是基本型或构造型,struct是关键字,不能省略,合法标识符可省:无名结构体,分号不能省略,例 struct student int num;char name20;char sex;int age;float score;char addr30;,结构体类型定义描述结构的组织形式,不分配内存,例如:要想把学生基本

3、情况作为一个整体加以处理,比如:学号、姓名、性别、年龄、成绩、住址等。必须定义结构体类型,例 struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;,1、先定义结构体类型,再定义结构体变量一般形式:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 变量名表列;,定义结构体变量之后为其分配内存单元,结构体变量的定义,2、定义结构体类型的同时定义结构体变量一般形式:,struct 结构体名 类型标识符 成员名

4、;类型标识符 成员名;.变量名表列;,例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,3、直接定义结构体变量一般形式:,struct 类型标识符 成员名;类型标识符 成员名;.变量名表列;,例 struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,用无名结构体直接定义变量只能一次,说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存结构体类型是一个模

5、型,类似系统给定的基本类型比如int、float 等类型,只是结构体类型是用户自定义的而已。结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆,引用规则 结构体变量不能整体引用,只能引用变量成员,成员(分量)运算符优先级:1结合性:从左向右,引用方式:结构体变量名.成员名,结构体变量的引用,可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用,结构体变量的引用,形式一:,例 struct student int num;char name20;char sex;int age;char addr30;struct student stu1=112,“Wang Lin”,M,19,

6、“200 Beijing Road”;,结构体变量的初始化,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 结构体变量=初始数据;,形式二:,例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,形式三:,例 struct int num;char name20;char sex;int age;

7、char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,struct 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,结构体数组的定义三种形式:,形式一:struct student int num;char name20;char sex;int age;struct student stu30;,形式二:struct student int num;char name20;char sex;int age;stu30;,形式三:struct int num;char name20;char sex;int age;

8、stu30;,9.2 结构体数组,例 统计候选人选票,#include struct person char name20;int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0;main()int i,j;char leader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i3;i+)printf(%5s:%dn,leaderi.name,leaderi.count)

9、;,结构体数组初始化,顺序初始化:struct student int num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;,例 struct student int num;char name20;char sex;int age;stu=,;,结构体数组引用,引用方式:结构体数组名下标.成员名,Str0.name=“ZhaoDa”,指向结构体变量的指针定义形式:struct 结构体名*结构体指针名;例 struct stud

10、ent*p;,存放结构体变量在内存的起始地址,9.3 结构体指针,使用结构体指针变量引用成员形式,指向运算符优先级:1结合方向:从左向右,#includemain()struct student long int num;char name20;char sex;float score;stu_1,*p;p=,例 int n;int*p=n=10,struct student stu1;struct student*p=(*p).num=101,9.3 结构体指针,指向结构体数组的指针,struct student int num;char name20;char sex;int age;st

11、u3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10104,Wang Min,F,20;main()struct student*p;for(p=stu;pnum,p-name,p-sex,p-age);,用指向结构体的指针作函数参数用结构体变量的成员作参数-值传递用指向结构体变量或数组的指针作参数-地址传递用结构体变量作参数-值传递,效率低,struct student void f(struct student stu2).stu1=.;.main().f(stu1);,struct student void f(struct student*p).st

12、u1=.;.main().f(,struct student void f(long num)long num;char name10;stu1=.;.main().f(stu1.num);,构造数据类型,也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义定义形式:,union 共用体名 类型标识符 成员名;类型标识符 成员名;.;,例 union data int i;char ch;float f;,类型定义不分配内存,9.5 共用体,形式一:union data int i;char ch;float f;a,b;,形式二:union data int i;cha

13、r ch;float f;union data a,b,c,*p,d3;,形式三:union int i;char ch;float f;a,b,c;,共用体变量的定义,共用体变量定义分配内存,长度=最长成员所占字节数,共用体变量任何时刻只有一个成员存在,共用体变量引用引用方式:,引用规则不能引用共用体变量,只能引用其成员,共用体变量中起作用的成员是最后一次存放的成员,例 union int i;char ch;float f;a;a=1;(),在定义共用体变量时只能初始化第一个成员,例 union int i;char ch;float f;a=1,a,1.5;(),可以用一个共用体变量为另

14、一个变量赋值,例 float x;union int i;char ch;float f;a,b;a.i=1;a.ch=a;a.f=1.5;b=a;()x=a.f;(),例 将一个整数按字节输出,运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=a,main()union int_char int i;char ch2;x;x.i=24897;printf(i=%on,x.i);printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn,x.ch0,x.ch1,x.ch0,x.ch1);,结构体与共用体区别:存储方式不同,联系:两者可相互嵌套类比:结构体与

15、共用体的定义形式类似,变量定义方式类似,成员引用方式类似。,例 结构体中嵌套共用体,struct int num;char name10;char sex;char job;union int class;char position10;category;person2;,概念:对于数组,编译系统为其分配连续的一片存储单元,而链表,通过动 态分配内存,实现链表中各元素(结点)的数据存放在非连 续的单元中.,如:struct student int num;char name10;struct student*next;/*next 是指向该结构体类型的指针变量,;用来存放下一个结点的起始地址,

16、实现将各结点连接成链*/,9.4 链表,动态分配内存函数:格式1:viod*malloc(unsigned int size)功能:在内存的动态存储区中分配长度为size(单位:byte)连续空间,返回该连续域的首地址(是无类型指针);未成功,返回 0。,struct student int num;char name10;struct student*next;*pt;pt=(struct student*)malloc(sizeof(struct student)pt num name10 next,格式2:calloc(n,size)功能:与 malloc(size)相同,区别是分配n个

17、长度为size 的连续空间。可以为一为数组开辟动态存储空间。,格式:viod free(viod*p)功能:释放由p 指向的内存区,使这部分内存区能被其它变量使用。P 是最近一次调用 calloc 或 malloc 函数时返回的值。free 无返回值。例如:free(p);,numscorenext,建立动态链表 例题:写一个函数建立一个有若干名学生数据的单向动态链表,当学号为 0 建表结束。设结点的结构体类型如下:struct student long num;float score;struct student*next;,numscorenext,实现此要求的算法如下:,head,p1,

18、p2,null,9910189.5,head,p2,p1,9910378,n=1,9910378,9910378,head,p2,9910189.5,p1,n=2,建立链表的函数可以如下:#define NULL 0 while(p1-num!=0)#define LEN sizeof(struct student)n=n+1;struct student if(n=1)head=p1;long num;else p2-next=p1;float score;p2=p1;struct student*next;p1=(struct student*)malloc(LEN);scanf(“%ld

19、,%f”,可以在主函数中调用函数 creat.例如:main()creat();输出链表 例题:编写一个输出链表的函数 print void print(struct student*head)在主函数中调用 struct student*p;方式 printf(“n Now,These%d records are:n”,n);main()p=head;if(head!=NULL).do print(head);printf(“%ld5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);,A0,A0,A0,A linked list,Deletion fr

20、om a linked list,Insertion into a linked list,对链表的删除操作 例题:写一函数以删除动态链表中指定的结点。函数del 如下:struct student*del(struct student*head,long num)struct student*p1,*p2;if(head=NULL)printf(“nlist null!n”);goto end;p1=head;while(num!=p1-num,对链表的插入操作。设已有一个学生链表,各结点是按其成员项 num(学号)的值由小到大顺序排序的。今要插入一个新生的结点,要求按学号的顺序插入。插入函

21、数 insert 如下:struct student*insert(struct student*head,struct student*stud)struct student*p0,*p1,*p2;p1=head;p0=stud;if(head=NULL)head=p0;p0-next=NULL;else while(p0-nump1-num),p0,准备插入的节点,p2,p1,对链表的综合操作 将以上建立、输出、删除、插入的函数组织在一个程序中,用函数main 作主调函数。可以写出main 函数(main函数的位置在以上个函数的后面)main()struct student*head,st

22、u;long del_num;printf(“input records:n”);head=creat();print(head);printf(“n input the deleted number:”);scanf(“%ld”,通用的主函数为:main()struct student*head,*stu;long del_num;printf(“input records:n”);head=creat();print(head);printf(“n input the deleted number:”);scanf(“%ld”,建立链表变量设置:head指向结构体类型指针变量,一般用它指向

23、链表头。p1指向结构体类型指针变量,指向新的结点首地址。p2指向结构体类型指针变量,指向尾结点的首地址。,9909,:,:,9909,:,:,9910,:,:,9911,:,:,p1p2,p2,p1p2,p1,head,.,定义headp1,p2,n=0,动态分配,输入结点内数据,p2 next NULL,返回head,p1num!=0?,nn+1,动态分配,p2 p1,head p1,p2 next p1,n=1?,输入结点内数据,N,Y,N,Y,p1,n=1 n=2 n=3,#define LEN sizeof(struct student)struct student int num;f

24、loat aver;struct student*next;int n;struct student*creat()/*该函数是建立链表的,它返回 的指针,是指向该链表在内存存放首地址*/struct student*head,*p1,*p2;n=0;p1=p2=(struct student*)malloc(LEN);/*动态分配内存*/scanf(“%d,%f”,1,1.5,输出链表,phead,返回,输出数据,p pnext,head!=NULL?,p!=NULL?,N,Y,N,Y,pri(head)struct student*head;struct student*p;p=head;

25、if(head!=NULL)do printf(“%d%fn”,p num,p aver);p=p next;while(p!=NULL);,删除链表中结点,.,.,.,head p2,p1,.,.,n=1,n=2 n=3,删除某结点,不是将此结点真正从内存清除,而是将该节点在链表中的联系断开。如:要删除第二个结点,就把第一个结点最后的指针不是指第2结点首地址,而指第3个结点首地址。程序中要考虑以下几种情况:删除第一个结点:head head next;删除其它结点:(例删第二个结点)p2 next p1next;,框图:,head!=NULL?,未找到与未结束?,找到,p1=head?,p1

26、 head,p2 p1,p1 p1 next,返回,p2next p1 next,返回,n n-1,head p1 next,未找到,N 删其它结点,删头结点,Y,N 是空表,Y,N,struct student*del(struct student*head,int num)struct student*p1,*p2;if(head=NULL)printf(“list hull!n”);return(head);p1=head;while(num!=p1 num,链表中插入结点操作(从小到大)在一个有序链表中,插入某结点后,也是有序表,是空表?,插入第一个结点?,找插入位置?,找到?,hea

27、dp0,p0 next NULL,p2p1,p1p2 next,p1 nextp0p0 nextNULL,nn+1,headp0,p2 nextp0,p0 nextp1,Y,N,Y,N,Y,N,N,Y,插到最后,非空表,空表插入第一个结点,p0指向要插入的结点,程序中要考虑以下几种情况:P0是要插入点,p1首先指向头结点。是空表:将该结点插入,作为头结点。非空表:插入位置是头结点:headp0,p0 next p1插入位置是非头,非尾结点(p2后,p1前):p2 next p0,p0 next p1插入位置是尾结点:p1 next p0,p0 next NULL,struct student*

28、insert(struct student*head,struct student*stud)struct student*p0,*p1,*p2;p1=head;p0=stud;if(head=NULL)head=p0;p0 next=NULL;/*是空表*/else while(p0 num p1 num)/*插入链表最后*/,功能:用自定义名字为已有数据类型命名类型定义简单形式:typedef type name;,例 typedef int INTEGER;,类型定义语句关键字,已有数据类型名,用户定义的类型名,例 typedef float REAL;,类型定义后,与已有类型一样使用,

29、例 INTEGER a,b,c;REAL f1,f2;,说明:1.typedef 没有创造新数据类型2.typedef 是定义类型,不能定义变量3.typedef 与 define 不同,define typedef预编译时处理 编译时处理简单字符置换 为已有类型命名,9.6 用typedef定义类型,typedef定义类型步骤按定义变量方法先写出定义体 如 int i;将变量名换成新类型名 如 int INTEGER;最前面加typedef 如 typedef int INTEGER;用新类型名定义变量 如 INTEGER i,j;,例 定义数组类型 int a100;int ARRAY10

30、0;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;,例 定义函数指针类型 int(*p)();int(*POWER)();typedef int(*POWER)();POWER p1,p2;,int(*p1)(),(*p2)();,例 定义结构体类型 struct date int month;int day;int year;d;,例 定义结构体类型 struct date

31、 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;,类型定义可嵌套,例 typedef struct club char name20;int size;int year;GROUP;typedef GROUP*PG;PG pclub;,GROUP*pclub;struct club*pclub;,

32、GROUP为结构体类型PG为指向GROUP的指针类型,若某个变量只存在有限的几种取值。可定义成枚举类型;例:enum weekday sun,mon,twe,wed,thu,fri,set;enum color red,blue,while,black,yellow;定义枚举类型和变量的格式同结构体和共用体。枚举的成员按常量处理,不是变量(不能赋值),按顺序有固定的值(0,1-),也可改变其值。如:enum weekday workday;weekday=mon;printf(“%dn”,workday)/*输出1*/若:enum weekday sun=7,mon=1,tue,wed,thu

33、,fri,sat workday;workday=tue;printf(“%dn”,workday)/*输出2*/workday=2;/*整型数不能直接赋值给枚举变量,类型不匹配*/workday=(enum weekday)2;/*可以赋值,相当于将顺序号为2的枚举元素赋给workday*/,9.7 枚举,例 袋中有红、黄、白、蓝、黑五种颜色的球。每次从袋中取出3个球,问得到三种不同颜色的球的可能取法,输出每种组合的三种颜色。main()enum color red,yellow,blue,white,black;enum color i,j,k,pri;int n=0,loop;for(i

34、=red;i=black;i+)for(j=red;j=black;j+)if(i!=j)for(k=red;k=black;k+)if(k!=i),switch(pri)case red:printf(%-10s”,”red”);break;case yellow:printf(%-10s”,”yellow”);break;case blue:printf(%-10s”,”blue”);break;case white:printf(%-10s”,”white”);break;case black:printf(%-10s”,”black”);break;default:break;printf(“n”);printf(“n total:%5dn”,n);,运行结果:1 red yellow blue 2 red yellow white 3 red yellow black 4 red blue yellow 5 red blue white 6 red blue black 7:,已知 static int a=5,4,3,2,1;int*p=a+3,a+2,a+1,a,*q=p;则表达式*(p0+1)+*(q+2)的值是(),

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号