程序设计基础(C语言)(第2版)(微课版) 课件 第9章结构体、共同体和枚举_第1页
程序设计基础(C语言)(第2版)(微课版) 课件 第9章结构体、共同体和枚举_第2页
程序设计基础(C语言)(第2版)(微课版) 课件 第9章结构体、共同体和枚举_第3页
程序设计基础(C语言)(第2版)(微课版) 课件 第9章结构体、共同体和枚举_第4页
程序设计基础(C语言)(第2版)(微课版) 课件 第9章结构体、共同体和枚举_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章结构体、共用体和枚举目录CONTENTS指针与结构体共用体类型与变量9.2结构体类型与变量结构体数组9.19.39.49.5结构体应用枚举类型与变量自定义数据类型9.69.7综合应用9.8结构体类型与变量9.1结构体变量的引用结构体类型与结构体变量的定义结构体变量的初始化结构体类型与变量结构体类型:结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体—自定义数据类型结构体类型与结构体变量的定义01struct[结构体名]{

类型标识符成员名1;类型标识符成员名2;

…………….};成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体结构体类型与结构体变量的定义01结构体类型定义结构体类型定义描述结构的组织形式,不分配内存注:‘;’不能省成员列表的格式为:类型

成员名;structSD{ intnum; charname[20]; charsex[3]; floatscore;};在这个结构体定义中,结构体名为SD,该结构体由4个成员组成:第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符数组;第四个成员为score,实型变量。定义结构体变量3种方法:结构体类型与结构体变量的定义01例如:

structsd{intnum;charname[20];charsex[3];floatscore;};structsdx1,x2;程序说明了两个变量x1和x2为sd结构体类型。struct结构体名{

类型标识符成员名;类型标识符成员名;

…………….};struct结构体名

变量名表列;(1)先定义结构,再说明结构体变量。(2)在定义结构体类型的同时说明结构体变量。结构体类型与结构体变量的定义01例如:structsd{intnum;charname[20];charsex[3];floatscore;}x1,x2;struct结构体名{

类型标识符成员名;类型标识符成员名;

…………….}变量名表列;结构体类型与结构体变量的定义01例如:struct{intnum;charname[20];charsex[3];floatscore;}x1,x2;(3)直接说明结构体变量。struct{

类型标识符成员名;类型标识符成员名;

…………….}变量名表列;用无名结构体直接定义变量只能一次结构体类型与结构体变量的定义01structdate{intmonth;intday;intyear;}struct{intnum;charname[20];charsex[3];structdatebirthday;floatscore;}x1,x2;使用结构体嵌套定义,可以增强结构体类型描述现实世界中各种事物的能力。说明结构体类型与结构体变量概念不同类型:不分配内存;

变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期结构体类型与结构体变量的定义01例

structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu;numnamebirthdaymonthdayyear例

structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];

structdatebirthday;}stu;numnamebirthdaymonthdayyear由结构体变量名引用其成员结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用引用方式:结构体变量名.成员名成员(分量)运算符优先级:1结合性:从左向右例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);(

)stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};(

)例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu2=stu1;()例structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;if(stu1==stu2)……..(

)结构体变量的引用02形式一:struct结构体名{

类型标识符成员名;类型标识符成员名;

…………….};struct结构体名

结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};结构体变量的初始化03形式二:struct结构体名{

类型标识符成员名;类型标识符成员名;

…………….}结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};结构体变量的初始化03形式三:struct{

类型标识符成员名;类型标识符成员名;

…………….}结构体变量={初始数据};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};结构体变量的初始化03结构体变量的初始化03例在定义结构体变量时进行初始化。

#include"stdio.h" structsd { intnum; char*name; charsex; floatscore; }x2,x1={101,"chenzhong",'M',91}; intmain() { x2=x1; printf("Number=%d\nName=%s\n",x2.num,); printf("Sex=%c\nScore=%f\n",x2.sex,x2.score); return0; }结构体数组9.2

结构体数组的初始化结构体数组的定义结构体数组元素引用举例结构体数组结构体数组的定义01结构体数组定义一般形式为:struct结构体类型名数组名[常量表达]例如:structsd{intnum;charname[20];charsex;floatscore;}b[2];结构体数组的初始化02例如:structsd{intnum;char*name;charsex;floatscore;}boy[5]={{100,"HY",'M',75},{101,"ztp",'M',65},{102,"wyong",'F',95},{103,"wangwei",'F',85},{104,"jzhen",'M',45};}结构体数组元素引用举例03#include"stdio.h"structtxl{charname[25];charcall[15];};intmain(){structtxlman[35];inti;for(i=0;i<35;i++){printf("inputname:\n");gets(man[i].name);printf("inputcall:\n");gets(man[i].call);}printf("name\t\tcall\n");for(i=0;i<35;i++)printf("%s\t\t\t%s\n",man[i].name,man[i].call);return0;}

例:建立同学通讯录指针与结构体9.3指向结构体数组的指针指向结构体变量的指针结构体与函数参数指针与结构体指向结构体变量的指针定义形式:struct结构体名*结构体指针名;例structstudent*p;使用结构体指针变量引用成员形式存放结构体变量在内存的起始地址numnamesexagestupstructstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;(*结构体指针名).成员名结构体指针名->成员名结构体变量名.成员名指向运算符优先级:1结合方向:从左向右例intn;int*p=&n;*p=10;

n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;(*p).num=101指向结构体变量的指针01main(){structstudent{longintnum; charname[20]; charsex; floatscore;}stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,"LiLin");p->sex='M';p->score=89.5;printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n", (*p).num,p->name,stu_1.sex,p->score);}指向结构体变量的指针01指向结构体变量的指针01例9.3:结构体变量成员的3种引用方式。#include"stdio.h"structsd{intnum;char*name;charsex;floatscore;}b1={1001,"Wang",'M',99},*p;intmain(){p=&b1;printf("Number=%d\nName=%s\n",b1.num,);printf("Sex=%c\nScore=%f\n\n",b1.sex,b1.score);printf("Number=%d\nName=%s\n",(*p).num,(*p).name);printf("Sex=%c\nScore=%f\n\n",(*p).sex,(*p).score);printf("Number=%d\nName=%s\n",p->num,p->name);printf("Sex=%c\nScore=%f\n\n",p->sex,p->score);return0;}printf("%s\t\t\t%s\n",man[i].name,man[i].call);return0;}

structstudent{intnum;charname[20];charsex;intage;}stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19}, {10104,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<stu+3;p++)printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);}numnamesexagestu[0]pstu[1]stu[2]p+1指向结构体数组的指针02用结构体变量的成员作参数----值传递用指向结构体变量或数组的指针作参数----地址传递用结构体变量作参数----多值传递,效率低结构体与函数参数03将一个结构体变量的值传递给函数作参数,有以下3种方法。#include"stdio.h"structData{inta,b,c;};intmain(){voidf(structData);structDataAA;AA.a=550;AA.b=300;AA.c=AA.a+AA.b;printf("AA.a=%dAA.b=%dAA.c=%d\n",AA.a,AA.b,AA.c);printf("main()…\n");f(AA);printf("AA.a=%dAA.b=%dAA.c=%d\n",AA.a,AA.b,AA.c);return0;}voidf(structDataBB){printf("BB.a=%dBB.b=%dBB.c=%d\n",BB.a,BB.b,BB.c);printf("f()…\n");BB.a=110;BB.b=150;BB.c=BB.a*BB.b;printf("BB.a=%dBB.b=%dBB.c=%d\n",BB.a,BB.b,BB.c);printf("Return…\n");}return0;}

结构体与函数参数03例9.5用结构体变量作函数参数。结构体应用9.4链表顺序表结构体应用顺序表的基本操作顺序表的定义和创建顺序表顺序表的定义和创建01(1)顺序表的定义。例如:定义顺序表list:typedefstruct{intdata[1000];intlast;}LIST;LISTlist;(2)创建顺序表就是输入数据元素,设置表的长度。顺序表的定义和创建01例如:创建顺序表函数:voidcreate(){inti,n;printf("请输入元素个数:");scanf("%d",&n);printf("请输入各元素的值:");for(i=0;i<n;i++)

scanf("%d",&List.data[i]);List.last=n;}

1、顺序表元素的插入顺序表的基本操作02要在i的位置上插入一个新数据d,必须先将元素Di,…,Dn-1的位置向后移,然后在第i个位置上放入d的值。同时,顺序表的长度加1。顺序表的基本操作02

voidinsert(inti,intd)

{intk;if((i<0)‖(i>list.last));printf("错误!");else{for(k=list.last-1;k>=i;k--)

list.last[k+1]=list.last[k];list.last[i]=d;list.last=list.last+1;}}例:顺序表元素插入函数其中:i为插入的位置;d为插入的数据元素。

2、顺序表元素的删除顺序表的基本操作02要在i的位置上删除第i个元素,只要将元素Di+1,…,Dn-1的位置向前移一个位置。同时,顺序表的长度减1。顺序表的基本操作02voiddelete(inti){intk;if((i<0)‖(i>list.last-1));printf("错误!");else{for(k=i+1;k<=list.last-1;k++)

list.last[k-1]=list.last[k];list.last--;}}例:顺序表元素删除函数。其中,i为删除的位置链表概述链表链表的存储分配链表的基本操作链表的建立及输出链表:指有若干个数据项,每个数据项称为一个“节点”,这些节点按一定的原则连接起来。每个数据项都包含若干个数据和一个指向下一个数据项的指针,依靠这些指针将所有的数据项连接起来链表概述01链表示意图链表是一种常见的数据结构。它是实现动态存储分配的一种结构。例如,无须预先确定学生的准确人数,有一个学生就分配一个节点,如果某位学生退学了,就删去该节点,释放该节点所占用的存储空间。从而节约了宝贵的内存资源。链表概述01链表概述01链表节点示意图structstudent{

intnum;intscore;structstudent*next;}例:链表概述01前两个成员项num和score组成数据域,后一个成员项next构成指针域,它是一个指向student类型结构的指针变量。C语言提供了管理内存的函数,这些内存管理函数可以按需要动态地分配内存空间,可以将不再使用的内存空间回收待用,为有效地利用内存资源提供了手段。链表的存储分配021.分配内存空间函数malloc()调用形式:(类型说明符*)malloc(size)功能:在内存的动态存储区中分配一块长度为“size”字节的连续区域。函数的返回值为该区域的首地址;“(类型说明符*)”用于强制类型转换。如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)。链表的存储分配022.分配内存空间函数calloc()调用形式:

(类型说明符*)calloc(n,size)功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。(类型说明符*)用于强制类型转换。calloc()函数与malloc()函数的区别仅在于其一次可以分配n块区域。如果此函数未能成功地执行。则返回空指针(NULL)。链表的存储分配023.释放内存空间函数free()调用形式:free(void*ptr);功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc()或calloc()函数所分配的区域。链表的存储分配021.链表的建立所谓建立链表是指在程序执行过程中从无到有地建立起一个链表,即一个个地开辟节点和输入各节点数据,并建立起前后相连的关系。通常用两种方法建立链表。①从链头到链尾:新节点插入链尾。②从链尾到链头:新节点插入链头。链表的建立及输出03从头到尾建立链表从尾到头建立链表链表的建立及输出03例9.6建立一个N个节点的链表,存放学号和成绩数据。编写一个建立链表的函数creat()。#defineNULL0structstudent{intnum;

floatascore;structstudent*next;};structstudent*creat(intn){structstudent*head,*pf,*pb;inti;for(i=0;i<n;i++){pb=(structstudent*)malloc(sizeof(structstudent));printf("inputNumberandScore\n");scanf("%d%d",&pb->num,&pb->score);if(i==0)pf=head=pb;elsepf->next=pb;pb->next=NULL;pf=pb;}return(head);}

1.链表的输出将链表中各节点的数据依次输出的操作很简单,首先要知道表头元素的地址,可由head得到,然后顺着链表输出各节点中的数据,直到最后一个节点。链表的建立及输出03链表的输出链表的建立及输出03voidprint(structstudent*head){printf("Nnm\tScore\n");while(head!=NULL){printf("%d\t\t%d\n",head->num,head->score);head=head->next;}}输出链表的函数链表的建立及输出031.链表的插入链表的基本操作04例:编写一个在学生数据链表中按学号顺序插入一个节点的函数。假设被插节点的指针为pi。structstudent*insert(structstudent*head,structstudent*pi){structstudent*pf,*pb;pb=head;if(head==NULL)/*空表插入*/{head=pi;pi->next=NULL;}else{while((pi->num>pb->num)&&(pb->next!=NULL)){pf=pb;pb=pb->next;}/*找插入位置*/if(pi->num<=pb->num){if(head==pb)head=pi;/*在第一节点之前插入*/elsepf->next=pi;/*在其他位置插入*/pi->next=pb;}else{pb->next=pi;pi->next=NULL;}/*在表末插入*/}returnhead;}链表的基本操作042.链表的删除链表的基本操作04例:编写一个删除链表中指定节点的函数。structstudent*delete(structstudent*head,intnum){structstudent*pf,*pb;if(head==NULL)/*如为空表,输出提示信息*/{printf("\nemptylist!\n");return0;}pb=head;while(pb->num!=num&&pb->next!=NULL)

{pf=pb;pb=pb->next;}/*pf指向当前节点,pb指向下一节点*/if(pb->num==num){if(pb==head)head=pb->next;else

pf->next=pb->next;free(pb);printf("Thenodeisdeleted\n");}elseprintf("Thenodenotbeenfound!\n");returnhead;}链表的基本操作043.链表的应用链表的基本操作04intmain() { structstudent*head,*pnum; intn,num; printf("inputnumberofnode:"); scanf("%d",&n); head=creat(n); print(head); printf("Inputthedeletednumber:"); scanf("%d",&num); head=delete(head,num); print(head); printf("Inputtheinsertednumberandscore:"); pnum=(structstudent*)malloc(sizeof(structstudent)); scanf("%d%d",&pnum->num,&pnum->score); head=insert(head,pnum); print(head); return0;} 共用体类型与变量9.5共用体变量的引用方式与特点共用体与共用体变量的定义共用体类型与变量共用体及共用体变量的定义01定义一个共用体类型的一般形式为:union共用体名{成员表};例如:uniondt { inti; charch; floatf; };与定义结构体类型变量一样,定义共用体类型变量也有3种方式。(1)定义共用体类型后,再定义共用体类型变量。例如:uniondta;(2)定义共用体类型的同时,定义共用体类型变量。例如:uniondt { inti; charch; floatf; }a;(3)如果定义的共用体类型只使用一次,共用体类型名可以省略。例如:union { inti; charch; floatf; }a;共用体及共用体变量的定义01共用体变量的引用方式和特点02引用共用体类型变量的一般形式如下:共用体变量名.成员名例如:a.i=5;由于共用体类型数据是用同一个内存段来存放几种不同数据类型的成员。但它在每一时刻只能存放其中一个成员而不是同时存放。也就是说每一瞬间只有一个成员起作用,其他的成员无效。而起作用的成员是最后存放的那个成员。共用体变量的引用方式和特点02voidmain(){unionexx{inta,b;struct{intc,d;}lpp;}e={10};e.b=e.a+20;e.lpp.c=e.a+e.b;e.lpp.d=e.a*e.b;printf(″%d,%d\n″,e.lpp.c,e.lpp.d);}程序运行结果如下:60,3600枚举类型与变量9.6定义枚举类型的一般形式是:enum枚举类型名{枚举值表}例如:enumweekday{sun,mon,tue,wed,thu,fri,sat}枚举类型与变量与其他数据类型一样,定义枚举类型后,能够以下面3种方式定义枚举变量。(1)定义枚举类型后,再定义枚举类型变量。例如:enumweekdayw1,w2,w3;(2)定义枚举类型的同时,定义枚举类型变量。例如:enumweekday{sun,mon,tue,wed,thu,fri,sat}w1,w2,w3;(3)如果定义的枚举类型只使用一次,枚举类型名可以省略。例如:enum{sun,mon,tue,wed,thu,fri,sat}w1,w2,w3;枚举类型与变量#include"stdio.h"intmain(){enumweekday{sun,mon,tue=7,wed,thu,fri,sat}a,b,c;a=sun;b=mon;c=tue;printf("%d,%d,%d",a,b,c);return0;}枚举应用枚举类型与变量程序运行结果:0,1,8自定义数据类型9.7自定义数据类型自定义数据类型的一般形式为:typedef类型名新名称;例如:typedefstructstudent{charname[25];intage;charsex;}STU;综合应用9.8#include"stdio.h" structsd { intnum; char*name; charsex; fl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论