C语言第09章--结构和联合

上传人:痛*** 文档编号:89991365 上传时间:2022-05-13 格式:DOC 页数:17 大小:67KB
返回 下载 相关 举报
C语言第09章--结构和联合_第1页
第1页 / 共17页
C语言第09章--结构和联合_第2页
第2页 / 共17页
C语言第09章--结构和联合_第3页
第3页 / 共17页
点击查看更多>>
资源描述
第九章 结构和联合日常生活中要处理的数据往往不是由单一类型的数据构成.例如,一个学生的基本信息就是由#、学号、性别、出生日期、所在院系、专业、班级等基本数据项共同构成.每个基本数据项都具有自己的属性.人们常常需要对由若干不同属性的数据项所组成的整体数据进行组织和处理.但由于各数据项的属性不尽相同,所以用数组亦不能有效地对其进行组织和处理.为此,语言提供了与数组类型不同的另一种构造类型 结构类型.9.1 结构类型和结构变量和数组相似,结构也是拥有若干分量的一种构造类型.但和数组不同的是,结构的各个分量可以分别具有不同的数据类型.结构的每一个分量都称为是该结构的一个成员.结构成员的数据类型可以是基本数据类型,也可以是指针、数组或其他结构类型.结构类型的定义形式是:struct 结构类型名类型1 成员1;类型2 成员2;类型n 成员n;例如:struct dateint year;unsigned short month;unsigned short day;在这个定义中,定义了一个新的数据类型date ,这是一个结构类型,共有三个成员,分别是year、month和day.每个成员都有自己的数据类型,比如month的数据类型是无符号短整型.定义了结构类型之后,我们便可以用其来定义相应的结构变量.可以采用以下三种方法来定义结构变量.1先定义结构类型再定义结构变量首先定义一个结构类型,然后再用其来定义结构变量.定义形式为:struct 结构类型名 变量1,变量2,变量n;例如:struct date d1,d2;便定义了两个date型的结构变量d1和d2.同前面介绍的变量一样,每个结构变量所需的存储空间大小也是由其类型决定的.如上面d1和d2所需的存储空间大小为sizeof个字节.注意,在用这种方法定义结构变量时,struct和结构类型名部分均不能省略.通常我们将程序中所用到的所有结构类型都在程序的头部或某一个头文件中集中定义.然后再根据需要用上述方法定义相应的结构变量.注意,定义结构类型时并不产生存储分配,只有在定义结构变量时才涉与到存储分配.2在定义结构类型的同时定义结构变量我们可以在定义结构类型的同时再定义相应的结构变量.例如:struct studentlong num;char name21;char sex;unsigned short age;unsigned class_num;char come_from31;float average_score; student1,student2;它的作用是定义了一个结构类型student,然后紧接着又定义了两个该类型的结构变量student1和student2.3直接定义结构变量此种方法和上面第二种方法类似,只不过没有定义结构类型名.其形式为:struct 类型1 成员1;类型2 成员2;类型n 成员n; 变量1,变量2,变量n;例如:structchar name21;unsigned short age;char sex; p1,p2,p3;定义了三个结构变量p1,p2,p3.但由于没有定义相应的结构类型,所以如果以后想再定义一个同类型的结构变量p4的话,上述语句还要重写一遍.再者,当结构的类型发生变化时,结构变量的定义也需重写.因此我们不提倡用这种办法来定义结构变量,除非编程者清楚地知道以后不会再用到该结构类型.上面我们介绍了结构类型与结构变量的定义方法.此外,一个结构的成员也可以是另一个结构.例如:struct dateint year;unsigned short month;unsigned short day;struct personchar name21;char sex;struct date birthday; /* 结构person的成员birthday又是另一个结构date */char department81;9.2 访问结构成员在定义了一个结构变量之后,便可以访问这个变量的成员.引用方式为:结构变量名.成员名这里,.称为成员运算符.例如:struct date d1,d2;d1.year=2002;d1.month=12;d1.day=25;d2.year=d1.year;d2.month=d1.month;d2.day=d1.day;printf;printf;从附录可知,成员运算符在所有的运算符中优先级最高,因此可以把上面的d1.year和d1.month 等当作为一个整体来看待.如:d1.year+; 等价于 +;d1.mongth+=2; 等价于 +=2;d2.day=d1.day+; 等价于 d2.day=+;需要注意的是:l 旧的标准规定不能将一个结构变量作为一个整体直接赋给另一个具有相同结构类型的结构变量,而只能对各个成员分别赋值.如:d2.year=d1.year;d2.month=d1.month;d2.day=d1.day;l 新的标准允许将一个结构变量直接赋给另一个具有相同结构类型的结构变量.如:d2=d1;l 如果结构变量的成员本身是一个结构类型,则要用若干个成员运算符,一级一级地找到最低层的成员.且只能对最低层的成员进行赋值、存取或运算.例如:struct person myself;strcpy;myself.sex=M;myself.birthday.year=1961;myself.birthday.month=4;myself.birthday.day=17;strcpy;注意:成员运算符是自左向右结合的.所以myself.birthday.year=1961; 等价于 .year=1961;l 和数组一样,标准规定,只有当结构变量为全局变量或静态变量时,才能在定义时对其初始化.例如:static struct person myself=ZhaoYongZhe,M,1961,4,17,Computer College of Jilin University;9.3 结构数组和结构指针 结构数组当数组中的每个元素都是同一类型的结构变量时,该数组称为结构数组.例如:struct studentlong num;char name21;char sex;unsigned short age;unsigned class_num;char come_from31;float average_score;/* 下面定义了一个一维student型结构数组stu并对其初始化 */static struct student stu3=200101,LiuMing,M,19,1,Shanghai,78.45,200102,WangMei,F,18,2,Changchun,94.78,200101,Zhangkai,M,20,3,Beijing,54.45; 结构指针结构对象的地址即为指向该结构对象的指针.我们可以定义一个结构指针变量来存放相应结构对象的地址.例如:struct student stu_1,stu_2,*p_stu;p_stu=&stu_1; 通过指向结构的指针访问结构成员我们可用前面介绍的成员运算符.来访问结构的成员.例如:struct student stu_1,stu_2,*p_stu=&stu_1;则stu_1.age=21;等价于.age=21;注意.age不能写成 *p_stu.age,这是因为成员运算符.的优先级高于指针运算符*的优先级.所以*p_stu.age等同于*而不是.age.由于经常要通过指向结构的指针来访问结构的成员.所以语言专门提供了一个指针成员运算符-.它是由一个减号-和一个大于号共同组成.其用法为:结构指针-成员名且有:结构指针-成员名等价于.成员名.所以上面的.age=21;也可以写成p_stu-age=21;注意.和-的优先级相同,均是自左向右结合的.至于采用哪一个则要看是通过结构变量还是结构指针来访问结构的成员.对于结构变量,只能通过.来访问其成员.而对于结构指针,尽管可以通过*和.来访问其所指结构对象的成员.但我们通常采用-的形式.还有一点要注意的是,结构指针的增量操作也和其他指针的增量操作一样,是以其所指对象所需占用的字节数为单位进行的.看下面的例子:例9.1 读入10个学生的信息,然后将平均成绩最高和最低者的#、班级、成绩输出.#include stdio.h#define N 10struct student /* 定义结构类型student */long num;char name21;char sex;unsigned short age;unsigned class_num;char come_from31;float average_score;void main struct student sN,*p,*p1,*p2;int i;fori=0;i /* 分别读入每个学生的信息 */printf;printf;scanf;printf;scanf;printf;scanf;printf;scanf;printf;scanf;printf;scanf;printf;scanf; forp=p1=p2=s;+p /* 让p1,p2分别指向成绩最高和最低的学生 */ifaverage_score p1-average_score p1=p;ifaverage_score average_score p2=p; printf;printf;printfname,p1-class_num,p1-average_score;printfname,p2-class_num,p2-average_score;9.4 sizeof运算符和的动态存储分配函数在语言中,sizeof是求字节数运算符,其优先级与+、-等运算符相同.sizeof的运算对象是数据类型,其返回值是这种类型数据在内存中占用的字节数.例如:sizeof,sizeof,sizeof等等.尽管同一种数据类型的对象在不同的编译系统中可能被分配了不同字节数的存储空间,但sizeof总能返回正确的字节数.所以建议大家使用sizeof来取代相应的整常数.这样编出的程序可实现与编译系统的无关性.此外,语言也是一个与操作系统无关型的程序设计语言.因为所有需与操作系统打交道的工作皆由相应的库函数来完成.所以用语言编程离开库函数将寸步难行.我们知道在程序中使用得最多的便是自动变量.而对自动变量的存储分配并不是在编译时完成,而是在程序运行时根据需要动态地进行.为了动态地分配存储空间,标准特提供了一个名为malloc的库函数,其定义形式如下:void *mallocunsigned bytes;malloc函数向操作系统申请一块长度为bytes个字节的连续存储空间,如申请成功,则返回一个无类型指针,其指向所分配空间的第一个字节.如果操作系统没有足够的可用空间,则malloc返回一个空指针NULL用以表明空间分配失败.注意,无类型指针相当于是一个地址类型或指针类型.由于其无类型或类型不定,所以必须对其进行强制类型转换后才能使用.从这个意义上说,void型指针又可看成是一个万能指针,可以根据需要将其转换为任意类型的指针,反之亦然.而NULL实际上是一个宏,它是在头文件stdio.h定义的.malloc函数的用法如下:char *p;p=malloc; /* 申请10个字节的空间,并将其首地址转换为字符指针 */ifputs;elseputs;相对于库函数malloc,语言还提供了另一个库函数free,函数free的定义形式如下:void freevoid *p;与malloc正好相反,函数free将p所指向的存储空间归还给操作系统.作为一个良好的程序设计习惯,在动态申请的空间使用完毕之后,应立即将其释放.注意,在用free将p所指的空间释放之后,p的值不变,即其仍指向原来的存储空间.显然,不访问这个已被释放的存储空间是程序员的职责.看下面例子:例9.2 从键盘读入一个正整数n,然后再依次读入n个整数,并按读入的反序将他们输出.#include void main int *p,i,n;printf;scanf;whilenprintf;scanf;ifp=mallocn*sizeof=NULL /* 申请一个动态一维数组p */puts;getchar;exit;printf;fori=0;i scanf;puts;for printf;getchar;free; /* 释放空间 */9.5 结构作为函数的参数在旧标准中,对结构的使用加有许多限制.在结构上可以执行的操作仅有用&来取得它的地址,和引用它的成员.这意味着不可以把整个结构变量当成一个参数传递给函数,或从函数返回整个结构.但是,指向结构的指针变量却不受这些限制,从而使结构和函数仍能在一起协调工作.函数可以返回指向结构的指针,也可以用指向结构的指针作为参数.例如:struct student *new struct student *p;p=mallocsizeof;if puts;return;是一个返回student结构指针的函数.新标准允许用整个结构作为函数的参数,例如:void out_infostruct student s;printf;printf;printf;printf;printf;printf;printf;上面的函数在调用时需要将实参结构的全部成员值一个一个地传递给形参结构变量s的对应成员,这样做既费时间,又费空间,系统开销也大.所以还是用指针作参数为妥.为此将其改为:void out_infostruct student *sp;printfnum;printfname;printfsex;printfage;printfclass_num;printfcome_from;printfaverage_score;9.6 结构的自引用前面我们提到,在定义结构类型时,一个结构的成员也可以是另一个结构类型.例如:struct personchar name21;char sex;struct date birthday; /* person的成员birthday又是另一个结构date */char department81;但下面的定义却是非法的:struct personchar name21;char sex;char department81;struct person father; /* person的成员father 又是结构person */;因为上面在定义结构person时产生无穷递归,所以无法对其进行存储空间分配.换句话说,一个person类型的对象将需要无限的存储空间.所以上述的定义是非法的.但下面的定义却是合法的:struct personchar name21;char sex;char department81;struct person *father; /* person的成员father 是一个person结构指针 */;这就是结构的自引用.注意,上面的定义不会产生无穷递归,因为结构person的成员father 只是一个指向person结构的指针,而不是person结构.所以一个person类型的对象仅需要有限的存储空间.结构的自引用通常用于构造链表,它是数据结构课程中的重点内容.在本书中不作介绍.9.7 位域存储空间的充分利用对于前面介绍的所有结构,他们成员的最小存储单位均为字节.即结构的每个成员至少要占用一个字节的存储空间.如上面结构person的成员sex,尽管只需1位的空间便足够了,但其却占用了一个字节.为了节省存储空间,语言允许用若干二进制位来存放结构的成员,这就是位域.所谓位域即是以二进制位为存储单位的结构成员.例如:struct personchar name21;unsigned sex:1;unsigned age:7;定义了一个结构类型person,其共有三个成员,其中成员sex和age都是位域.sex占1位存储空间,age占7位存储空间.但成员name不是位域.位域的引用与非位域一样,例如:例9.3#include #include struct person char name21; unsigned sex:1; unsigned age:7;main struct person p,*pp=&p; strcpy; p.sex=1; pp-age=27; printf; printfsizeof=%dn,sizeof;结果为:p.name= Zhang Wei,p.sex=1,p.age=27sizeof=22关于位域的定义和引用,要注意以下几点:l 位域的长度不能超过一个存储单元的长度.存储单元的长度由具体的编译系统决定,通常是一个字的长度.如Turbo C 3.0 是16位.l 若某一位域要从另一个储存单元开始存放,可以用以下形式定义:unsigned a:1;unsigned b:2; /* a,b存于同一个储存单元 */:0;unsigned c:3; /* c存于另一个存储单元 */本来a,b,c应连续存放在一个存储单元中,由于使用了长度为0的位域,其作用是使紧跟其后的下一个位域从下一个存储单元开始存放.因此a,b存储在同一个存储单元中,而将c存放在另一个存储单元中.l 可以定义无名位域,来跳过相应的位.如:unsigned a:1;:2; /* 跳过两位不用 */unsigned b:3;unsigned c:4;l 位域的类型通常为无符号整型.9.8 联合9.8.1 联合类型和联合变量联合也是一种类似于结构的构造类型.与结构类似,联合类型的定义形式是:union 联合类型名类型1 成员1;类型2 成员2;类型n 成员n;例如:union dataint i;char ch;float f;定义了一个新的数据类型data ,这是一个联合类型,其共有三个成员,分别是i、ch和f.每个成员都有自己的数据类型,比如f的数据类型是float型.定义了联合类型之后,我们便可以用其来定义相应的联合变量.同结构变量的定义一样,我们也可以采用以下三种方法来定义联合变量.1先定义联合类型再定义联合变量首先定义一个联合类型,然后再用其来定义联合变量.定义形式为:union 联合类型名 变量1,变量2,变量n;例如:union data u1,u2;便定义了两个data型的联合变量u1和u2.2在定义联合类型的同时定义联合变量我们可以在定义联合类型的同时再定义相应的联合变量.例如:union dataint i;char ch;float f; u1,u2;它的作用是定义了一个联合类型data,然后紧接着又定义了两个该类型的联合变量u1和u2.3直接定义联合变量此种方法和上面第二种方法类似,只不过没有定义联合类型名.其形式为:union类型1 成员1;类型2 成员2;类型n 成员n; 变量1,变量2,变量n;例如:unionint i;char ch;float f; u1,u2;结构和联合的区别是,结构的各个成员分别具有各自的存储空间,而联合的各个成员则共享同一块存储空间.所以结构变量所占据存储空间的大小是其各个成员所需存储空间之和,而联合变量所占据存储空间的大小是其各个成员所需存储空间的最大者.利用联合,可以将几种不同类型的变量存放到同一块内存单元中.例如,上面的联合类型data便将一个int型变量i、一个char型变量ch、一个float型变量f放在从同一个地址开始的内存单元中:ichf9.8.2 联合变量的引用方式联合变量的引用方式与结构变量相同,我们也可以通过.和-来饮用其成员.例如:union data u,*p=&u;u.i=123;p-ch=A;但由于联合变量的各个成员都共享同一块存储空间,所以在任一时刻只能有一个成员在起作用.也就是说,尽管一个联合变量有多个成员,但只有一个成员的值是有意义的,而引用其他成员的值都是无意义的.这个成员便是最近一次赋值所引用的成员.例如:例9.4#include union dataint i;char ch;float f;main union data u;u.i=123;u.ch=A;u.f=123.456;printf;printf;printf;结果为:u.i= -5767u.ch= yu.f= 123.456001可知对联合变量u的成员f的引用是有意义的,而对成员i和ch的引用则是无意义的.这是因为对联合变量u的最近一次赋值是对其成员f进行的,它使得以前对其成员i和ch的赋值变得无效.这也是联合与结构的区别所在.9.8.3 联合的特点联合提供了一种能在同一块存储区域内处理不同类型数据的方式.编译会为联合变量分配一块存储空间,该存储空间的大小刚好能容纳其最大的成员.这样其所有成员便能共享该块存储空间.引入联合的初衷是为了节省宝贵的内存,让多个变量共享同一块内存空间.这一点和FORTRAN语言中的EQUIVALENCE语句类似.但这样一来也产生了一个负面作用,那就是不便于对变量进行跟踪,损失了程序的易读性.这和现在所提倡的程序设计思想是相矛盾的.所以我们不提倡在程序中使用联合.但有时联合也是有其独特作用的.例如,我们想知道在中int型数据是如何存放的,即高字节和低字节是如何组织的.为此编写如下程序:例9.5#include union icint i;unsigned char ch2;main union ic u;u.i=32767;printf;u.i=32768;printf;结果为:u.ch1=7F,u.ch0=FFu.ch1=80,u.ch0=0由此可知一个int型数据的低字节存放其低8位,而高字节存放其高8位.这正是利用了无符号字符数组ch与整形变量i共享同一块存储空间的特点.在使用联合类型数据时要注意以下一些特点:l 在任一时刻,联合变量只有一个成员有意义,其它成员则无意义.正确地存取联合变量的某个成员是程序设计者的职责.l 联合变量中有意义的成员即是其最后一次赋值的成员.l 联合变量的地址和其各成员的地址相同.l 不能在定义联合变量的同时对其进行初始化.9.9 枚举类型枚举类型是ANSI 新标准所增加的.如果一个变量只有几种可能的值,则可以定义其为枚举类型.所谓枚举是指将变量的可能取值一一列举出来,变量的值只限于列举出来的值的范围.定义枚举类型用保留字enum.其定义形式为:enum 枚举类型名 枚举常量名=整形值, . 变量列表;例如:enum weekday sun,mon,tue,wed,thu,fri,sat;定义了一个枚举类型weekday.该枚举类型有7个枚举常量,分别是sun、mon、tue、wed、thu、fri和sat.和结构或联合类型一样,我们可以用枚举类型来定义相应的枚举变量.如:enum weekday d1,d2; 定义了两个weekday型的枚举变量d1和d2,它们的值可以是sun到sat之一.例如:d1=mon;d2=sun;我们也可以直接定义枚举变量,例如:enum red,yellow,blue color1,color2;同样,也可以同时定义枚举类型与枚举变量,例如:enum color red,yellow,blue color1,color2;枚举类型实际上是一个int型常量的集合.亦即每一个枚举常量实际上是一个int型常量,而枚举变量实际上是一个int型变量.使用枚举类型时要注意以下几点:1) 上述的枚举常量sun,mon,red,blue等是int型常量,所以不能对它们赋值.2) 枚举常量的值满足:第i个枚举常量的值 第i-1个枚举常量的值 + 1 .3) 按的缺省规定,第一个枚举常量的值为0.4) 在定义枚举类型时,可以指定每个枚举常量的值.如不指定,则按第2条的规定决定其值.5) 使不同的枚举常量具有不同的值是程序员的责任.6) 枚举变量同int型变量,同样,使其值落在合法的枚举常量的范围之内也是程序员的责任.7) 对枚举变量可进行同int型变量一样的运算和操作.例9.6#include enum color red=3,green,blue=4;enum workday mon,tue,wed=7,thu,fri;main enum color c1,c2;enum workday d1,d2;c1=red;c2=+c1;d1=mon;d2=wed;printf;printf;printf;printf;结果为:c1=4,c2=4d1=0,d2=7red=3,green=4,blue=4mon=0,tue=1,wed=7,thu=8,fri=9使用枚举类型与枚举变量的目的是增加程序的直观性和易读性.9.10 用typedef定义类型在语言中,还可以用typedef来定义一个新的类型名.例如:typedef int INTEGER;就定义了一个新的类型名INTEGER,即使INTEGER与int成为同义词.此后 INTEGER 就能用在类型int能出现的任何地方,且作用完全相同.例如:INTEGER i1,i2; 等价于 int i1,i2;INTEGER a10,*p; 等价于 int a10,*p;同样,typedef char *STRING;则定义了一个新类型名STRING,且其和类型成为同义词,即STRING为字符指针类型.以后我们就可以用STRING来定义字符指针变量.例如:STRING p,linesMAX_LINES; 等价于 char *p,*linesMAX_LINES;注意,用typedef定义的新类型名并不是紧跟在保留字typedef之后,且具体的语法也不太容易用一个语法表达式来刻画.我们可以这样来描述typedef的用法:如果要定义一个新类型名,则首先定义一个与之同名的同类型的变量,然后再在该变量的定义前面加上保留字typedef,则该变量名便上升成为类型名.例如:struct int month;int day;int year; DATE;定义了一个结构变量DATE,而typedef struct int month;int day;int year; DATE;则定义了一个相应的结构类型DATE.且DATE date1,date2;等价于typedef struct int month;int day;int year; date1,date2;可见,通过用typedef定义新类型可以简化程序的书写并提高程序的易读性.而程序的易读性是现代程序设计最重要的特性之一.他对程序的维护、功能扩充、移植等都具有举足轻重的作用.从前面的的预处理程序到现在的类型名定义,可以看出在这方面比别的程序设计语言有独到的设计,这也是之所以风靡全球的原因之一.为了和的保留字以与变量名相区别,用typedef定义的类型名通常总是用大写英文字母来命名.但必须强调的是,typedef并不是创建了一个新的数据类型,它只是为现有的某些数据类型起了一个新的名字而已,并没有扩展的数据类型.typedef与#define有相似之处.但事实上,它们二者是不同的.主要区别在:l typedef是的保留字,即不能用其来命名变量等对象,但define并不是的保留字,我们可以用其来命名变量,只不过不提倡这样做而已.l #define是在预处理时处理的,它只能做简单的字符串替换,而typedef是在编译时处理的.实际上它并不是做简单的字符串替换,例如:typedef int INTEGER; 在某些情况下可代之以 #define INTEGER int但 typedef int NUM10;却无法以任何#define代之.使用typedef有两个主要的理由:其一是有利于程序移植.如果把typedef用于可能与机器有关的数据类型,则在程序移植时仅需改变typedef,从而减少大量的程序修改工作.第二个原因是使用typedef能为程序提供更多的可读信息,用一个适当的符号名表示一个复杂的结构类型会增强程序的可读性.习 题9.1 填空 语言提供了三种构造数据类型,它们是、和 . 使几个不同类型的量共享同一段内存的结构,称为.9.2 单项选择 说明语句struct studentint num;char name20;char sex;定义了 . 结构类型student 联合类型student 结构变量student 数组类型student typedef structint month;int day;int year; DATE;定义了 宏名为DATE 结构变量DATE 联合类型DATE 新类型名DATE typedef structint month;int day;int year; *PDATE;定义了 . 结构类型PDATE 联合类型PDATE 宏PDATE 指向结构的指针类型PDATE unionint i;char ch;float f; a;定义了 . 联合类型a 联合变量a 结构类型a 结构变量a 若定义student nodeint key;struct node *next; a;则引用结构变量a的next成员需要采用 . a.next node.next a-next node-a.next 若定义enum colorred,yellow,blue,white;那么yellow的值为 . 0 1 2 yellow 若定义enum colorred=2,yellow,blue,white;那么blue的值为 . 0 2 2 无定义9.3 结构和联合有何区别?9.4 设每个学生的数据包括学号、#、年龄、五门课的成绩.试说明相应的结构类型student.9.5 设有50个学生的档案,数据结构同上,编制一个程序,它读入每个学生的档案数据,然后计算出每个学生的平均成绩和总成绩.最后将所有平均成绩高于总平均成绩的学生档案输出.9.6 簿中每个人的数据由#和 两项构成,试设计一个结构数组来表示 簿,读入每个人的数据并按 从小到大排序.然后等待用户输入一个 ,如果 簿中有该,则输出相应用户的#,否则输出此是空号的信息.9.7 建立一个链表,每个结点包括#和年龄.然后按年龄从小到大排序.9.8 学生的数据包括学号、#、性别、民族、出生日期、家庭住址与本人简历.其中出生日期和本人简历又分别是一个结构,分别由年、月、日和起止年月、简历、证明人构成.试说明相应的结构.9.9 要用计算机对图书馆中的图书进行管理,一本图书的信息包括:书名、作者、摘要、索引号、ISBN号、出版日期和页数.其中包括名称和地址.鉴于书和之间是多对一的关系,为了减少数据的冗余,应该如何设计所需要的结构?9.10 typedef int INTEGER;和宏替换#define INTEGER int有何区别?9.11 枚举类型在内部是如何表示的?引入它的主要目的是什么?9.12 定义复数类型并分别写出完成复数加、减、乘、除运算的函数.9.13 建立一个函数,它建立由siz个整数组成的动态数组,并能从键盘上读入数据,初始化这个数组.函数成功返回1,否则返回0.9.14 设计一个函数,其参数是一个一维数组名和数组中元素的个数,函数的返回值是数组元素的个数.若数组元素的数据类型为struct elemint key; /* 查询关键字 */int freq; /* key的查询频率 */设计这个函数,从键盘接收一个整数,在数组中查询该数是否存在,如果没有,就把它做为一个新项存入数组的key中.用freq记录查询频率.171 / 17
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!