第9章_用户自己建立数据类型_第1页
第9章_用户自己建立数据类型_第2页
第9章_用户自己建立数据类型_第3页
第9章_用户自己建立数据类型_第4页
第9章_用户自己建立数据类型_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

1、9.1 9.1 定义和使用结构体变量定义和使用结构体变量9.2 9.2 使用结构体数组使用结构体数组9.3 9.3 结构体指针结构体指针9.4 9.4 用指针处理链表用指针处理链表9.5 9.5 共用体类型共用体类型9.6 9.6 使用枚举类型使用枚举类型9.7 9.7 用用typedeftypedef声明新类型名声明新类型名9.1.1 9.1.1 自己建立结构体类型自己建立结构体类型9.1.2 9.1.2 定义结构体类型变量定义结构体类型变量9.1.3 9.1.3 结构体变量的初始化和引用结构体变量的初始化和引用用户自己建立由不同类型数据组成的组用户自己建立由不同类型数据组成的组合型的数据结

2、构,它称为合型的数据结构,它称为结构体结构体例如,一个学生的学号、姓名、性别、例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,是属于同年龄、成绩、家庭地址等项,是属于同一个学生的一个学生的,因此,因此组成一个组合数据组成一个组合数据,可以定义一个学生结构体类型。可以定义一个学生结构体类型。结构体结构体定义的定义的一般形式:一般形式: structstruct 结构体名结构体名 成员表列成员表列 ; ; 类型名类型名 成员名成员名;structstruct Student Student int num; int num; char name20; char name20; char

3、 sex; char sex; int age; int age; float score; float score; char addr30; char addr30; ; ;u由程序设计者指定了由程序设计者指定了一个结构体类型一个结构体类型struct struct StudentStudentu它包括它包括num, name, num, name, sex, age, score, addrsex, age, score, addr等等不同类型的成员不同类型的成员说明:说明:(1)(1)结构体类型并非只有一种,而是可以设结构体类型并非只有一种,而是可以设计出许多种结构体类型,例如计出许多

4、种结构体类型,例如struct Teacherstruct Teacherstruct Workerstruct Workerstruct Datestruct Date等结构体类型等结构体类型u各自包含不同的成员各自包含不同的成员(2) (2) 成员可以属于另一个结构体类型。成员可以属于另一个结构体类型。 struct Date struct Date int month; int month; int day; int year;int day; int year; ; ;struct Stu struct Stu int num; char name20; int num; char n

5、ame20; char sex; int age; char sex; int age; struct Date struct Date birthday;birthday; char addr30; char addr30; ; ;num name sex agebirthdayaddrmonth day year前面只是建立了一个结构体类型,它相当前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。具体数据,系统对之也不分配存储单元。为了能在程序中使用结构体类型的数据,为了能在程序中使用结构体类型的

6、数据,应当定义结构体类型的变量,并在其中存应当定义结构体类型的变量,并在其中存放具体的数据。放具体的数据。1. 1. 先声明结构体类型,再定义该类型变量先声明结构体类型,再定义该类型变量声明结构体类型声明结构体类型struct Studentstruct Student,可以用可以用它来定义变量它来定义变量 struct Student s1, s2; struct Student s1, s2;结构体类型名结构体类型名结构体变量名结构体变量名 10001 Zhang Xin M 19 90.5 Shanghaistruct Student int num; char name20; char

7、 sex; int age; float score; char addr30; ;2. 2.在声明类型的同时定义变量在声明类型的同时定义变量structstruct Student Student int num; int num; char name20; char name20; char sex; char sex; int age; int age; float score; float score; char addr30; char addr30; s1, s2s1, s2; ;3. 3. 不指定类型名而直接定义结构体类型变量不指定类型名而直接定义结构体类型变量其一般形式为其一般

8、形式为: : struct struct 成员表列成员表列 变量名表列变量名表列; ; 指定了一个无名的结构体类型指定了一个无名的结构体类型 。(1) (1) 结构体结构体类型类型与结构体与结构体变量变量是不同的概念是不同的概念,不要混同。只能对变量赋值、存取或,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算,而不能对一个类型赋值、存取或运算。运算。在编译时,对类型是不分配空间在编译时,对类型是不分配空间的,只对变量分配空间的,只对变量分配空间。(2) (2) 结构体类型中的成员名可以与程序中的变量名结构体类型中的成员名可以与程序中的变量名相同相同,但二者不代表同一对象

9、。但二者不代表同一对象。(3) (3) 对结构体变量中的成员(即对结构体变量中的成员(即“域域”),可以单),可以单独使用,它的作用与地位相当于普通变量。独使用,它的作用与地位相当于普通变量。结结构体中成员的使用方法:构体中成员的使用方法: 结构体变量名结构体变量名 . . 成员名称成员名称 例:要用结构体描述一个人的基本情况,可以定义如下结构体: struct person /* 定义person结构体类型 */ char name30; char sex; struct date birthday; /* 结构体的嵌套定义 */ man; 如果要在变量man中存入一个1960年3月28日出

10、生的zhang先生,可以采用如下赋值语句: strcpy(, “zhang”); /*不能写成 =zhang; */ man.sex = M; /* 为结构体中的字符成员赋值 */ man.birthday.year = 1960; man.birthday.month = 3; man.birthday.day = 28; /*嵌套定义的结构体中的成员赋值*/ 例9.1 把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。解题思路:u自己建立一个结构体类型,包括有关学生信息的各成员u用它定义结构体变量,同时赋以初值u输出

11、该结构体变量的各成员#include #include int main()int main()struct Student struct Student long int num; char name20; long int num; char name20; char sex; char addr20; char sex; char addr20; a=10101,“Li Lin”,M, a=10101,“Li Lin”,M, “123 Beijing Road”; “123 Beijing Road”; printf(NO.:%ldnname:%sn printf(NO.:%ldnnam

12、e:%sn sex:%cnaddress:%sn, sex:%cnaddress:%sn, a.num,,a.sex,a.addr); a.num,,a.sex,a.addr); return 0; return 0; #include #include int main()int main()struct Student struct Student long int num; char name20; long int num; char name20; char sex; char addr20; char sex; char addr20; a=10101,“L

13、i Lin”,M, a=10101,“Li Lin”,M, “123 Beijing Road”; “123 Beijing Road”; printf(NO.:%ldnname:%sn printf(NO.:%ldnname:%sn sex:%cnaddress:%sn, sex:%cnaddress:%sn, a.num,,a.sex,a.addr); a.num,,a.sex,a.addr); return 0; return 0; .1定义结构体数组定义结构体数组9.2.2 9.2.2 结构体数组的应用举例结构体数组的应用举例结构体数组结构体数组

14、的的定义定义: struct struct 结构体名结构体名 成员表列成员表列 数组名数组名 数组长度数组长度; ; 先声明结构体类型,再用此类型定义结构体数组:先声明结构体类型,再用此类型定义结构体数组: 结构体类型结构体类型 数组名数组名 数组长度数组长度; ; 如:如: struct Person leader3; struct Person leader3; struct student char num10; /学号 char name20; /姓名 float maths; /数学成绩 float C; /程序设计成绩 float sum; /总分 stud100;for(i=0;

15、i100;i+) scanf(“%s%s%f%f”, studi.num, , &studi.maths, &studi.C);for(i=0;i100;i+)printf(“%8s%8s%5.0f%5.0f”, studi.num, , studi.maths, studi.C);例如:例如:struct stustruct stu int num; int num; char name10; char name10; char sex; char sex; float score; float score; student5= student5= 1

16、01,Li ping,M,45, 101,Li ping,M,45, 102,Zhang ping,M,62.5, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 104,Cheng ling,F,87, 105,Wang ming,M,58; 105,Wang ming,M,58; 对结构数组可以作初始化赋值。 例例9.4 9.4 有有n n个学生的信息个学生的信息( (包括学号、姓包括学号、姓名、成绩名、成绩) ),要求按照成绩的高低顺序,要求按照成绩的高低顺序输出各学生

17、的信息。输出各学生的信息。解题思路:用结构体数组存放解题思路:用结构体数组存放n n个学生个学生信息,采用选择法对各元素进行排序信息,采用选择法对各元素进行排序( (进行比较的是各元素中的成绩进行比较的是各元素中的成绩) )。#include #include struct Studentstruct Student int num; char name20; float score; ; int num; char name20; float score; ; int main()int main() struct Student stu5=10101,Zhang,78 , struct S

18、tudent stu5=10101,Zhang,78 , 10103,Wang,98.5, 10103,Wang,98.5, 10106,Li, 86 , 10106,Li, 86 , 10108,“Ling”, 73.5, 10108,“Ling”, 73.5, 10110,“Fun”, 100 ; 10110,“Fun”, 100 ; struct Student temp; struct Student temp; const int n = 5 ; int i,j,k; const int n = 5 ; int i,j,k;常变量常变量若人数变为3030#include #inclu

19、de struct Studentstruct Student int num; char name20; float score; ; int num; char name20; float score; ; int main()int main() struct Student stu5=10101,Zhang,78 , struct Student stu5=10101,Zhang,78 , 10103,Wang,98.5, 10103,Wang,98.5, 10106,Li, 86 , 10106,Li, 86 , 10108,“Ling”, 73.5, 10108,“Ling”, 7

20、3.5, 10110,“Fun”, 100 ; 10110,“Fun”, 100 ; struct Student temp; struct Student temp; const int n = 5 ; int i,j,k; const int n = 5 ; int i,j,k;#define N 5注意注意temp的类型的类型 printf(The order is:n); printf(The order is:n); for(i=0;in-1;i+) for(i=0;in-1;i+) k=i; k=i; for(j=i+1;jn;j+) for(j=i+1;jstuk.score)

21、k=j; if(stuj.scorestuk.score) k=j; temp=stuk; temp=stuk; stuk=stui; stui=temp; stuk=stui; stui=temp; for(i=0;in;i+) for(i=0;i”进行操作。 v即:结构体指针-成员名 v“-”运算符优先级是最高的(1级),从左至右结合 通过结构体指针pdate访问成员year的操作就可以写成: pdate-year = 1963; 等价于:today.year = 1963; (* pdate).year = 1963; 例例9.6 9.6 有有3 3个学生的信息,放在结构体数个学生的信息

22、,放在结构体数组中,要求输出全部学生的信息。组中,要求输出全部学生的信息。解题思路:用指向结构体变量的指针处理(1)声明struct Student,并定义结构体数组、初始化(2)定义指向struct Student类型指针p(3)使p指向数组首元素,输出元素中各信息(4)使p指向下一个元素,输出元素中各信息(5)再使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息#include #include struct Student struct Student int num; char name20; int num; char name20; char sex; int age;

23、char sex; int age; ;struct Student stu3=struct Student stu3= 10101,Li Lin,M,18, 10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20 ; 10104,Wang Min,F,20 ;int main()int main() struct Student struct Student * *p; p; printf( No. Name sex agen); printf( No. Name sex agen)

24、; for(p=stu;pstu+3;p+) for(p=stu;pnum, p-name, p-num, p-name, p-sex, p-age); p-sex, p-age); return 0; return 0; 10101Li LinM1810102 Zhang Fang M1910104Wang MinF20stu0stu1stu2int main()int main() struct Student struct Student * *p; p; printf( No. Name sex agen); printf( No. Name sex agen); for(p=stu;

25、pstu+3;p+) for(p=stu;pnum, p-name, p-num, p-name, p-sex, p-age); p-sex, p-age); return 0; return 0; 10101Li LinM1810102 Zhang Fang M1910104Wang MinF20pstu0stu1stu2int main()int main() struct Student struct Student * *p; p; printf( No. Name sex agen); printf( No. Name sex agen); for(p=stu;pstu+3;p+)

26、for(p=stu;pnum, p-name, p-num, p-name, p-sex, p-age); p-sex, p-age); return 0; return 0; 10101Li LinM1810102 Zhang Fang M1910104Wang MinF20pstu0stu1stu2int main()int main() struct Student struct Student * *p; p; printf( No. Name sex agen); printf( No. Name sex agen); for(p=stu;pstu+3;p+) for(p=stu;p

27、num, p-name, p-num, p-name, p-sex, p-age); p-sex, p-age); return 0; return 0; 10101Li LinM1810102 Zhang Fang M1910104Wang MinF20pstu0stu1stu.1 什么是链表什么是链表9.4.2 9.4.2 建立简单的静态链表建立简单的静态链表9.4.3 9.4.3 建立动态链表建立动态链表9.4.4 9.4.4 输出链表输出链表链表是一种常见的重要的数据结构链表是一种常见的重要的数据结构它是动态地进行存储分配的一种结构它是动态地进行存储分配的一种结构he

28、ad12491249A135613561475B1475C10211021DNULL头指针头指针各结点地址不连续各结点地址不连续各结点含有两个部分各结点含有两个部分表尾表尾链表是一种常见的重要的数据结构链表是一种常见的重要的数据结构它是动态地进行存储分配的一种结构它是动态地进行存储分配的一种结构链表必须利用指针变量才能实现链表必须利用指针变量才能实现struct Studentstruct Student int num; int num; float score;float score; struct Student struct Student * *next; next; a,b,ca,

29、b,c; ;1010189.510103901010785a结点结点b结点结点c结点结点a.next=&b;b.next=&c;numscorenext 例例9.8 9.8 建立一个如图所示的简单链表,建立一个如图所示的简单链表,它由它由3 3个学生数据的结点组成,要求输个学生数据的结点组成,要求输出各结点中的数据。出各结点中的数据。1010189.510103901010785a结点结点b结点结点c结点结点numscorenext解题思路:解题思路:1010189.510103901010785a结点结点b结点结点c结点结点numscorenextheadhead=&a;a.next=&b;

30、b.next=&c;NULLc.next=NULL;#include #include struct Studentstruct Student int num; int num; float score; float score; struct Student struct Student * *next;next; ;int main()int main() struct Student a, b, c, struct Student a, b, c, * *head, head, * *p; p; a. num=10101; a.score=89.5; a. num=10101; a.s

31、core=89.5; b. num=10103; b.score=90; b. num=10103; b.score=90; c. num=10107; c.score=85; c. num=10107; c.score=85; head=&a; a.next=&b; head=&a; a.next=&b; b.next=&c; c.next=NULL; b.next=&c; c.next=NULL; p=head; p=head; do do printf(“%ld%5.1fn”,p-num,p-score); printf(“%ld%5.1fn”,p-num,p-score); p=p-n

32、ext; p=p-next; while(p!=NULL); while(p!=NULL); return 0; return 0; 所谓建立动态链表是指在程序执行过所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。据,并建立起前后相链的关系。动态链表的示意图 对链表的主要操作有以下几种: 1. 建立链表; 2. 结点的查找与输出; 3. 插入一个结点; 4. 删除一个结点;申请内存函数 (malloc) void * malloc( unsigned si

33、ze ) 功能:申请长度为size字节的内存区。若申请成功,函数返回所分配的内存区首字节的地址,即指向该内存的指针;若申请失败,函数返回NULL。 实例:要申请1个长度为10的整型数组空间,用指针指向数组的首地址,则可使用下列语句动态申请内存空间。 int * p; p = (int *) malloc( 10 * sizeof(int ) );释放内存 (free) void free (void * p ) 功能:释放p所指的内存空间。函数无返回值。这里p所指的内存区域必须是用函数malloc申请的内存空间,否则调用时使用其它指针,可能会破坏系统。例: #include void main

34、 ( ) int *p=(int *)malloc(sizeof(int) ); *p = 5; free(p); #define LEN sizeof(struct stu) struct stu int num,age; struct stu *next; ; struct stu *creat(int n) struct stu *head,*p1,*p2; int i; for(i=1;inum,&p1-age); if(i=1) head=p1; else p2-next=p1; p1-next=NULL; p2=p1; return(head); 算法的思路:1、让p1指向新的结点;2、p2指向链表中最后一个结点;3、把p1所指的结点

温馨提示

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

最新文档

评论

0/150

提交评论