用户建立的数据类型_第1页
用户建立的数据类型_第2页
用户建立的数据类型_第3页
用户建立的数据类型_第4页
用户建立的数据类型_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

1、 有时需要将不同类型的数据组合成一个有机的整体,以便于引用。有时需要将不同类型的数据组合成一个有机的整体,以便于引用。如:一个学生有学号、姓名、性别、年龄、成绩、地址等属性如:一个学生有学号、姓名、性别、年龄、成绩、地址等属性 int num; char name20; char sex; int age; float score; int char addr30; 问题定义:问题定义:100101 Li Fun M 18 87.5 Beijing Num name sex age score addr应当把它们组织成一个组合项,在一个应当把它们组织成一个组合项,在一个组合项中包含若干个类型不

2、同(当然也组合项中包含若干个类型不同(当然也可以相同)的数据项。可以相同)的数据项。 struct 结构体名结构体名 成员表列;成员表列;声明一个结构体类型的一般形式为:声明一个结构体类型的一般形式为:说明:说明: 结构体类型并不是只有一种,而是可以根据需要设计出许多结构体类型并不是只有一种,而是可以根据需要设计出许多种结构体类型;种结构体类型; 成员也可以是一个结构体类型的变量;成员也可以是一个结构体类型的变量; “结构体结构体”这个词是根据英文单词这个词是根据英文单词structure译出的。译出的。struct student int num; char name20; char sex

3、; int age; float score; char addr30; ;结构体类型名结构体类型名成员类型成员类型名名成员名成员名struct student int num; char name20; char sex; int age; float score; char addr30; ;已定义的结构体类型可以像已定义的结构体类型可以像基类型一样使用。基类型一样使用。可以采取以下可以采取以下3种方法定义结构体类型变量:种方法定义结构体类型变量:(1) 先声明结构体类型再定义变量名先声明结构体类型再定义变量名例如:例如:struct student student1, student2;

4、 结构体类型名结构体类型名 结构体变量名结构体变量名 定义了定义了student1和和student2为为struct student类型类型(应事先已应事先已声明声明)的变量,即它们具有的变量,即它们具有struct student类型的结构。类型的结构。100101 ZhangXin M 19 90.5 Shanghai100102 WangLi F 20 98 Beijing在在TC中占字节数中占字节数2201243059一般形式为一般形式为: struct结构体名结构体名 成员表列成员表列 变量名表列;变量名表列;(2) 在声明类型的同时定义变量在声明类型的同时定义变量struct s

5、tudent int num; char name20; char sex; int age; float score; char addr30; student1,student2; 它的作用与第一种方法相同,即定它的作用与第一种方法相同,即定义了两个义了两个struct student 类型的变量类型的变量student1, student2。 如果需要,在程序中还可以定义该种如果需要,在程序中还可以定义该种结构体类型的其它变量。结构体类型的其它变量。(3) 不指定类型名而直接定义结构体类型变量不指定类型名而直接定义结构体类型变量(1) 结构体类型与结构体变量是不同的概念,不能混同。结构体

6、类型与结构体变量是不同的概念,不能混同。(2) 结构体类型中的成员名可以与程序中的变量名相同,结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。但二者不代表同一对象。(3) 对结构体变量中的成员(即对结构体变量中的成员(即“域域”),可以单独使用,),可以单独使用,它的作用与地位相当于普通变量。它的作用与地位相当于普通变量。(1)(1)同类的结构体变量可以互相赋值同类的结构体变量可以互相赋值 如:如:student1=student2;student1=student2; 但不能将一个结构体变量作为一个整体进行输入和输出。但不能将一个结构体变量作为一个整体进行输入和输出。 如

7、如: : 已定义已定义student1student1和和student2student2为结构体变量并已有值,为结构体变量并已有值, printf(%d,%s,%c,%d,%fprintf(%d,%s,%c,%d,%f,%,%n,student1); n,student1); (2)(2)如果成员本身又属一个结构体类型如果成员本身又属一个结构体类型, ,则要用若干个成员运算符则要用若干个成员运算符, ,一级一级地找到最低一级的成员,进行赋值或存取及运算。一级一级地找到最低一级的成员,进行赋值或存取及运算。 如如: : 访问上面定义的结构体变量访问上面定义的结构体变量student1stude

8、nt1的各成员的各成员 student1.numstudent1.num student1. student1.birthdaybirthday. .monthmonth定义了结构体变量后,便可以引用这个变量。但应遵守以下规则定义了结构体变量后,便可以引用这个变量。但应遵守以下规则:(3) (3) 对结构体变量的成员可以像普通变量一样进行各种运算(根对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。据其类型决定可以进行的运算)。 如:如: student2.score=student1.score;student2.score=student1.score; s

9、um=student1.score+student2.score; sum=student1.score+student2.score; student1.age+; student1.age+; +student2.age; +student2.age;(4) (4) 可引用结构体变量成员的地址,也可引用结构体变量的地址。可引用结构体变量成员的地址,也可引用结构体变量的地址。 如:如:scanf(%d,&student1.num); scanf(%d,&student1.num); /为为成员成员student1.numstudent1.num赋值赋值 printf(%opr

10、intf(%o,student1student1); ; /输出输出变量变量student1student1的首地址的首地址 但不能用以下语句整体读入结构体变量但不能用以下语句整体读入结构体变量 如:如: scanf(%d,s,c,d,f,s,student1);); 结构体变量的地址主要用作函数参数,传递结构体变量的地址结构体变量的地址主要用作函数参数,传递结构体变量的地址。 9.2.1 定义结构体数组定义结构体数组 与定义结构体变量的方法相似,只需说明其为数组即可。与定义结构体变量的方法相似,只需说明其为数组即可。 如:如:struct student int num; char name

11、20; char sex; int age; float score; char addr30; ;struct student stu3; stu3; /*直接定义结构体数组直接定义结构体数组*/定义了一个数组定义了一个数组stu,数组有个元素,均数组有个元素,均为为struct student类型类型数据。数据。 9.2.2 结构体数组的初始化结构体数组的初始化与其它类型的数组一样,对结构体数组可以初始化。与其它类型的数组一样,对结构体数组可以初始化。如:如: struct student int num;char name20; char sex; int age; float scor

12、e; char addr30; stu3=10101,LiLin,M,18,87.5,103 BeijingRoad, 10102,Zhang Fun,M,19,99,130 Shanghai Road, 10104 ,Wang Min,F,20,78.5 ,1010 Zhongshan Road ;图9-4定义结构体数组定义结构体数组 9.2.3 结构体数组应用举例结构体数组应用举例对候选人得票的统计程序。设有对候选人得票的统计程序。设有3个候选人,每次输入一个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。个得票的候选人的名字,要求最后输出各人得票结果。#include

13、#include struct person char name20; int count; leader3=Li,0,Zhang,0,Fun,0; void 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,)=0) leaderj.count+; printf(nResoult:n); for (i=0;inum先使自加,然后得到它指向的元素中先使自加,然后得到它指向的元素中 的的num成员

14、值(即成员值(即10102)。)。 (p+)-num先得到先得到-num的值(即的值(即10101),然后使),然后使 自加,指向自加,指向stu1。(2) 程序已定义了是一个指向程序已定义了是一个指向struct student类型数据的指针类型数据的指针变量,它用来指向一个变量,它用来指向一个struct student类型的数据类型的数据,不应用来不应用来指向指向stu数组元素中的某一成员。数组元素中的某一成员。 将一个结构体变量的值传递给另一个函数,有将一个结构体变量的值传递给另一个函数,有3个方法个方法: 用结构体变量的成员作参数。用结构体变量的成员作参数。 用结构体变量作实参。用结

15、构体变量作实参。 用指向结构体变量(或数组)的指针作实参,将结构体变用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。量(或数组)的地址传给形参。有一个结构体变量有一个结构体变量stu,内含学生学号、姓名和,内含学生学号、姓名和3门门课程的成绩。要求在课程的成绩。要求在main函数中赋予值,在另一函函数中赋予值,在另一函数数print中将它们输出。今用结构体变量作函数参数中将它们输出。今用结构体变量作函数参数#include struct student int num; char name20; float score3; ; void main() void p

16、rint(struct student); struct student stu; stu.num=12345; strcpy(,Li Li); stu.score0=67.5; stu.score1=89; stu.score2=78.6; print(stu); void print(struct student stu)printf(num:%dnname:%snscore:%5.1f,%5.1f,%5.1fn, stu.num,,stu.score0,stu.score1,stu.score2); 将上题改用指向将上题改用指向结构体变量的指针变量。结构体

17、变量的指针变量。 链表是一种常见的重要的数据结构链表是一种常见的重要的数据结构, ,是动态地进行存储分配是动态地进行存储分配的一种结构。的一种结构。链表的组成:链表的组成:头指针:存放一个地址,该地址指向一个元素头指针:存放一个地址,该地址指向一个元素 结点:用户需要的实际数据和链接节点的指针结点:用户需要的实际数据和链接节点的指针 链表是一种常见的重要的数据结构链表是一种常见的重要的数据结构, ,是动态地进行存储分配是动态地进行存储分配的一种结构。的一种结构。链表的组成:链表的组成:头指针:存放一个地址,该地址指向一个元素头指针:存放一个地址,该地址指向一个元素 结点:用户需要的实际数据和链

18、接节点的指针结点:用户需要的实际数据和链接节点的指针 链表是一种常见的重要的数据结构链表是一种常见的重要的数据结构, ,是动态地进行存储分配是动态地进行存储分配的一种结构。的一种结构。链表的组成:链表的组成:头指针:存放一个地址,该地址指向一个元素头指针:存放一个地址,该地址指向一个元素 结点:用户需要的实际数据和链接节点的指针结点:用户需要的实际数据和链接节点的指针用结构体建立链表:用结构体建立链表:struct student int num; float score; struct student *next ;; 其中成员其中成员num和和score用来存放结点中的有用数据(用户需要用

19、到用来存放结点中的有用数据(用户需要用到的数据),的数据),next是指针类型的成员,它指向是指针类型的成员,它指向struct student类型数据类型数据(这就是(这就是next所在的结构体类型)所在的结构体类型)建立上图所示的简链表建立上图所示的简链表,它由个学生数据的节点组,它由个学生数据的节点组成。输出个节点中的数据。成。输出个节点中的数据。 所谓建立动态链表是指在程序执行过程中从无到有地建立所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。立起前后相链的

20、关系。写一函数建立一个有写一函数建立一个有3名学生数据的单向动态链表。名学生数据的单向动态链表。 算法如图算法如图算法的实现算法的实现1 1: 约定学号不会为零,如果输入的约定学号不会为零,如果输入的学号为,则表示建立链表的过程完学号为,则表示建立链表的过程完成,该结点不应连接到链表中。成,该结点不应连接到链表中。 如果输入的如果输入的p1-nump1-num不等于,不等于,则输入的是第一个结点数据(则输入的是第一个结点数据(n=1n=1),),令令headheadp1p1,即把,即把p1p1的值赋给的值赋给headhead,也就是使也就是使headhead也指向新开辟的结点也指向新开辟的结点

21、p1p1所指向的新开辟的结点就成为链表中所指向的新开辟的结点就成为链表中第一个结点。第一个结点。图9-13算法的实现算法的实现2 2: 再开辟另一个结点并使再开辟另一个结点并使p1p1指向它,接着输入该结点的数据指向它,接着输入该结点的数据. . 如果输入的如果输入的p1-nump1-num,则应链入第个结点(,则应链入第个结点(n=2), n=2), 将新结将新结点的地址赋给第一个结点的点的地址赋给第一个结点的nextnext成员。成员。 接着使,也就是使指向刚才建立的结点。接着使,也就是使指向刚才建立的结点。图9-14算法的实现算法的实现3 3: 再开辟一个结点并使再开辟一个结点并使p1p

22、1指向它,并输入该结点的数据。指向它,并输入该结点的数据。 在第三次循环中,由于(在第三次循环中,由于(),又将的值赋),又将的值赋给给-,也就是将第个结点连接到第个结点之后,也就是将第个结点连接到第个结点之后,并使,使指向最后一个结点。并使,使指向最后一个结点。图9-15算法的实现算法的实现4 4: 再开辟一个新结点,并使再开辟一个新结点,并使p1p1指向它,输入该结点的数据。由于指向它,输入该结点的数据。由于p1-nump1-num的值为,不再执行循环,此新结点不应被连接到链表中的值为,不再执行循环,此新结点不应被连接到链表中. .将将NULLNULL赋给赋给p2-next.p2-next

23、. 建立链表过程至此结束,建立链表过程至此结束,p1p1最后所指的结点未链入链表中,最后所指的结点未链入链表中,第三个结点的第三个结点的nextnext成员的值为成员的值为NULLNULL,它不指向任何结点。,它不指向任何结点。图9-16建立链表的函数如下建立链表的函数如下: #include #include #define NULL 0 /令令NULL代表,用它表示代表,用它表示“空地址空地址#define LEN sizeof(struct student) /令令LEN代表代表struct /student类型数据的长度类型数据的长度 struct student long num;

24、float score; struct student *next; ;int n; /n为全局变量,本文件模块中各函数均可使用它为全局变量,本文件模块中各函数均可使用它struct student *creat(void) struct student *head; struct student *p1,*p2; n=0; p1=p2=( struct student*) malloc(LEN); scanf(%ld,%f,&p1-num,&p1-score); head=NULL; while(p1-num!=0) n=n+1; if(n=1)head=p1; else p

25、2-next=p1; p2=p1; p1=(struct student*)malloc(LEN); scanf(%ld,%f,&p1-num,&p1-score); p2-next=NULL; return(head); 首先要知道链表第一个结点的地址,也就是要知道首先要知道链表第一个结点的地址,也就是要知道head的值。的值。然后设一个指针变量然后设一个指针变量p,先指向第一个结点,输出所指的结点,然先指向第一个结点,输出所指的结点,然后使后移一个结点,再输出,直到链表的尾结点。后使后移一个结点,再输出,直到链表的尾结点。编写一个输出链表的函数编写一个输出链表的函数prin

26、t 。void print(struct student *head) struct student *p; printf(nNow,These %d records are:n,n); p=head; if(head!=NULL) do printf(%ld %5.1fn,p-num,p-score); p=p-next; while(p!=NULL); 使几个不同的变量共占同一段内存的结构。使几个不同的变量共占同一段内存的结构。例如:例如: union data union data int i; int i; char ch; 或或 char ch; float f; float f;

27、a,b,c; ;union data a,b,c;上面定义的上面定义的“共用体共用体”变量、各占个字节(因为一变量、各占个字节(因为一个实型变量占个字节),而不是各占个字节。个实型变量占个字节),而不是各占个字节。 (1) (1) 同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。只能存放其中一种,而不是同时存放几种。(2) (2) 共用体变量中起作用的成员是最后一次存放的成员,在存入一个共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。新的成员后原有的成员

28、就失去作用。 (3) (3) 共用体变量的地址和它的各成员的地址都是同一地址。共用体变量的地址和它的各成员的地址都是同一地址。(4) (4) 不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化。又不能在定义共用体变量时对它初始化。(5) (5) 以前的以前的C C规定不能把共用体变量作为函数参数,但可以使用指向规定不能把共用体变量作为函数参数,但可以使用指向共用体变量的指针作函数参数。共用体变量的指针作函数参数。ANSIANSI新标准放宽了限制,允许用新标准放宽了限制,允许用共用体变量作为函数参数。共用体变量作为函数参数。(6) (6) 共用体类型可以出现在结构体类型定义中,也可以定义共用体数共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。作为共用体的成员。 本章小结本章小结1. C语言中有两类数据:一类是系统已经定义好的

温馨提示

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

评论

0/150

提交评论