《第九章用户自定义数据类型》由会员分享,可在线阅读,更多相关《第九章用户自定义数据类型(60页珍藏版)》请在金锄头文库上搜索。
1、第九章 用户自定义数据类型第九章 用户自定义数据类型n一、结构体的概念及使用n二、结构体数组n三、结构体指针n四、链表的概念及基本操作n五、共用体的概念及使用n六、9.6 枚举类型n七、 9.7 用typedef定义类型C C数数据据类类型型基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型void定义类型定义类型typedef数值类型数值类型字符类型字符类型char枚举类型枚举类型enum整整 型型浮点型浮点型单精度型单精度型float双精度型双精度型double短整型短整型short长整型长整型long整型整型int数组数组结构体结构体struct共用体共用体union系统给定的
2、系统给定的数据类型数据类型在基本在基本类型基类型基础上自础上自己定义己定义的的C语言的数据类型语言的数据类型考虑一个学生的基本信息包括: 学号、姓名、性别、年龄、成绩、住址等。这对一名学生来说是一个整体,可以反映出学生的基本情况,如果用单个变量分别表示这几项,例如: sum:学号 name10 :姓名 sex:性别 age: 年龄 score: 成绩 addr30:住址 不能体现出它们之间的内在联系。所以,希望有一种变量,来表示所有这些数据,也就是,把这些基本变量,作为一个整体构成一个新的变量,这种变量就是我们要介绍的结构体变量。9.1 结构体结构体&结构体是结构体是一种一种构造构造数据类型数
3、据类型&用途:把用途:把不同类型不同类型的数据组合成一个整体的数据组合成一个整体-自定义自定义数据类型数据类型n结构体类型定义结构体类型定义struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;成员类型可以是成员类型可以是基本型或构造型基本型或构造型struct是是关键字关键字, ,不能省略不能省略合法标识符合法标识符可省可省:无名结构体无名结构体分号不能省略分号不能省略例例 struct student int num; char name20; char sex; int age; float score; char addr3
4、0; ; 结构体类型定义描述结构结构体类型定义描述结构的组织形式的组织形式,不分配内存不分配内存例如:要想把学生基本情况作为一个整体加以处理,例如:要想把学生基本情况作为一个整体加以处理,比如:学号、姓名、性别、年龄、成绩、住址等。比如:学号、姓名、性别、年龄、成绩、住址等。必须定义结构体类型必须定义结构体类型例例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2; n1、先定义结构体类型,再定义结构体变量、先定义结构体类型,再
5、定义结构体变量n一般形式:一般形式: struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;struct 结构体名结构体名 变量名表列变量名表列;定义结构体变定义结构体变量之后为其分量之后为其分配内存单元配内存单元namenumsexagescoreaddr2字节字节2字节字节20字节字节1字节字节4字节字节30字节字节.stu1结构体变量的定义结构体变量的定义2、定义结构体类型的同时定义结构体变量、定义结构体类型的同时定义结构体变量一般形式:一般形式:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识
6、符类型标识符 成员名;成员名; .变量名表列变量名表列;例例 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
7、; 用用无名结构体无名结构体直接定义直接定义变量变量只能一次只能一次n说明说明n结构体类型与结构体变量概念不同结构体类型与结构体变量概念不同n类型类型:不分配内存不分配内存; 变量变量:分配内存分配内存n结构体类型是一个模型,类似系统给定的基本类型比如结构体类型是一个模型,类似系统给定的基本类型比如int、 float 等类型,只是结构体类型是用户自定义的而已。等类型,只是结构体类型是用户自定义的而已。n结构体可嵌套结构体可嵌套n结构体成员名与程序中变量名可相同,不会混淆结构体成员名与程序中变量名可相同,不会混淆例例 struct date int month; int day; int ye
8、ar; ; struct student int num; char name20; struct date birthday; stu;numnamebirthdaymonthdayyearn引用规则引用规则n 结构体变量结构体变量不能整体引用不能整体引用,只能引用变量只能引用变量成员成员成员成员(分量分量)运算符运算符优先级优先级: 1结合性结合性:从左向右从左向右引用方式:引用方式: 结构体变量名结构体变量名.成员名成员名例例 struct student int num; char name20; char sex; int age; float score; char addr30;
9、 stu1,stu2; stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score; stu1.age+;例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; printf(“%d,%s,%c,%d,%f,%sn”,stu1); ( )stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; ( )结构体变量的引用结构体变量的引用n可以将一个可以将一个结构体变量赋值给另一个结构体变量结构体变量赋值
10、给另一个结构体变量n结构体嵌套时结构体嵌套时逐级引用逐级引用例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu2=stu1; ( )例例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;结构体变量的引用
11、结构体变量的引用n形式一:形式一:例例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;结构体变量的初始化结构体变量的初始化struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;struct 结构体名结构体名 结构体变量结构体变量=初始数据初始数据;n形式二:形式二:例例 struct student int num; c
12、har name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .结构体变量结构体变量=初始数据初始数据;n形式三:形式三:例例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; struct 类型标识符类型
13、标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .结构体变量结构体变量=初始数据初始数据;n结构体数组的定义结构体数组的定义三种形式:三种形式:形式一形式一: : 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; stu
14、30;numnamesexagenumnamesexagestu0stu125B9.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
15、(i=0;i成员名成员名结构体变量名结构体变量名.成员名成员名指向运算符指向运算符优先级优先级: 1: 1结合方向:从左向右结合方向:从左向右#includemain() struct student long int num; char name20; char sex; float score; stu_1,*p; p=&stu_1; stu_1.num=89101; strcpy(stu_1.name,Li Lin); p-sex=M; p-score=89.5; printf(nNo:%ldnname:%snsex:%cnscore:%fn, (*p).num,p-name,stu_1
16、.sex,p-score);例例 int n; int *p=&n; *p=10; n=10struct student stu1;struct student *p=&stu1;stu1.num=101; (*p).num=1019.3 结构体指针结构体指针n指向结构体数组的指针指向结构体数组的指针struct student int num; char name20; char sex; int age;stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20;main() struct student *p; fo
17、r(p=stu;pnum,p-name,p-sex,p-age);numnamesexagestu0pstu1stu2p+1n用指向结构体的指针作函数参数用指向结构体的指针作函数参数n用结构体变量的成员作参数用结构体变量的成员作参数-值传递值传递n用指向结构体变量或数组的指针作参数用指向结构体变量或数组的指针作参数-地址传递地址传递n用结构体变量作参数用结构体变量作参数- 值传递值传递,效率低,效率低struct student void f(struct student stu2) . stu1=.; .main() . f(stu1); struct student void f(stru
18、ct student *p) . stu1=.; .main() . f(&stu); struct student void f(long num)long num; char name10;stu1=.; .main() . f(stu1.num); &构造数据类型构造数据类型,也叫联合体也叫联合体&用途:使几个不同类型的变量共占一段内存用途:使几个不同类型的变量共占一段内存(相互覆盖相互覆盖)n共用体类型定义共用体类型定义定义形式:定义形式:union 共用体名共用体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;例例 union data int
19、 i; char ch; float f; ;类型定义类型定义不分配内存不分配内存2001200220042003chif9.5 共用体共用体形式一形式一: : union data int i; char ch; float f; a,b;形式二形式二: : union data int i; char ch; float f; ; union data a,b,c,*p,d3;形式三形式三: : union int i; char ch; float f; a,b,c;n共用体变量的定义共用体变量的定义fchifchiab共用体共用体变量定义变量定义分配内存分配内存, ,长度长度= =最长
20、成员最长成员所占字节数所占字节数共用体共用体变量任何时刻变量任何时刻只有只有一个成员一个成员存在存在n共用体变量引用共用体变量引用n引用方式:引用方式:n引用规则引用规则n不能引用共用体变量,只能不能引用共用体变量,只能引用其成员引用其成员共用体指针名共用体指针名-成员名成员名共用体变量名共用体变量名.成员名成员名(*共用体指针名共用体指针名).成员名成员名union data int i; char ch; float f; ; union data a,b,c,*p,d3;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d0.ch d0.
21、fn共用体变量中起作用的成员是共用体变量中起作用的成员是最后一次存放的成员最后一次存放的成员例例 union int i; char ch; float f; a; a=1; ( ) n在定义共用体变量时在定义共用体变量时只能初始化第一个成员只能初始化第一个成员例例 union int i; char ch; float f; a=1,a,1.5; ( ) n可以用一个共用体变量为另一个变量赋值可以用一个共用体变量为另一个变量赋值例例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; ( ) x=
22、a.f; ( )例例 将一个整数按字节输出将一个整数按字节输出运行结果:运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=amain() 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);01100001 01000001低字节低字节高字节高字节0100000101100001ch0ch120002001in结构体与共用体结构体与共用体n区别区别: 存储方式不同存储方
23、式不同struct node char ch2; int k;a;union node char ch2; int k;b;achkbch k变量的各成员同时存在变量的各成员同时存在任一时刻只有一个成员存在任一时刻只有一个成员存在n联系联系: 两者可相互嵌套两者可相互嵌套n类比:结构体与共用体的定义形式类似,变量定义方类比:结构体与共用体的定义形式类似,变量定义方式类似,成员引用方式类似。式类似,成员引用方式类似。例例 结构体中嵌套共用体结构体中嵌套共用体 name num sexjobclasspositionLiWang10112086FMST501profstruct int num;
24、char name10; char sex; char job; union int class; char position10; category;person2; 概念:概念: 对于数组,编译系统为其分配连续的一片存储单元,而链表,通过动对于数组,编译系统为其分配连续的一片存储单元,而链表,通过动 态分配内存,实现链表中各元素(结点)的数据存放在非连态分配内存,实现链表中各元素(结点)的数据存放在非连 续的单元中续的单元中. 如:如:struct student int num; char name10; struct student *next; /* next 是指向该结构体类型的指
25、针变量,是指向该结构体类型的指针变量,; 用来存放下一个结点的起始地址,用来存放下一个结点的起始地址, 实现将各结点连接成链实现将各结点连接成链 */ 05001Li li200005002Wang 305005003Zhang 3060 1204 2000 3050 3060 1204head05003Zhang NULL9.4 链表链表动态分配内存函数:动态分配内存函数:格式格式1:viod *malloc(unsigned int size)功能:功能: 在内存的动态存储区中分配长度为在内存的动态存储区中分配长度为size(单位:单位:byte) 连续空间,返回该连续域的连续空间,返回该
26、连续域的首地址首地址(是无类型指针);(是无类型指针); 未成功,未成功,返回返回 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个长度为个长度为size 的连续空间。可以为一为数组开辟动态存储空间。的连续空间。可以为一为数组开辟动态存储空间。 i
27、nt *p; p=(int *)calloc(3,sizeof(int) p 格式格式 :viod free(viod *p)功能:功能:释放由p 指向的内存区,使这部分内存区能被其它变量使用。P 是最近一次调用 calloc 或 malloc 函数时返回的值。 free 无返回值。 例如 : free(p); numscorenext 建立动态链表建立动态链表 例题:写一个函数建立一个有若干名学生数据的单向动态链表,当学号为 0 建表结束。 设结点的结构体类型如下: struct student long num ; float score ; struct student *next ;
28、;numscorenext实现此要求的算法如下:开辟一个新结点,并使 p1,p2指向它读入一个学生数据给p1所指的结点head=NULL , n=0当读入的p1 - num 不是零 n=n+1 n=1 head=p1 p2 - next=p1 /* 把p1所指的结点 /* 把p1所指的结点 作为第一个结点 */ 连接到表尾 */ p2=p1 /* p2移到表尾 */ 再开辟一个新结点,使p1指向它 读入一个学生数据给p1所指结点 p2-next=NULL /*表尾结点的指针变量置NULL*/ 真假head p1p2null9910189.5headp2p19910378n=1991037899
29、10378headp29910189.5 p1n=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,%f”,&p1-num, &p1-score); int n; struct
30、 student *creat(void) p2-next=NULL; struct strudent *head; return(head); struct student *p1,*p2; n=0; p1=p2=(struct student *)malloc(LEN); scanf(“%ld,%f”,&p1-.num,&p1-score); head=NULL; 可以在主函数中调用函数 creat .例如: main() creat(); 输出链表 例题:编写一个输出链表的函数 print void print(struct student *head) 在主函数中调用 struct s
31、tudent *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); 04001902800040019030000400190NULL04001902000head10002000280030001000A1A3A2A0A4A1A3A2A0A4A1A3A2A0A4XA linked listDeletion from a link
32、ed listInsertion 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 & p1-next!=NULL) p2=p1; p1=p1-next; if(num= =p1-num) if(p1= =head)head
33、=p1-next; else p2-next=p1-next; printf(“delete:%ldn”,num); n=n-1; else printf(“%ld not been found!n”,num);end : return(head); nump1p2 对链表的插入操作。对链表的插入操作。设已有一个学生链表,各结点是按其成员项 num (学号)的值由小到大顺序排序的。今要插入一个新生的结点,要求按学号的顺序插入。 插入函数 insert 如下: struct student *insert(struct student *head , struct student *stud)
34、struct student *p0 , *p1 , *p2 ; p1=head ; p0=stud ; if(head= =NULL) head=p0; p0-next=NULL; else while (p0-nump1-num) & (p1-next!=NULL) p2=p1; p1=p1-next; if(p0-numnum) if(head= =p1) head=p0; else p2-next=p0; p0-next=p1; else p1-next=p0;p0-next=NULL; n=n+1; return(head); p0 准备插入的节点 p2 p1 对链表的综合操作 将以
35、上建立、输出、删除、插入的函数组织在一个程序中,用函数main 作主调函数。可以写出main 函数 (main函数的位置在以上个函数的后面) main() struct student *head , stu; long del_num; printf(“input records:n”); head=creat(); print(head); printf(“n input the deleted number:”); scanf(“%ld”,&del_num); head=del(head,del_num); print(head); printf(“n input the inserte
36、d record :”); scanf(“%ld,%f”,&stu.num ,&stu.score); head=insert(head,&stu); print(head); 通用的主函数为: main() struct student *head , *stu; long del_num; printf(“input records:n”); head=creat(); print(head); printf(“n input the deleted number:”); scanf(“%ld”, &del_num); while(del_num!=0) head=del(head,del
37、_num); printf(“input the deleted number:”); scanf(“%ld”,&del_num); printf(“n input the inserted recored:”); stu=(struct student *) malloc(LEN); scanf(“%ld,%f”,&stu-num,&stu-score); while(stu-num!=0) head=insert(head,stu); printf(“input the inserted recored:”); stu=(struct student *)malloc(LEN); scan
38、f(“%ld,%f”,&stu-num,&stu-score); 建立链表建立链表变量设置:变量设置:head指向结构体类型指针变量,一般用它指向链表头。指向结构体类型指针变量,一般用它指向链表头。 p1指向结构体类型指针变量,指向新的结点首地址。指向结构体类型指针变量,指向新的结点首地址。 p2指向结构体类型指针变量,指向尾结点的首地址。指向结构体类型指针变量,指向尾结点的首地址。9909:9909:9910:9911:p1p2p2p1p2p1head.定义headp1,p2,n=0动态分配输入结点内数据p2 next NULL返回headp1num!=0?nn+1动态分配p2 p1head
39、 p1p2 next p1n=1?输入结点内数据NYNYp1n=1 n=2 n=3 #define LEN sizeof(struct student)struct student int num; float aver; struct student *next;int n;struct student *creat( ) /*该函数是建立链表的该函数是建立链表的,它返回它返回 的指针的指针,是指向该链表在内存存放首地址是指向该链表在内存存放首地址*/ struct student *head, *p1, *p2; n=0; p1=p2=(struct student*)malloc(LEN
40、); /*动态分配内存动态分配内存*/ scanf(“%d,%f”,&p1 num, &p1 aver); /*输入节点内数据输入节点内数据*/ head =NULL; /*空表处理空表处理*/ while (p1 num!=0) /*判建立链表是否结束判建立链表是否结束*/ n+; if (n= =1) head=p1; /*第一个节点处理第一个节点处理*/ else p2 next=p1; /*其他节点处理其他节点处理*/ p2=p1;p1=(struct student *)malloc(LEN); /*动态分配内存动态分配内存*/ scanf(“%d,%f”,&p1 num, &p a
41、ver); p2 next=NULL; /*结束点结束点,送送NULL*/ return(head);avernextnumheadavernextnum p1 p1avernextnum p111.5headp2p2输出链表输出链表 phead返回输出数据p pnexthead!=NULL?p!=NULL?NYNYpri(head)struct student *head; struct student *p; p=head; if (head != NULL) do printf(“%d %fn”,p num, p aver); p= p next; while(p != NULL);删除
42、链表中结点 .head p2p1.n=1n=2 n=3 删除某结点,不是将此结点真正从内存清除,而是将该节点删除某结点,不是将此结点真正从内存清除,而是将该节点在链表中的联系断开。在链表中的联系断开。 如:要删除第二个结点,就把第一个结如:要删除第二个结点,就把第一个结点最后的指针不是指第点最后的指针不是指第2结点首地址,而指第结点首地址,而指第3个结点首地址。个结点首地址。 程序中要考虑以下几种情况:程序中要考虑以下几种情况: 删除第一个结点:删除第一个结点:head head next; 删除其它结点:(例删第二个结点删除其它结点:(例删第二个结点) p2 next p1next;框图:h
43、ead!=NULL?未找到与未结束?找到p1=head?p1 headp2 p1, p1 p1 next返回p2next p1 next返回n n-1head p1 next未找到N 删其它结点删头结点YN 是空表YNstruct 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 & p1 next!= NULL) ) p2=p1; p1=p
44、2 next; /*前进一个节点前进一个节点*/ if (num= =p1 num) if (p1= =head) head =head next; /*删头节点删头节点*/ else p2 next = p1 next; /*删其他节点删其他节点*/ printf(“delete=%dn”, num); n=n-1; else printf(“%d not been found !n”, num);return(head);链表中插入结点操作(从小到大)链表中插入结点操作(从小到大) 在一个有序链表中,插入某结点后,也是有序表在一个有序链表中,插入某结点后,也是有序表 是空表?插入第一个结点
45、?找插入位置?找到?headp0p0 next NULLp2p1, p1p2 nextp1 nextp0p0 nextNULLnn+1headp0p2 nextp0p0 nextp1YNYNYNNY插到最后 非空表空表插入第一个结点 p0指向要插入的结点程序中要考虑以下几种情况:程序中要考虑以下几种情况:P0是要插入点,是要插入点,p1首先指向头结点。首先指向头结点。是空表是空表:将该结点插入,作为头结点。:将该结点插入,作为头结点。非空表非空表:插入位置是头结点:插入位置是头结点:headp0, p0 next p1插入位置是非头,非尾结点(插入位置是非头,非尾结点(p2后,后,p1前):前
46、):p2 next p0, p0 next p1插入位置是尾结点:插入位置是尾结点: p1 next p0, p0 next NULL 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 num p1 num) & (p1 next != NULL) p2=p1; p1=p2 next
47、; /*找插入位置找插入位置*/ if (p0 num = p1 num) if (head = =p1) head=p0; /*插入非空表中第一个节点处插入非空表中第一个节点处*/ else p2 next=p0; /*插入非空表中非头插入非空表中非头,非尾节点非尾节点*/ p0 next=p1; else p1 next=p0; p0 next=NULL; /*插入链表最后插入链表最后*/ n功能功能:用自定义名字为:用自定义名字为已有已有数据类型命名数据类型命名n类型定义类型定义简单形式:简单形式: typedef type name;例例 typedef int INTEGER;类型定
48、义语句关键字类型定义语句关键字已有数据类型名已有数据类型名用户定义的类型名用户定义的类型名例例 typedef float REAL;类型定义后类型定义后, ,与已有类型一样使用与已有类型一样使用例例 INTEGER a,b,c; REAL f1,f2; int a,b,c; float f1,f2; 说明说明: :1.typedef 1.typedef 没有创造没有创造新数据类型新数据类型2.2.typedeftypedef 是定义类型是定义类型, ,不能定义变量不能定义变量3.typedef 3.typedef 与与 define define 不同不同 definedefine type
49、deftypedef预编译时处理预编译时处理 编译时处理编译时处理简单字符置换简单字符置换 为已有类型命名为已有类型命名 9.6 用用typedef定义类型定义类型ntypedef定义类型步骤按定义变量方法先写出定义体 如 int i; 将变量名换成新类型名 如 int INTEGER; 最前面加typedef 如 typedef int INTEGER; 用新类型名定义变量 如 INTEGER i,j; 例 定义数组类型 int a100; int ARRAY100; typedef int ARRAY100; ARRAY a,b,c; int a100,b100,c100;例 定义指针类型
50、 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 int month; int day; int year; DATE;例 定义结构体类型typ
51、edef struct date int month; int day; int year; DATE;例 定义结构体类型 DATE birthday, *p; struct date int month; int day; int year; birthday, *p;n类型定义可嵌套例 typedef struct club char name20; int size; int year; GROUP; typedef GROUP *PG; PG pclub; GROUP *pclub; struct club *pclub;GROUP为结构体类型PG为指向GROUP的指针类型 若某个变量
52、只存在有限的几种取值。可定义成枚举类型;若某个变量只存在有限的几种取值。可定义成枚举类型; 例:例:enum weekday sun, mon, twe, wed, thu, fri, set; enum color red, blue, while, black, yellow;定义枚举类型和变量的格式同结构体和共用体。定义枚举类型和变量的格式同结构体和共用体。枚举的成员按常量处理,不是变量(不能赋值),按顺序有固定的值枚举的成员按常量处理,不是变量(不能赋值),按顺序有固定的值(0,1-),也可改变其值。),也可改变其值。如:如:enum weekday workday;weekday=m
53、on;printf(“%dn”, workday) /* 输出输出1 */若若:enum weekday sun=7, mon=1, tue, wed, thu, fri, sat workday;workday=tue;printf(“%dn”, workday) /* 输出输出2 */workday=2; /*整型数不能直接赋值给枚举变量,整型数不能直接赋值给枚举变量, 类型不匹配类型不匹配 */workday=(enum weekday)2; /* 可以赋值,相当于将顺序号为可以赋值,相当于将顺序号为2的枚举的枚举元素赋给元素赋给workday */9.7 枚举枚举例例 袋中有红、黄、白
54、、蓝、黑五种颜色的球。每次从袋中取出袋中有红、黄、白、蓝、黑五种颜色的球。每次从袋中取出3个球,个球,问得到三种不同颜色的球的可能取法,输出每种组合的三种颜色。问得到三种不同颜色的球的可能取法,输出每种组合的三种颜色。 main( ) enum color red, yellow, blue, white, black; enum color i, j, k, pri; int n=0, loop; for (i=red; i= black; i+) for (j=red; j= black; j+) if (i!=j) for (k=red; k= black; k+) if (k!=i)
55、& (k!=j) n=n+1; printf(“%-4d”, n); for (loop=1; loop=3; loop+) switch(loop) case1: pri=i; break; case2: pri=j; break; case3: pri=k; break; switch(pri) case red: printf(%-10s”,”red”); break; case yellow:printf(%-10s”,”yellow”); break; case blue: printf(%-10s”,”blue”); break; case white: printf(%-10s”
56、,”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 : : :n已知 static int a=5,4,3,2,1;n int *p=a+3,a+2,a+1,a,*q=p;n则表达式*(p0+1)+*(q+2)的值是( )