1、12022-7-2922022-7-293 一个学生的信息有一个学生的信息有学号学号、姓名姓名、性别性别、年龄年龄、住住址址、成绩成绩等。等。一本图书的信息有一本图书的信息有分类编号分类编号、书名书名、作者作者、出版出版社社、出版日期出版日期、价格价格、库存量库存量等。等。如何描述这些类型不同的相关数据?如何描述这些类型不同的相关数据?一种构造类型数据一种构造类型数据 结构体结构体由若干不同类型的数据项组成,由若干不同类型的数据项组成,构成结构体的各个数据项称为构成结构体的各个数据项称为结构体成员结构体成员。2022-7-294 数据类型数据类型1 成员名成员名1;数据类型数据类型2 成员名成
2、员名2;数据类型数据类型n 成员名成员名n;lstructstruct为关键字;为关键字;l结构体名结构体名是用户定义是用户定义的的类型标识类型标识。l 中是组成该结构体中是组成该结构体的的成员成员。成员的。成员的数据数据类型类型可以是可以是C语言所允语言所允许的任何数据类型许的任何数据类型。2022-7-295例如图书类型的定义:例如图书类型的定义:struct bookcard char num10;/*图书图书分类编号是字符数组类型分类编号是字符数组类型*/char name30;/*书名是字符数组类型书名是字符数组类型*/char author30;/*作者是字符数组类型作者是字符数组
3、类型*/char publisher60;/*出版社是字符数组类型出版社是字符数组类型*/float price;/*价格是单精度实型价格是单精度实型*/int n;/*库存量是整型库存量是整型*/;例如学生类型的定义:例如学生类型的定义:struct student char num8;/*学号是学号是字符数组字符数组类型类型*/char name30;/*姓名是姓名是字符数组字符数组类型类型*/char sex;/*性别是性别是字符型字符型 */int age;/*年龄是年龄是整型整型 */char addr60;/*住址是住址是字符数组字符数组类型类型*/int score6;/*成绩是
4、成绩是整型数组整型数组类型类型*/;2022-7-296 按照结构体类型的组成,系统为定义的结构体按照结构体类型的组成,系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存变量分配内存单元。结构体变量的各个成员在内存中占用连续存储区域,中占用连续存储区域,结构体变量结构体变量所占内存所占内存结构体中结构体中每个成员每个成员所占用内存的所占用内存的长度之和长度之和。2022-7-297应先定义一个应先定义一个,而后再定义,而后再定义。系统对系统对不分配空间,仅对不分配空间,仅对分配空间。分配空间。只能对只能对赋值、存取或运算,而不能对一个赋值、存取或运算,而不能对一个赋值、存取或运算。
5、赋值、存取或运算。不不同结构体类型的成员名相同,同结构体类型的成员名相同,struct date int year,month,day;struct student char num8;char name30;char sex;birthday;/*成员为结构体类型成员为结构体类型*/char addr60;int score6;2022-7-298例如:例如:2022-7-299例如:例如:2022-7-2910 如果初值个数少于结构体成员个数,如果初值个数少于结构体成员个数,则将无初值对应的成员赋以则将无初值对应的成员赋以0值。值。如果初值个数多于结构体成员个数,如果初值个数多于结构体成员
6、个数,则编译出错。则编译出错。2022-7-2911 元素的个数可以省略,根据赋初值时元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数结构体常量的个数确定数组元素的个数 2022-7-29122022-7-29132022-7-29142022-7-2915 结构体变量结构体变量a的各成员可分别表示为的各成员可分别表示为a.num、a.name、a.sex、a.birthday、a.score a.birthday.yeara.birthday.montha.birthday.day 2022-7-2916【例例9.6】编写一个统计选票的程序。】编写一个统计选票的程序。str
7、uct candidate char name20;/*name为候选人姓名为候选人姓名*/int count;/*count为候选人得票数为候选人得票数*/list=invalid,0,Zhao,0,Qian,0,Sun,0,Li,0,Zhou,0;2022-7-2917main()int i,n;printf(Enter voten);scanf(%d,&n);/*输入所投候选人编号,编号从输入所投候选人编号,编号从1 1开始开始*/while(n!=-1)/*当输入编号为当输入编号为-1-1时,表示投票结束时,表示投票结束*/if(n=1&n=5)listn.count+;/*有效票,则
8、相应候选人计票成员加有效票,则相应候选人计票成员加1 1*/else printf(invalidn);list0.count+;/*无效票无效票,list0的计票成员加的计票成员加1*/scanf(%d,&n);/*输入所投候选人编号输入所投候选人编号*/2022-7-2918for(i=1;i-”是指向结构体成员是指向结构体成员运算符,优先级为一级运算符,优先级为一级 p=&d.year2022-7-2921输入今天的日期,然后输出该日期。输入今天的日期,然后输出该日期。main()struct date /*在函数中定义结构体类型在函数中定义结构体类型 */int year,month,
9、day;today,*p=&today;/*定义结构体变量及其指针定义结构体变量及其指针 */printf(Enter today date(YYYY/MM/DD):);scanf(%d/%d/%d,&today.year,&today.month,&today.day);printf(Today:%d/%d/%dn,p-year,p-month,p-day);2022-7-29222022-7-2923ppppp1 H 1.0082 He 4.00263 Li 6.9414 Be 9.012182022-7-29242022-7-2925p101301101B200D3003012022-7
10、-29262022-7-29272022-7-29282022-7-2929 形参是结构体变量。调用此函数时,形参是结构体变量。调用此函数时,系统将分别为形参系统将分别为形参cx和和cy各分配一个各分配一个sizeof(struct complex)大小的内存空间,大小的内存空间,每个成员都要一一传递。每个成员都要一一传递。2022-7-29302022-7-2931 形参定义为指针型参数。函数调用时,实参传递的形参定义为指针型参数。函数调用时,实参传递的是结构体指针(地址),因此形参是结构体指针(地址),因此形参px、py可读取主调函可读取主调函数中变量的内容,乘积结果也可通过形参数中变量的
11、内容,乘积结果也可通过形参pz指针存到主指针存到主调函数中的目标变量。调函数中的目标变量。这样实参与形参之间的数据传递由多值(每个成员的值)这样实参与形参之间的数据传递由多值(每个成员的值)变成了单值(结构体变量的首地址)。变成了单值(结构体变量的首地址)。2022-7-29322022-7-2933 链表是一种动态数据结构,可根据需要链表是一种动态数据结构,可根据需要动态地分配存储单元。在数组中,插入或删动态地分配存储单元。在数组中,插入或删除一个元素都比较繁琐,而用链表则相对容除一个元素都比较繁琐,而用链表则相对容易。但是数组元素的引用比较简单,对于链易。但是数组元素的引用比较简单,对于链
12、表中结点数据的存取操作则相对复杂。表中结点数据的存取操作则相对复杂。head 1000 1032 3284 1296 1382 2008图图9.2 动态单向链表示意图动态单向链表示意图C3284H1296A1382I2008NNULLNULL10001032struct nodechar c;struct node *next;2022-7-2934 C语言提供了相关的存储管理库函数。这里语言提供了相关的存储管理库函数。这里仅介绍其中三个,它们的原型说明在仅介绍其中三个,它们的原型说明在“stdlib.h”头文件和头文件和“alloc.h”头文件中,使用头文件中,使用这三个函数时,应选择其中一
13、个头文件包含到这三个函数时,应选择其中一个头文件包含到源程序中。源程序中。2022-7-2935将函数返回值转换将函数返回值转换成结构体指针成结构体指针 2022-7-29362022-7-2937动态分配了动态分配了10个存放整个存放整型数据的存储单元型数据的存储单元 2022-7-2938 实参必须是一个指向动态分配存储区实参必须是一个指向动态分配存储区的指针,它可以是任何类型的指针变量。的指针,它可以是任何类型的指针变量。2022-7-2939q 建立链表就是根据需要一个一个地开建立链表就是根据需要一个一个地开辟新结点,在结点中存放数据并建立结点辟新结点,在结点中存放数据并建立结点之间的
14、链接关系。之间的链接关系。头指针头指针h设为设为NULL读入一个学生姓名读入一个学生姓名 当姓名长度不为当姓名长度不为0 开辟新结点开辟新结点 p=NEW strcpy(p-name,name)gets(p-tel)p-next=NULL h=NULL T F h指向第一个指向第一个 连接新结点连接新结点 结点结点 h=p q-next=p q指向新的尾结点指向新的尾结点 q=p 读入一个学生姓名读入一个学生姓名图图9.3 建立单向链表建立单向链表NULLhppq 2022-7-29402022-7-2941hp p指向第一个结点指向第一个结点 p=head 当当p不为不为NULL 输出结点数
15、据输出结点数据 p指向下一个结点指向下一个结点 p=p-next图图9.5 输出链表的输出链表的N-S图图pppNULLNULL2022-7-29422022-7-2943hNULLNULL第第i-1个结点个结点 第第i个结点个结点 第第i+1个结点个结点 2022-7-2944 p=head while(strcmp(x,p-name)!=0&p-next!=NULLNULL)q指针跟随指针跟随p指针后移查找指针后移查找(q=p;p=p-next;)strcmp(x,p-name)=0 T F p=head T F head=p-next q-next=p-next 没找到没找到 free(
16、p)图图9.9 删除链表中指定结点的删除链表中指定结点的N-S图图删除删除第一个第一个结点结点 删除中间删除中间结点或尾结点或尾结点结点 删除结点工删除结点工作分两步:作分两步:查找结点查找结点删除结点删除结点学生姓名学生姓名当姓名不同并且当姓名不同并且不是尾结点循环不是尾结点循环2022-7-2945hp2022-7-2946hpp q2022-7-2947hppp qq 2022-7-2948查找结点查找结点 2022-7-2949hNULLNULL第第i个结点个结点ppqqp0p新的第新的第i个结点个结点2022-7-2950 head=NULL T F p=head head=p0 w
17、hile(strcmp(x,p-name)!=0&p-next!=NULLNULL)p0-next q指针跟随指针跟随p指针后移查找指针后移查找(q=p;p=p-next;)=NULL NULL strcmp(x,p-name)=0 T F p=head T F p-next=p0 head=p0 q-next=p0 p0-next=NULLNULL p0-next=p图图9.11 在链表指定位置前插入结点的在链表指定位置前插入结点的N-S图图当姓名不同并且当姓名不同并且不是尾结点循环不是尾结点循环空表时空表时插入插入结点结点在表尾在表尾追加结点追加结点 插入结点工插入结点工作分两步:作分两步
18、:查找插查找插入位置入位置连接连接新结点新结点在表头在表头插入结点插入结点 在表中间在表中间插入结点插入结点 2022-7-2951hpp02022-7-2952hpqp02022-7-2953hppp qq p02022-7-2954查找插入点查找插入点 2022-7-29552022-7-29562022-7-2957可以先选择可以先选择1 1建建立一个链表,然立一个链表,然后根据需要选择后根据需要选择功能功能2 2、功能、功能3 3、功能功能4 4、直到选、直到选择择0 0退出程序的退出程序的运行运行 2022-7-29582022-7-2959 结构体类型解决了如何描述一个逻辑上相关,
19、但结构体类型解决了如何描述一个逻辑上相关,但数据类型不同的一组分量的集合。数据类型不同的一组分量的集合。在需要节省内存储空间时,在需要节省内存储空间时,c c语言还提供了一种语言还提供了一种由若干个不同类型的数据项组成,但由若干个不同类型的数据项组成,但共享同一存储空共享同一存储空间间的构造类型。的构造类型。一种构造类型数据一种构造类型数据 共用体共用体由若干不同类型的数据项组成,由若干不同类型的数据项组成,构成共用体的各个数据项称为构成共用体的各个数据项称为共用体成员共用体成员。2022-7-2960 数据类型数据类型1 成员名成员名1;数据类型数据类型2 成员名成员名2;数据类型数据类型n
20、 成员名成员名n;lunionunion为关键字;为关键字;l共用体名共用体名是用户定义是用户定义的的类型标识类型标识。l 中是组成该共用体中是组成该共用体的的成员成员。成员的。成员的数据数据类型类型可以是可以是C语言所允语言所允许的任何数据类型许的任何数据类型。2022-7-2961例如:例如:union utype int i;char ch;long l;char c4;定义了一个定义了一个union union utypeutype共用体共用体类型,共用体类型定义不分配内存类型,共用体类型定义不分配内存空间,只是说明此类型数据的组成空间,只是说明此类型数据的组成情况。情况。2022-7
21、-2962 按照共用体类型的组成,系统为定义的共用体按照共用体类型的组成,系统为定义的共用体变量分配内存单元。变量分配内存单元。共用体变量共用体变量所占内存所占内存共用体中占用内存的共用体中占用内存的长度最长的成员长度最长的成员。2022-7-2963例如:例如:union utype int i;char ch;long l;char c4;a,b,c;2022-7-2964例如:例如:union int i;char ch;long l;char c4;2022-7-2965 union utype int i;char ch;long l;char c4;a,b,c;2022-7-296
22、6 union utype int i;char ch;long l;char c4;a,*p=&a;2022-7-2967例如:例如:2022-7-2968 共用体类型变量在定义时只能对第一共用体类型变量在定义时只能对第一个成员进行赋初值。个成员进行赋初值。由于第一个成员是字符型,用一个字由于第一个成员是字符型,用一个字节,所以对于初值节,所以对于初值0 0 x9741x9741仅能接受仅能接受0 0 x41x41,初值的高字节被截去。初值的高字节被截去。1.A 41A 412.a 61a 61对对u2u2成员的引成员的引用是无意义的用是无意义的2022-7-2969123456785678
23、7830541984122081A低地址低地址高地址高地址高地址高地址低地址低地址2022-7-2970 枚举枚举是一个具有有限个是一个具有有限个整型符号常量的整型符号常量的集合集合,这些整型符号常量称为枚举常量。,这些整型符号常量称为枚举常量。每个枚举类型都必须进行类型的定义,每个枚举类型都必须进行类型的定义,定义时必须将其所有的枚举常量一一列举,定义时必须将其所有的枚举常量一一列举,以便限定此枚举类型变量的取值范围。以便限定此枚举类型变量的取值范围。2022-7-2971 在枚举类型中,每个在枚举类型中,每个枚举常量枚举常量都代表一都代表一个整型值。在定义枚举类型的同时可隐式或个整型值。在
24、定义枚举类型的同时可隐式或显式地显式地定义枚举常量所代表的值定义枚举常量所代表的值。01234562022-7-297223452022-7-2973 enumenum 枚举名枚举名 枚举变量名表枚举变量名表;enumenum 枚举名枚举名 枚举常量取值表枚举常量取值表 枚举变量表枚举变量表;enumenum 枚举常量取值表枚举常量取值表 枚举变量表枚举变量表;2022-7-2974 赋值运算赋值运算 =true;=red;=yellow;=lightblue;=white;用用sizeofsizeof运算符计算枚举变量所占内存空间运算符计算枚举变量所占内存空间是是enum color2类型的
25、枚举值类型的枚举值2022-7-2975 取址运算取址运算 关系运算关系运算truefalse SunSat (1)(0)2022-7-2976 枚举变量的输出枚举变量的输出 枚举变量的输入枚举变量的输入 枚举变量作为整型变量进行输入。例如:枚举变量作为整型变量进行输入。例如:scanf(%d,&fg);1含义不直观含义不直观 2022-7-2977switch(fg)case false:printf(false);break;case true:printf(true);枚举变量的输出枚举变量的输出方法二:利用多分支选择语句输出枚举常量对应方法二:利用多分支选择语句输出枚举常量对应的字符串
26、。的字符串。2022-7-2978enum flag false,true fg;char*name=false,true;fg=true;printf(%s,namefg);枚举变量的输出枚举变量的输出方法三:依据枚举值,运用指针方法输出对应的方法三:依据枚举值,运用指针方法输出对应的字符串。字符串。2022-7-2979fg=true;printf(%s,fg);枚举变量的输出枚举变量的输出 枚举常量是标识符,不是字符串,以输出字符枚举常量是标识符,不是字符串,以输出字符串方式输出枚举常量是错误的。串方式输出枚举常量是错误的。2022-7-2980【例【例9.20】编制一个程序。当输入今天
27、的星期序号后,】编制一个程序。当输入今天的星期序号后,输出明天是星期几。输出明天是星期几。enum weekday Mon=1,Tue,Wed,Thu,Fri,Sat,Sun;char*name8=error,Mon,Tue,Wed,Thu,Fri,Sat,Sun;2022-7-2981main()enum weekday d;printf(Input todays numeral(1-7):);scanf(%d,&d);if(d0&d7)d+;/*今天是星期一到星期六的时候今天是星期一到星期六的时候*/else if(d=7)d=1;/*今天是星期日今天是星期日*/else d=0;if(d
28、)printf(Tomorrow is%s.n,named);else printf(%sn,named);2022-7-2982为类型名定义别名的一般形式为类型名定义别名的一般形式:类型名类型名 或或 类型定义类型定义 是关键字是关键字;可以是可以是基本类型、构造类型、指针类基本类型、构造类型、指针类型或自定义类型名;型或自定义类型名;是自定义的类型名是自定义的类型名。2022-7-2983typedef int COUNTER;/*定义定义COUNTER为整型类型名为整型类型名*/typedef struct date int year;int month;int day;DATE;/*定
29、义定义DATE为为struct date结构体类型名结构体类型名*/新类型名与旧类型名作用相同,并且可同时使用。新类型名与旧类型名作用相同,并且可同时使用。int i;与与 COUNTER i;等价。等价。struct date birthday;与与 DATE birthday;等价。等价。2022-7-2984 为基本类型命名为基本类型命名例如:例如:typedef float REAL;REAL x,y;/*相当于相当于float x,y;*/为数组类型命名为数组类型命名例如:例如:typedef char CHARR80;CHARR c,d4;/*相当于相当于char c80,d480
30、;*/2022-7-2985 为指针类型命名为指针类型命名例如:例如:typedef int *IPOINT;IPOINT ip;/*相当于相当于int*ip;*/IPOINT *pp;/*相当于相当于int *pp;*/typedef int (*FUNpoint)();FUNpoint funp;/*相当于相当于int(*funp)();*/2022-7-2986 为结构体、共用体类型命名为结构体、共用体类型命名例如:例如:struct node char c;struct node*next;typedef struct node CHNODE;CHNODE *p;/*相当于相当于struct node*p;*/struct CHNODE *p;
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。