




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
11.1概述11.2定义结构体类型变量的方法11.3结构体变量的引用11.4结构体变量的初始化11.5结构体数组11.6指向结构体类型数据的指针11.7用指针处理链表11.8共用体11.9枚举类型11.10用typedef定义类型,第十一章结构体与共用体,11.1概述数据的基本类型:整、实、字符。数组是构造类型:每个元素为同一类型有些问题仅用基本类型和数组来描述是无法实现的,需要将不同类型的数据组合成一个有机的整体。如学生情况:,这些数据类型虽不相同,但它们却是有机的整体,若将它们分别定义,则难以反映它们之间的内在联系。在C语言中,结构体是用户声明的一种数据类型,一经声明,就可用此类型定义相关的变量。如上述问题可声明如下数据类型:structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;作为类型名,它就和其它基本类型一样,用它来定义变量的类型。,struct是声明结构体类型时所必须使用的关键字,向编译系统声明这是个结构体类型,其中包含若干数据项,这个类型名的全称是:structstudent,声明一个结构体类型的一般形式:struct结构体名成员表列;结构体名又称结构体标志。这是用户自定义的类型,一经声明,就可以和其它基类型一样用来定义此种类型的变量了。,11.2定义结构体类型变量的方法有三种:1、先声明结构体类型,再定义变量名声明结构体类型不分配存储单元,用该类型定义变量时,分配存储单元。structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;则s1,s2这两个结构体变量各占59个字节的存储空间。,structstudents1,s2;,2.在声明类型的同时定义变量一般形式:struct结构体名成员表列变量名表列;例如:structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;s1,s2,s3;,3.直接定义结构体类型变量一般形式:struct成员表列变量名表列;例如:structintnum;charname20;charsex;intage;floatscore;charaddr30;s1,s2,s3;,s1,s2,s3尽管没有结构名,但每个结构体变量s1,s2,s3都具有如定义的各成员。,4、结构体类型的几点说明(1)、类型与变量意义不同,变量可以赋值、存取、存储等运算,而类型不能运算,不分配存储空间。(2)、结构体变量的使用遵循先声明结构体类型,再用该类型定义变量或组数;然后使用这些变量或数组。(3)、结构体变量中的成员可单独使用,方法如普通变量;(4)、成员名和程序中的变量名可相同,它们之间互不影响;(5)、结构体变量中的成员还可以是结构体变量,11.3结构体变量的引用结构体变量被定义后方可使用;1、引用方法:结构体变量名.成员名其中:.为成员分量运算符,其优先级为1,如:s1.num;2、结构体变量不能进行整体输入输出编译虽无错,但结果有误,如:scanf(“%d%s”,3、成员又可以是结构体类型运算时运算符一级一级找到最低一级成员,运算只能对最低一级成员进行,如:structdateintmonth;intday;intyear;structstudentintnum;charname20;charsex;intage;structdatebirthday;floatscore;charaddr30;s1,s2,s3;s1.num=11002;s2.birthday.month=8;s3.birthday.year=1983;s1.score=s2.score+s3.score;,11.4结构体变量的初始化结构体变量可以在定义时指定初始值main()structstudentlongintnum;charname20;charsex;charaddr20;a=112001,“LiLi”,M,“123BeijingRoad”;printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,a.num,,a.sex,a.addr);,11.5结构体数组11.5.1结构体数组的定义形式形式一:struct结构体类型名成员表列;struct结构体类型名数组名表列;形式二:struct结构体类型名成员表列数组名表列;形式三:struct成员表列数组名表列;,11.5.2、结构体数组的初始化如定义一维数组存放三个学生的有关信息main()inti;structstudentlongnum;charname20;charsex;intage;floatscore;charadd30;stu3=11200111,“LiLin”,M,18,87.5,“123BeijingRoad”,112002112,“ZhangFun”,M,19,99,“130ShangHaiRoad”,11200313,“WangMin”,F,20,78.5,“1010ZhongShanRoad”;也可以先定义结构类型,再定义数组时初始化,如:structstudentintnum;structstudentstu=,;,11.5.3结构体数组应用举例例对侯选人得票的统计程序。统计三个候选人的得票情况structpersoncharname20;intcount;leader3=“li”,0,“zhang”,0,“fun”,0;main()inti,j;charleader_name20;for(i=1;i=10;i+)scanf(“%s”,leader_name);for(j=0;jname,p-sex,p-age);,11.6.3用结构体变量和指向结构体的指针作函数参数将一个结构体变量的值传递给另一函数方法有3种:(1)、结构体变量的成员作实参传递给函数,是单向的值传递,注意形、实的类型要一致。(2)结构体变量作实参,将结构体变量所占的内存单元的内容全部顺序传递给形参,要求形参与实参同类型。函数调用是单值传递,且形参占用内存单元,若形参的值被改变,不会返回主调函数。(3)指向结构体变量的指针作实参,传递的是结构体变量的地址。,结构体变量stu有学号、姓名和三门课成绩,在main函数中赋值,在print函数中打印输出(用结构体变量作参数)。#defineFORMAT“%ldn%sn%fn%fn%fn”structstudentlongnum;charname20;floatscore3;main()voidprint(structstudent);structstudentstu;stu.num=112001;strcpy(,“LiLi”);stu.score0=67.5;stu.score1=89;stu.score2=78.6;print(stu);voidprint(structstudentstu)printf(FORMAT,stu.num,,stu.score0,stu.score1,stu.score2);printf(“n”);,结构体变量stu有学号,姓名和三门课成绩,用指向结构体变量的指针作实参。#defineFORMAT“%ldn%sn%fn%fn%fn”structstudentlongnum;charname20;floatscore3;stu=112002,”LiLi”,67.5,89,78.6;main()voidprint(structstudent*);print(,11.7用指针处理链表11.7.1链表概述数组:静态分配存储单元,容易造成内存浪费。链表:是重要的数据结构,它根据需要,动态分配内存单元。特征:头指针变量,存放链表首地址,链表中每个元素称结点,其内容:1、数据部分:可有若干项(整、实、字符、结构体类型等)2、指针变量:下一结点的地址,最后一个结点的地址部分为NULL。,链表各结点的特点:1.在内存中可以不连续,访问某结点应找上一结点提供的地址,每一结点有一指针变量存放下一结点的地址。2.链表的每个结点实际上是一个结构体变量,它有若干成员组成,包括的内容有两部分:(1)数据部分:整、实、字符、结构体等类型。(2)指针变量:通常具有指向自身结构体类型的指针变量,此指针变量用来存放下一结点的地址,以便一环扣一环而形成链表。如:,structstudentintnum;floatscore;structstudent*next;;其中:next是成员名,又是指针类型,它指向structstudent数据类型,,11.7.2简单链表例test11_2:建立简单链表,它由3个学生数据的结点组成。输出各结点中的数据。#defineNULL0structstudentlongnum;floatscore;structstudent*next;main()structstudenta,b,c,*head,*p;a.num=112001;a.score=89.5;b.num=112002;b.score=90;c.num=112003;c.score=85;head=,a,b,c,每个结点都属于structstudent类型,它的next成员存放下一个结点的地址,这样一环扣一环,将各结节紧密的扣在一起,最后一次循环,将p=p-next是将c结点的地址赋给p,这时p指向c结点,然后将c结点的num,score输出,之后将p=p-next实际上是将c结点的next内容,即NULL赋给p再进行判断,P!=NULL条件不成立,循环结束。本例所有结点是在程序中定义的,不是临时开辟的,用完也不能释放,这种链表称“静态链表”。,11.7.3处理动态链表所需的函数为处理动态链表,C提供了开辟和释放存储单元的函数:1、malloc函数函数原型:void*malloc(unsignedintsize);在动态区分配长度为size的连续空间,函数返回值是一个指向分配域起始地址的指针,如内存空间不足,返回空指针NULL。(此处:void为无确定类型)2、calloc函数函数原型:void*calloc(unsignedn,unsignedsize);在内存动态区分配n个长度为size的连续空间,函数返回指向分配域起始地址的指针,若分配不成功,返回NULL值。,3、free函数函数原型:voidfree(void*p);功能:释放由p指向的内存区,使这部分内存区能被其它变量使用。P是指向由calloc或malloc分配的存储区域。free函数无返回值。注:旧版本提供的malloc和calloc函数得到的是指向字符型数据的指针。ANSIC提供的malloc和calloc函数规定为void*类型,这并不是说该函数调用后无返回值,而是返回一个结点的地址,该地址的类型为void(无类型或类型不确定),即一段存储区的首址,其具体类型无法确定,只有使用时根据各个域值数据再确定。,10.7.4建立链表建立动态链表:是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。例Test11-3.c建立单向动态链表的函数,每个结点有学号、成绩和指向下一结点的指针。#include“stdio.h”#include“stdlib.h”#defineNULL0#defineLENsizeof(structstudent)structstudentlongnum;floatscore;structstudent*next;intn;,structstudent*creat(void)structstudent*head;structstudent*p1,*p2;chars120;n=0;p1=p2=(structstudent*)malloc(LEN);scanf(“%ld”,head,11.7.5输出链表将链表中各结点数据依次输出的方法是:首先要有链表首地址,即head的值,然后设一指针变量P,先指向第一个结点,输出P所指向的结点,然后使P后移一个结点再输出,直到链表的尾结点。,head,NULL,P,P,例输出链表的函数voidprint(structstudent*head)structstudent*p;printf(“nNow,these%drecordsare:n”,n);p=head;if(head)!=NULL)doprintf(“%ld,%5.2fn”,p-num,p-score);p=p-next;while(p!=NULL);,head,11.7.6对链表的删除操作把该结点从链表中分离,并未真正从内存中删除。例删除动态链表中指定的结点,删除结点的函数structstudent*del(structstudent*head,longnum)structstudent*p1,*p2;if(head=NULL)printf(“nlistnull!n”);gotoend;p1=head;while(num!=p1-num,head,p2,p1,p1-next,11.7.7对链表的插入操作将一个结点插入到按学号顺序排列的链表中算法:,structstudent*insert(structstudent*head,structstudent*stud)structstudent*p0,*p1,*p2;p1=head;p0=stud;if(head=NULL)head=p0;p0-next=NULL;elsewhile(p0-nump1-num),head,p2,p1,p0,10.7.8对链表的综合操作T11-main.c链表操作综合程序#include“stdlib.h”#include“stdio.h”#defineLENsizeof(structstudent)structstudentlongnum;floatscore;structstudent*next;intn=0;#include“T11-8.c”/*建立链表的函数*/#include“T11-9.c”/*输出链表的函数*/#include“T11-10.c”/*删除链表的函数*/#include“T11-11.c”/*插入链表的函数*/,main()structstudent*head,*stu;longdel_num;chars220;printf(“inputrecords:n”);head=creat();print(head);printf(“ninputdeletenumber:”);scanf(“%ld”
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 16159:2025 EN Space systems - Launch pad and integration site - Facility,system and equipment failure analysis
- 铆工转岗考核试卷及答案
- 房产补充协议书
- 电子电路逻辑布线工跨部门项目协调考核试卷及答案
- 铝业管理协议书
- 铆工产品服务标准掌握考核试卷及答案
- 铁氧体材料烧成工工作质量达标率考核试卷及答案
- 2025Copyright转让店面合同范本
- 山东省金乡市2026届数学八年级第一学期期末质量跟踪监视试题含解析
- 2026届四川省绵阳市名校联盟九年级数学第一学期期末调研模拟试题含解析
- 2025版简易劳务合同模板
- 2025年浙江省单独考试招生语文试卷试题真题(含答案详解)
- 消防水池挖槽施工方案
- 高一地理第一次月考卷02【测试范围:必修一第1~2章】(考试版)
- 水电站设备维护检修课件
- 2025年沼液还田协议书
- 施工队进场安全教育培训
- 秩序员休假管理制度
- 2025年中国张裕产区葡萄酒特色与品牌国际化发展报告
- 2024-2025学年下学期高一英语人教版同步经典题精练之语法填空
- 提高市政雨水管道接口施工一次验收合格率
评论
0/150
提交评论