




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章结构体与共用体,1、结构体类型的定义2、结构体变量的定义及引用3、结构体数组4、结构体类型的指针5、链表的基本操作6、共用体和枚举类型(了解),结构体类型的引入,问题:为了描述一个事物的不同属性,需要用到各种不同类型的数据,这些数据彼此相关,形成一个有机的整体。例如:一个教师的基本信息由姓名、性别、年龄、职称、工资等几项组合而成。如何描述一个教师的情况呢?前面我们已学习过各种基本类型的变量和数组,而且我们知道,各个变量之间是相互独立的,无任何联系;而数组只能用来表示一批相同类型的数据。因此,若用单个变量分别表示教师的姓名、性别、年龄等属性,则难以反映他们之间的内在联系;若用数组,则根本无法表示,因为姓名、性别、年龄等不属同一种数据类型。C语言中用“结构体”来描述由多个不同类型的数据组成的数据集合。相当于其他高级语言中的“记录”.,11.1结构体类型的定义,与基本数据类型不同的是,结构体是又一种构造类型,是由多个类型的数据成员组合而来的。因此该类型的具体内容应根据需要先定义,后使用。可以定义如下结构体类型来描述教师的基本情况:structteacher/*struct是关键字*/charname30;/*内是该类型的各成员*/charsex;intage;charposition10;floatsalary;/*语句末尾是“;”*/该结构体类型名为structteacher,teacher是该结构体的标识符;该类型包含有6个成员的数据项:name、sex、age、position和salary,其中每个成员项都有自己的类型。,可见,定义一种新的结构体类型的一般形式是:struct结构体类型名成员类型成员名;成员类型成员名;其中,struct是关键字,结构体类型名、结构体成员名的命名规则同变量的命名规则一样。特别提示:structteacher只是一种具体的结构体类型,根据需要,程序员可以定义多个不同内容的结构体类型。其中的成员项是该类型的组成部分,而不是变量。结构体类型的成员可以是基本类型的变量或数组,也可以是结构体类型的数据。即结构体类型的嵌套定义。例如,若将教师的年龄改为出生日期,则可以将出生日期定义为一个结构体类型,然后嵌入structteacher中。,将出生日期单独定义为一个结构体类型后再嵌入。Structdate_typeintyear;intmonth;intday;Structteacher_2charname30;charsex;structdate_typebirthday;charposition10;floatsalary;(常用),直接嵌入。Structteacher_3charname30;charsex;structdate_typeintyear;intmonth;intday;birthday;charposition10;floatsalary;/*成员birthday又是一个结构体类型的数据。*/,11.2结构体变量的定义及引用,经以上定义后,结构体类型structteacher与系统定义的类型int、long、float等一样,可以用它来定义该类型的变量、数组、函数等。不同的是:结构体类型的作用范围是有限制的。在函数体内定义的结构体类型的作用域为本函数内,在函数体外定义的结构体类型的作用域为本程序文件内,若要引用不在本文件内的结构体类型,通常用#include命令将定义该类型的文件包含进来。例11.1定义一个结构体变量,用于存放一个教师的信息,然后将其输出。,#includestdio.hmain()structteacher/*该类型的作用范围在本函数内*/charname30;charsex;intage;charposition10;floatsalary;structteacherperson;/*定义结构体变量person*/strcpy(,wangli);person.sex=f;/*给各成员赋值*/person.age=30;strcpy(person.position,middle);person.salary=1600;,printf(nnamesexagepositionsalary);printf(n%-10s%3c%5d%10s%8.2f,,person.sex,person.age,person.position,person.salary);分析:*本例中结构体类型在函数体内定义,其作用范围在本函数体内。*先定义结构体类型,后定义结构体变量。*对结构体变量输入输出操作、或将基本类型的数据赋给结构体变量时,需分别访问各个基本类型的成员,不能整体赋值或输入输出。如:printf(“%s%c%d%s%f”,person);错!person=“lili”,f,24,“primary”,1000;错!,例11.2定义一个结构体类型,包含通讯录中的如下信息:姓名、年龄、电话、通讯地址;并定义该类型的变量,输入数据并输出。程序l11_2.c#includestdio.hstructaddress_list/*在函数体外定义结构体类型*/charname10;/*该类型的作用域为本程序内*/intage;chartel10;charaddress40;main()structaddress_lists;/*定义变量s,占空间62个字节*/printf(ninputname:);gets();,printf(inputage:);scanf(%d,分析:*结构体类型address_list放在函数体外定义,其作用范围为本程序文件内。*结构体变量的输入输出需逐个访问基本类型的成员,引用方法与同类型的变量、数组相同。,例11.3定义一结构体类型,包含工人的工资信息:编号、姓名、工资。并定义变量存放两人的数据,然后交换,输出交换前后的信息。程序l11_3.c#includestdio.hmain()structsalary_listcharno10;charname30;floatsalary;structsalary_listz,x=10,liming,2000,y=12,wangyan,2500;/*结构体变量的初始化,给出各成员的数据并用括起来,各成员之间用逗号分开*/,printf(nnonamesalary);printf(nx:%-5s%-6s%10.2f,x.no,,x.salary);printf(ny:%-5s%-6s%10.2f,y.no,,y.salary);z=x;x=y;y=z;/*交换两个结构体变量*/printf(nafterexchange:);printf(nx:%-5s%-6s%10.2f,x.no,,x.salary);printf(ny:%-5s%-6s%10.2f,y.no,,y.salary);特别提示:同类型的结构体变量可以整体赋值,即可以将一个结构体变量整体赋给相同类型的另一个结构体变量。,说明一、定义结构体变量,定义结构体变量的方法有三种,(经常用第一种):方法一:先定义结构体类型,再定义结构体变量。如:structteachert1,t2;(例11.1)方法二:定义结构体类型的同时定义结构体变量(例11.2)。又如:structcoursemathlongno;4Bcharname30;math,english;30B若以后还需用到此结构体类型,定义方法同1:structcoursechemic;方法三:格式同方法(二),其中类型名course省略,缺点是该类型无法再次引用。*结构体变量的存储:系统按结构体类型中各成员的类型给变量分配存储空间。如上图:,noname,说明二、结构体变量的引用,结构体变量定义后,可以分两个层次引用:*访问结构体变量的成员。*引用整个结构体变量。1、使用成员运算符“.”引用结构体变量的成员,“.”的优先级仅次于括号。如例11.1、11.2、11.3中的,person.agex.no,s,salary等成员的赋值、输入、输出。person.age+等价于(person.age)+对结构体变量中的成员的操作与基本类型的变量完全相同。注意:当结构体类型嵌套定义时,应逐级访问。如structteacher_2pp;pp.birthday.year=1999;2、相同类型的结构体变量之间可以整体赋值。如例11.3中交换两个结构体变量的值。,11.2结构体数组,结构体数组用于保存一批同类型的结构体数据。每个数组元素相当于一个结构体变量。例:11.4输入三门课的信息(课程编号、课程名),并输出。分析:*每门课的信息包含2项,用结构体类型表示,其成员有两项,即课程编号和课程名。*三门课的信息,用一维数组保存。输入:可以赋初值,也可由用户输入,本例中采用赋初值的方式。程序l11_2_1.c说明:结构体数组的初始化同基本类型的一维数组,只不过每个数组元素是用括起的一个结构体常量。数组元素中每个成员的访问,同变量的成员的访问。,例11.5输入N个学生的学号、姓名、三门课的成绩,计算每人的平均成绩,并按平均成绩由高到低排序,输出排序后的成绩表。分析:*每个学生的信息包括多项,用结构体类型表示,其成员有学号、姓名、三门课的成绩、平均成绩。N个学生的信息用一维数组保存。*算法:输入并计算平均成绩、排序、输出三步。可将后面两项功能分别用函数实现,在主函数中调用。设排序函数为sort(),输出函数为output().分析每个函数的具体组成:函数类型参数函数体程序l11_2_2.c,/*例11.5程序*/structstucharno8;charname10;floatscore3;floataver;#includestdio.h#includestdlib.h#defineN3#defineSTU_SCstructstu,main()voidsort(STU_SCsc1),output(STU_SCsc2);STU_SCsc_listN;inti,j;chartemp10;floatsum;printf(ninputno,name,score(13):);for(i=0;iN;i+)printf(nstudent%d:n,i+1);sum=0;printf(no:);gets(sc_listi.no);printf(name:);gets(sc_);for(j=0;j为指向运算符,即取指针变量指向的结构体数据的成员。如:p-real等价于(*p).real其含义为:取指针变量p指向的结构体数据的成员real。例11.3.2使用指向结构体数组元素的指针引用数组元素:输入输出N个复数。分析:复数用结构体类型表示,输入时用下标法引用数组元素,输出实用指针引用各元素。注意:p+的含义是p指向下一个数组元素。为了引用已定义的结构体类型,通常将结构体类型名定义为更简单的宏名。,structcomplexintreal;intimage;#defineCOMPLEXstructcomplex#defineN5main()COMPLEXssN,*p;inti;printf(ninput%dcomplex:n,N);for(i=0;i”引用成员*/printf(n%d+%di,p-real,p-image);,11.4动态内存分配与链表,动态内存分配的引入问题:如果要在内存中保存一个班学生的数据,按照现有的手段,首先要知道该班的人数,然后据此定义数组,可是,每一个班的人数并不完全相同,并且是浮动的,用确定长度的数组无法保存任意班级学生的数据,如果定义的数组太大,造成内存浪费,太小将导致程序无法实现原功能要求。这显然不够理想和灵活。解决以上问题的方法是使用动态内存分配:在程序运行中实时申请内存分配,申请到的内存在不用时还可以随时释放。这样就可以根据每次运行程序时要处理的数据的多少随时申请内存,因此可以处理任意人数的数据。,用于动态内存分配的和释放的函数:(1)malloc()函数原型:void*malloc(unsignedintsize)功能:申请分配size字节的连续内存空间。若分配成功,函数返回所分配内存的首地址;否则返回空指针(NULL)。(2)calloc()函数原型:void*calloc(unsignedintn,unsignedintsize)功能:申请分配n各连续的内存空间、每个空间为size字节。若成功,返回所分配内存的首地址;否则返回空指针(NULL)。(3)free()函数原型:voidfree(void*p)功能:释放以前分配到的、指针p指向的内存空间。无返回值。,例11.4.1编程实现:输入一批实验数据(整型),计算其平均值。(个数由用户输入)#include#includemain()intn,i,*p;floatsum=0;printf(ninputdatasnum:);scanf(%d,printf(ninput%dinteger:,n);for(i=0;inext=p1;然后p2后移:p2=p1;使得p2始终指向结点。重复以上过程。,申请一个结点空间并输入数据,structwork*input()structwork*q;floatx;q=(structwork*)malloc(LEN);if(!q)printf(nfailure.);exit(0);printf(ninputaworkersinformation(no=0forend):n);printf(no:);scanf(%ld,/*返回该结点的首地址*/,建立链表,返回头指针,structwork*create(void)structwork*head,*p1,*p2;intn=0;p1=p2=input();head=NULL;while(p1-no!=0)n+;if(n=1)head=p1;elsep2-next=p1;p2=p1;p1=input();/*输入下一个人的信息*/p2-next=NULL;return(head);,二、添加结点,功能:在链表的末尾追加多个结点,直至输入的结点编号等于0为止。函数:structwork*append(structwork*head)算法:指针p指向链表的尾结点,q指向新输入的结点。重复执行:若链表为空,则q指向的结点尾头结点;否则,将q链在p之后。,添加结点之链表尾,structwork*append(structwork*head2)structwork*q,*p=head2;q=input();q-next=NULL;while(q-no!=0)if(head2!=NULL)while(p-next!=NULL)p=p-next;p-next=q;elsehead2=p=q;q=input();q-next=NULL;return(head2);,三、输出链表各结点,算法:指针p指向链表的头结点,然后重复:若p指向的结点不为空,即链表未结束,则输出链表的结点成员;p指向下一个结点。,输出链表各结点,voidout_list(structwork*head)structwork*p;printf(nnonamesalaryn);p=head;if(head=NULL)printf(nnodata.);elsewhile(p!=NULL)printf(n%4ld%10s%7.2f,p-no,p-name,p-salary);p=p-next;,四、按编号删除结点,函数:structwork*delete(structwork*head3,longno)算法:先判断链表是否为空,若是,则结束;否则,从头结点开始查找要删除的结点。若找到,则删除,即将其从链表中去掉,并释放该结点;否则,若到了链表的为结点仍未找到,则输出“notfound”。,按编号删除结点,structwork*delete(structwork*head3,intno)structwork*p,*q=head3;if(head3=NULL)printf(nlistnull.);return(head3);while(no!=q-no,在第n个结点前插入一个结点,分析:变量p指向第n个结点,q指向第n-1个结点,即新结点插在p和q指向的结点之间。分三种情况:1)插在头结点之前。2)插在中间:t-next=p;q-next=t;3)链表中无第n个结点。,在第n个结点前插入一个结点,structwork*insert(structwork*head,intn)inti;structwork*p=head,*q,*t;t=input();if(n=1)t-next=head;head=t;return(head);/*插在表头*/for(i=1;inext!=NULL)q=p;p=p-next;elsebreak;if(ino!=0)q-next=t;t-next=p;return(head);,主函数,#include#include#defineLENsizeof(structwork)main()structwork*head;longnum;intn1;head=create();printf(nappend:);head=append(head);printf(ninsert:);scanf(%d,11.5共用体,所谓共用体数据类型是指将不同的数据项组织为一个整体,它们在内存中占用首地址相同的一段存储单元。共用体也称为联合。例如:unionexaminta;floatb;charc;x;,共用体类型说明的一般形式为:union共用体标识名类型名1共用体成员名表1;类型名2共用体成员名表2;类型名n共用体成员名表n;其中union是关键字,是共用体类型的标志。共用体中的成员可以是简单变量,也可以是数组、指针、结构体和共用体。,11.5.2共用体变量的定义及引用,定义共用体变量的方式与结构体变量相似。1定义类型的同时定义变量。uniondatainti;charch;floatf;a,b,c;2将类型定义与变量定义分开。uniondatainti;charch;floatf;;uniondataa,b,c;,3直接定义共用体变量。unioninti;charch;floatf;a,b,c;可以引用一个共用体变量中的某个成员,引用方式与引用结构体变量中的成员相似。例如:a.i=5;a.ch=b;a.f=8.6;特别提示:一个共用体变量不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- ccs变更点管理办法
- 贵州国省道管理办法
- 中央厨房运作管理办法
- 财务公司管理办法讲解
- 维保修工作管理办法
- 规范课程实施管理办法
- 试验室操作管理办法
- 装修消费管理办法细则
- 苏水基建设管理办法
- 中国收养儿童管理办法
- DB65-T 4773-2024 生物安全实验室消毒技术指南
- 人教版PEP四年级英语上册Unit-1-My-classroom课件
- Starter知识点清单(含默写)2024-2025学年牛津上海版英语六年级上册
- 2024年新北师大版七年级上册数学全册课件(新版教材)
- 《新媒体运营》全套教学课件
- 1安全生产关键节点清单及核查内容清单
- 2024-2029年中国金枪鱼行业市场发展分析及发展趋势与投资前景研究报告
- 抖音火花合同电子版获取教程
- HYT 0318-2021 填海项目竣工海域使用验收测量规范
- 高中历史知识竞赛省公开课一等奖全国示范课微课金奖课件
- 燃气管道保护方案(雨污分流二标)
评论
0/150
提交评论