




免费预览已结束,剩余81页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章结构体和共用体,本章目录,8.1结构体,8.2结构体数组,8.3指向结构体类型数据的指针,8.4链表,8.5共用体,8.1如何用计算机程序实现下述表格的管理?,表8-1某学校学生成绩管理表,8.1结构体,数组的解决方法,intstudentId30;/*最多可以管理30个学生,每个学生的学号用数组的下标表示*/charstudentName3010;charstudentSex302;inttimeOfEnter30;/*入学时间用int表示*/intscoreComputer30;/*计算机原理课的成绩*/intscoreEnglish30;/*英语课的成绩*/intscoreMath30;/*数学课的成绩*/intscoreMusic30;/*音乐课的成绩*/,8.1结构体,数据的内存管理方式,8.1结构体,希望的内存分配图,8.1结构体,C语言提供了一种数据结构,可以把这些不同类型的数据组成一个整体,这就是结构类型。结构类型是各种结构的总称,是一种构造类型。一个结构变量可以由不同类型的成员变量组成,这些成员变量又称为结构的域、分量。结构的所有成员除自身的名字外,还拥有共同的名字,即结构变量名。,8.1结构体,struct结构体名数据类型1成员名1;数据类型2成员名2;数据类型n成员名n;,结构体类型定义的一般形式:,struct为关键字;结构体名是用户定义的类型标识。中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。,8.1结构体,8.1结构体,例如,描述日期定义的结构体类型:structdateintyear;intmonth;intday;其中date是结构体名,该结构体类型是由三个成员组成。成员都是整型,编者可根据自己需求编写成员,成员的数据类型可以是任何数据类型,当然也可以包含结构体类型。注意最后大括号后要加上分号“;”作为结束。,structSTUDENTintstudentID;/*每个学生的序号*/charstudentName10;/*每个学生的姓名*/charstudentSex4;/*每个学生的性别*/inttimeOfEnter;/*每个学生的入学时间*/intscoreComputer;/*每个学生的计算机原理成绩*/intscoreEnglish;/*每个学生的英语成绩*/intscoreMath;/*每个学生的数学成绩*/intscoreMusic;/*每个学生的音乐成绩*/;structSTUDENT是一个类型structSTUDENTstudents4;students0.studentIDstudents0.scoreComputer它们都是变量,一般称为结构的成员变量,8.1结构体,在定义结构体类型的同时定义变量,例如:structstudentcharnum8,name20,sex;intage;floatscore;st30;,struct结构体名成员定义表;变量名表;,8.1结构体,直接定义结构体类型变量,例如:structcharnum8,name20,sex;intage;floatscore;st30,a,b,c;,struct成员定义表;变量名表;,8.1结构体,在结构的说明中,结构成员可以为任何类型且结构成员还可以和结构外部的其它变量同名,不同结构的成员也可以同名,但同一结构的成员不能同名。,8.1结构体,例如学生类型的定义:structstudentcharnum8;/*学号是字符数组类型*/charname30;/*姓名是字符数组类型*/charsex;/*性别是字符型*/intage;/*年龄是整型*/charaddr60;/*住址是字符数组类型*/intscore6;/*成绩是整型数组类型*/;,8.1结构体,利用已定义的结构体类型名定义变量struct结构体名变量名表;例如:structstudents30,t1,t2;,按照结构体类型的组成,系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存中占用连续存储区域。,8.1结构体,1结构的初始化结构变量在说明时可以初始化,初值是由常量表达式组成的初值表。例如,structstudentcharname10;shortsex;intage;floatscore;student1“zhangsan”,1,20,88.8;,8.1结构体,2结构变量的引用对结构变量的引用只允许下列5种情况:(1)同类型的结构变量相互赋值。例如student2=student1;(2)函数返回的结构成员给同类型的结构变量。(3)对结构变量取地址。例如student1.sex=0;scanf(“%s”,);但=”zhangsan”;则为非法。结构体变量的成员不允许用赋值语句将一组常量直接赋给一个结构体变量。输入下面语句不合法:Student1=WangLi,18,M,12,15,1974,89101,89.5;,8.1结构体,4嵌套的结构结构的一个成员可以是一个结构,含有结构成员的结构称为嵌套的结构。,如果成员本身又属于一个结构体类型,则需要再次使用取成员运算符“”,这样逐级的应用成员运算符找到最低级的成员。例如:student1.birthday.year,8.1结构体,structdateintyear,month,day;structstudentcharnum8;charname30;charsex;structdatebirthday;/*成员为结构体类型*/charaddr60;intscore6;,8.1结构体,8.1结构体,例8.1学生信息输出。structdateintmonth;intday;intyear;structstud_typecharname20;intage;charsex;structdatebirthday;longnum;floatscore;main(),8.1结构体,structstud_typestudent1=WangLi,20,M,12,15,1978,89101,89.5;structstud_typestudent2;student2=student1;printf(student1:%s,%d,%c,%d,%d,%d,%ld,%5.2fn,,student1.age,student1.sex,student1.birthday.month,student1.birthday.day,student1.birthday.year,student1.num,student1.score);printf(student2:%s,%d,%c,%d,%d,%d,%ld,%5.2fn,,student2.age,student2.sex,student2.birthday.month,student2.birthday.day,student2.birthday.year,student2.num,student2.score);运行情况如下:,结构数组定义的一般格式为:struct结构体名结构体数组名元素个数,结构体数组名元素个数,;,8.2结构体数组,例如:structstudentintnum;charname10;charsex;intage;floatscore;charaddr30;structstudentstu3;以上定义了一个数组stu,其元素为structstudent类型数据,数组有3个元素。,8.2结构体数组,2、结构体数组的初始化struct结构体名结构体数组名=初始数据表列;,8.2结构体数组,structSTUDENTintstudentID;charstudentName10;charstudentSex4;structdatetimeOfEnter;intscoreComputer;intscoreEnglish;intscoreMath;intscoreMusic;structSTUDENTstu30;,8.2结构体数组,structSTUDENTstu30=1,令狐冲,男,1999,12,20,90,83,72,82,2,林平之,男,1999,07,06,78,92,88,78,3,岳灵珊,女,1999,07,06,89,72,98,66,4,任莹莹,女,1999,07,06,78,95,87,90;,8.2结构体数组,【例】对候选人得票的统计程序。设有三个侯选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。#includestructpersoncharname18;intcount;leader3=Li,0,Zhang,0,Wang,0;,8.2结构体数组,voidmain()inti,j;charleader_name18;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;jmonthp-day注意:成员引用表达式中的()不能省,如(*pd).day不能写成*pd.day,因为“.”运算符的优先级高于*,所以*pd.day等同于*(pd.day),在该例中为非法操作。结构成员运算符“-”和“.”的优先级相同,它们与()、属于同一优先级,按从左到右结合。,8.3指向结构体类型数据的指针,structpointintx;inty;structrectstructpointpt1;structpointpt2;,structrectrt;structrect*rp=下面表达式哪些合法?rt.pt1.x(*rp).pt1.xrp-pt1.xrt-pt1.x上面合法的表达式都是等价的吗?,8.3指向结构体类型数据的指针,【例】利用结构体指针输出一组化学元素名称及其原子量。structlistinti;charname4;floatw;tab4=1,H,1.008,2,He,4.0026,3,Li,6.941,4,Be,9.01218;,8.3.2用结构的指针引用结构数组的成员,8.3.2指向结构体数组的指针对构体数组及其元素可以用指针变量来指向。,main()structlist*p;printf(NotNametAtomicWeightn);for(p=tab;pi,p-name,p-w);,NoNameAtomicWeight,1H1.008,2He4.0026,3Li6.941,4Be9.01218,8.3.2用结构的指针引用结构数组的成员,例8.2指向结构体数组的指针的应用。#includemain()structstudentintnum;charname20;charsex;intage;stu3=10101,LiLin,M,18,10102,ZhangFun,M,19,10104,Wangmin,F,20;structstudent*p;printf(No.Namesexagenn);for(p=stu;pnum,p-name,p-sex,p-age);运行结果,8.3指向结构体类型数据的指针,p是指向structstudent结构体类型数据的指针变量。执行p+,使p自加1。p指向了结构体数组中的stu1即“走“过了本例中2+20+1+225字节的存储单元,p指向了stu1,输出stu1中的各成员值之后,在进行下一此循环。注意:程序已定义了p是一个指向structstudent类型数据的指针变量,它用来指向一个structstudent类型的数据,不应用来指向stu数组元素中的某一成员。下面的用法是不对的:p=;编译时将给“警告”信息,表示地址的类型不匹配。,8.3指向结构体类型数据的指针,例8.3指向结构体变量的指针的应用#include#includestructstudentlongnum;charname20;charsex;floatscore;main()structstudentstu_1,*p;,8.3指向结构体类型数据的指针,p=运行结果:,8.4动态数据结构,8.4.1问题的提出例:学生成绩管理structstudentstu30;问题:(1)数组的存储容量是固定的,若实际学生人数超过元素最大个数或远小于元素最大个数,都会存在问题。(2)能否根据实际情况,要添加元素时,动态分配内存,删除元素时,动态释放内存呢?,C语言提供了相关的存储管理库函数。这里仅介绍其中三个,它们的原型说明在“stdlib.h”头文件和“malloc.h”头文件中,使用这三个函数时,应选择其中一个头文件包含到源程序中。,8.4动态数据结构,动态分配存储区函数malloc()函数原型:void*malloc(unsignedsize);调用格式:malloc(size)功能:在内存分配一个size字节的存储区。调用结果为新分配的存储区的首地址,是一个void类型指针。若分配失败,则返回NULL(即0)。,structstudent*pt;pt=(structstudent*)malloc(5*sizeof(structstudent);,动态分配和释放存储单元,8.4动态数据结构,【例】调用malloc函数分配所需存储单元。#includemain()structstintn;structst*next;*p;p=(structst*)malloc(sizeof(structst);p-n=5;p-next=NULL;printf(p-n=%dtp-next=%xn,p-n,p-next);,将函数返回值转换成结构体指针,8.4动态数据结构,动态分配存储区函数calloc()函数原型:void*calloc(unsignedintn,unsignedintsize);调用格式:calloc(n,size)功能:在内存分配一个n倍size字节的存储区。调用结果为新分配的存储区的首地址,是一个void类型指针。若分配失败,则返回NULL(即0)。,8.4动态数据结构,【例】调用calloc函数分配所需存储单元。#includemain()inti,*ip;ip=(int*)calloc(10,2);for(i=0;inext;,链表的删除操作,从链表中删除一个指定的结点:(1)遍历链表,搜索待删结点(2)若找到:如果待删结点是首结点:如果待删结点是中间结点:,在链表中,如果要删除第i个结点,一般是将第(i-1)个结点直接与第(i+1)个结点相连接,然后再释放第i个结点的存储单元。,删除单向链表中指定的结点,【例】删除学生电话簿链表中指定学生的信息。,删除第一个结点,删除中间结点或尾结点,学生姓名,当姓名不同并且不是尾结点循环,【例】删除学生电话簿链表中指定学生的信息。,(a)删除第一个结点(head=p-next),【例】删除学生电话簿链表中指定学生的信息。,(b)删除中间结点或尾结点(q-next=p-next),【例】删除学生电话簿链表中指定学生的信息。,(c)未找到指定的结点(strcmp(x,p-name)!=0),链表的插入操作,将一个新结点插入到链表中:(1)遍历链表,搜索待出入位置(2)如果在首结点前插入:如果在链表中间插入:如果在链表尾部插入:,将一个新结点插入到链表中,首先要寻找插入的位置。如果要求在第i个结点前插入,可设置三个工作指针p0、p和q,p0是指向待插入结点的指针。利用p和q指针查找第i个结点,找到后再将新结点链接到链表上。,q,q,新的第i个结点,在单向链表中插入结点,【例】在学生电话簿链表中插入一个学生的信息。要求将新的信息插入在指定学生信息之前,如果未找到指定学生,则追加在链表尾部。,(a)在表头插入结点(head=p0;p0-next=p),(b)在表中间插入结点(q-next=p0;p0-next=p),(c)在表尾追加结点(p-next=p0;p0-next=NULL),8.4链表,下面举例说名如何建立链表、如何插入一个结点及删除一个结点和输出。例8.6建立一个存放学生序号和成绩的链表,学生信息有键盘输入,数目不定,当输入学号为0时,建表结束,在进行删除一个学生信息,输出结果,最后插入该学生信息,输出结果。#include#include#defineNULL0#defineLENsizeof(structstudent)structstudentlongnum;floatscore;structstudent*next;intn;/*n为全局变量,本文件模块中各函数均可使用它*/,8.4链表,structstudent*creat()/*定义函数,此函数带回一个指向链表头的指针*/structstudent*head;structstudent*p1,*p2;n=0;p1=p2=(structstudent*)malloc(LEN);/*开辟一个新单元*/scanf(%ld,%f,8.4链表,structstudent*del(structstudent*head,longnum)structstudent*p1,*p2;if(head=NULL)printf(nlistnull!n);gotoend;p1=head;while(num!=p1-num,8.4链表,structstudent*insert(structstudent*head,structstudent*stud)structstudent*p0,*p1,*p2;p1=head;/*使p1指向第一个结点*/p0=stud;/*p0指向要插入到点*/if(head=NULL)/*原来的链表是空表*/head=p0;p0-next=NULL;/*使p0指向的结点作为头结点*/elsewhile(p0-nump1-num)/*p1后移一个结点*/if(p0-numnum)if(head=p1),8.4链表,head=p0;/*插到原来第一个结点之前*/elsep2-next=p0;/*插到p2指向的结点之后*/p0-next=p1;elsep1-next=p0;p0-next=NULL;/*插到最后的结点之后*/n=n+1;/*结点数加*/return(head);voidprint(structstudent*head)structstudent*p;printf(nNow.these%drecordsare:n,n);p=head;if(head!=NULL)doprintf(%ld%5.1fn,p-num,p-score);,8.4链表,p=p-next;while(p!=NULL);main()structstudent*head,stu;longdel_num;printf(inputrecords;n);head=creat();/*建立链表,返回头指针*/print(head);/*输出全部结点*/printf(ninputthedeletednumber:);scanf(%ld,8.4链表,运行结果:,8.5联合(共用体),在实际处理中为了方便处理,有时需要在不同的时刻将不同类型的值存放在同一变量中,而在任一时刻,该变量仅含特定类型的值,这种变量就是联合类型的变量(简称联合或联合类型变量)。联合的定义方式就是将struct用union代替,其它形式同结构相同。如:假定一个常量可能是int、double或字符串,为了用同一个存储区域来存放,可以说明如下的联合,unionunodeintival;doubledval;charstr100;u;分配存储单元时,编译程序按联合的成员中最长的那一个类型为联合变量分配存储空间。,8.5联合(共用体),1、先定义共用体类型,再定义共用体类型变量定义形式为:共用体类型名共用体变量名;例如:uniondatacharname10;charsex;intage;floatscore;/*定义uniondata共用体类型*/uniondatastu1,stu2;,8.5联合(共用体),2、在定义共用体类型的同时定义变量,定义形式为:union共用体名类型名1成员名1;类型名2成员名2;类型名n成员名n;变量名列表;例如:uniondatacharname10;charsex;intage;floatscore;stu1,stu2;/*定义stu1,stu2为uniondata类型变量*/,8.5联合(共用体),3、直接定义共用体类型变量,定义形式为:union类型1成员名1;类型2成员名2;类型n成员名n;变量名列表;例如:unioncharname10;charsex;intage;floatscore;stu1,stu2;/*定义stu1,stu2为uniondata类型变量*/,8.5联合(共用体),联合变量有地址,可以用charc;floatf;s1,s2;定义了共用体变量s1,s2,它们分别占用4个字节的存储单元。因为3个成员中float类型所占的字节数最多,所以共用体变量在内存中占用4个字节。2、共用体类型变量的引用方式共用体类型变量的引用方式与结构体类型变量的引用方式也很相似。只能引用共用体类型变量的成员,而不能引用共用体类型变量。引用的一般形式:共用体变量名.成员名对于上面的定义,下面的引用是合法的:s1.i=123;printf(“%d”,s1.i);,8.5联合(共用体),例如:unio
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年无人机考试题库和部份考题带答案(典型题)
- 小儿视网膜母细胞瘤E期护理查房
- 安丘市2024-2025学年八年级下学期语文期中模拟试卷
- 2016年7月国开电大法律事务专科《行政法与行政诉讼法》期末纸质考试试题及答案
- 七夕主题活动总结2025年
- 广东省2025年下半年电机装配工:基础理论试题
- 社区网格化管理课件
- 江苏省无锡金桥双语实验学校2024-2025学年九年级下学期期中考试英语试卷(含答案)
- Unit 2 School life单元测试卷(含解析)译林版(2024)八年级英语上册
- 岩石基坑开槽合同范本
- T/SFABA 5-2024食品配料天然度检测
- 铁路团体车票协议书
- 2025年中国高考评价体系深度分析解读课件
- 早产儿低体温管理
- 电梯日管控、周排查、月调度制度及管控清单(附记录表格)2
- 2025翻译行业发展报告
- 监控质量协议书范本
- 2025年CSCO胃癌诊疗指南解读
- GB/T 3543.2-2025农作物种子检验规程第2部分:扦样
- 2025年度专业技术人员继续教育公需科目考试题(附答案)
- 铁路防溜课件
评论
0/150
提交评论