C语言第11章结构体_第1页
C语言第11章结构体_第2页
C语言第11章结构体_第3页
C语言第11章结构体_第4页
C语言第11章结构体_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

第十一章结构体与共用体概述定义结构体类型变量的方法结构体变量的引用结构体变量的初始化结构体数组指向结构体类型数据的指针用指针处理链表共用体用typedef定义类型本章内容1.概述有时,需将不同类型的数据组合成一个有机的整体,以便于引用。这些数据是相互联系的。如一个学生的有关信息:C语言提供了结构体数据结构描述上述信息。1.概述定义一个结构体类型的一般形式为:struct结构体名

{

成员表列

;

};例如:

structstudent{ intnum; charname[20]; charsex; intage; charaddr[30];};2.

定义结构体类型变量的方法

先定义结构体类型再定义变量名

structstudent { intnum; charname[20]; charsex; intage; charaddr[30];};

structstudentstudent1,student2;2.

定义结构体类型变量的方法

定义结构体类型时同时定义变量

structstudent { intnum; charname[20]; charsex; intage; charaddr[30];}student1,student2;2.

定义结构体类型变量的方法

直接定义结构类型变量。

struct { intnum; charname[20]; charsex; intage; charaddr[30];}student1,student2;2.

定义结构体类型变量的方法

几点说明:类型与变量是不同概念,不要混淆;结构体中的成员,可以单独使用,其作用与地位相当于普通变量;成员也可以是一个结构体变量;成员名可以与程序中的变量名相同,二者不代表同一对象。3.结构体变量的引用引用形式为:结构体变量名.成员名

student1.num=10010; student2.score=87.6; printf(“score=%f”,student2.score);注意:不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出。对成员变量可以象普通变量一样进行各种运算,如:sumage=student1.age+student2.age;可以引用成员的地址,也可以引用结构体变量的地址。若成员本身又属一个结构体类型,只能对最低级的成员进行赋值或存取以及运算。4.结构体变量的初始化【例1】结构体的使用main(){structstudent{longintnum; charname[20];charsex;charaddr[20];}a={9801,”Wanghong”,’F’,”2LinggongRoad”};printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,,a.sex,a.addr);}程序的运行结果是:No.:9801name:Wanghongsex:Faddress:2LinggongRoad5.结构体数组定义结构体数组structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu[3];structstudent{intnum;…}stu[3];struct{intnum;…}stu[3];5.结构体数组结构体数组的初始化structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu[3]={{111,”Li”,’M’,18,”Dalian”},{…},{…}};

也可采用:structstudent{intnum;…};structstudentstu[]={{…},{…},{…}};5.结构体数组应用举例【例2】统计后选人选票的统计程序。设有三个候选人,每次输入1个得票候选人的名字,要求最后输入各人得票的结果。structperson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};main(){inti,j;charleader_name[20];for(i=1;i<=10;i++){scanf("%s",leader_name);for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}6.指向结构体类型数据的指针指向结构体变量的指针定义形式:struct结构体名*结构体指针名;例structstudent*p;使用结构体指针变量引用成员形式(*结构体指针名).成员名结构体指针名->成员名结构体变量名.成员名6.指向结构体类型数据的指针例:structstudentstu1;structstudent*pstu=&stu1;stu1.score=98;(*pstu).score=98;pstu->score=98;

注意:*pstu两边的括弧不可省,因为成员运算符“.”优先于“*”运算符。

6.指向结构体类型数据的指针【例3】结构体指针在程序中的使用structstudent{intnum;charname[20];}stu[3]={{100,”zhangsan”},{101,“LiSi”},{102,”WangWu”}};main(){structstudent*pstu;printf(“\nN\n”);for(pstu=stu;pstu<stu+3;pstu++)printf(“%d%10s\n”,pstunum,pstuname);}7.用指针处理链表链表概述链表是一种常见的重要的数据结构,它是动态地进行存储单元分配的一种结构。头指针变量head──指向链表的首结点。每个结点由2个域组成:数据域──存储结点本身的信息。指针域──指向后继结点的指针。尾结点的指针域置为“NULL(空)”,作为链表结束的标志100ABCDNULLHead100108881027.用指针处理链表链表操作建立动态链表(主要针对单向链表)主要步骤:读取数据。生成新节点。将数据存入节点的成员变量中。将新节点插入到链表中,重复上述操作直至输入结束7.用指针处理链表链表操作顺序访问链表中各节点的数据域,输出节点的值得到链表头结点的地址

head;指针变量p=head;输出p所指结点的成员值;p后移一个结点,p=p->next;重复(3)(4),直到链表为空。7.用指针处理链表链表操作插入(b)插入到第2个结点之后Headp101Zhang90103Wang80NULL105Li70(a)head指示已有链表,q指示待插入结点

q104Zhao70Headr101Zhang90q104Zhao60103Wang80pNULL105Li707.用指针处理链表链表操作删除节点删除结点操作:若用2个指针操作p.next=p1.next若用1个指针操作p.next=p.next.next&stu2780001&stu3670002NULL800003&stu1headstu1stu2stu3pp18.共用体(联合体)共用体类型变量的定义形式为:

union

共用体名

{

成员表列;

}变量表列;共用体:使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。例如:uniondata { inti; charch; floatf; }a,b,c;例uniondata{inti;charch;floatf;};fchi8.共用体共用体类型变量与结构体类型变量的区别结构体类型变量所占内存长度是各成员占内存长度之和。共用体类型变量所占内存长度等于最长的成员的长度。

structnode{charch[2];intk;}a;unionnode{charch[2];intk;}b;achkbchk变量的各成员同时存在任一时刻只有一个成员存在8.

共用体

共用体变量的引用方式:共用体变量.成员变量例如:a.i=10;(引用共用体变量中的整型变量i) a.ch=‘A’;(引用共用体变量中的字符变量ch) a.f=99.99;(引用共用体变量中的实型变量f)

注意:不能对共同体变量初始化。

union{inti;charch;}x={6,‘A’}//错误8.

共用体【例4】共用体变量的引用main(){unionun{inta;charc[2];}w;w.a=383;printf(“w.c[1]=%d,w.c[0]=%d\n”,w.c[1],w.c[0]);w.c[0]=‘A’;w.c[1]=‘a’;printf(“%x\n”,w.a);}程序的运行结果是:w.c[1]=1,w.c[0]=12761418.共用体a.i=‘A’;//a为结构体printf(“%d”,a.i);printf(“%c”,a.i);a.j=66;//a为共用体printf(“%d,%c”,a.j,a.j);printf(“%d,%c”,a.i,a.i);65A66,B66,Bstruct(union){ inti;intj; }a;8.

共用体

共用体类型数据的特点:每一瞬时只有一个成员起作用;共用体变量中起作用的成员是最后一次存放的成员;共用体变量的地址和它的各成员的地址都是同一地址;不能对共用体变量名赋值,也不能企图引用变量名来得到成员的值,又不能在定义共用体变量时对它初始化;不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可使用指向共用体变量的指针;共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。9.

用typedef定义类型

C语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。类型定义符typedef即可用来完成此功能。typedef定义的一般形式为:

typedef原类型名新类型名如:typedefintINTEGER;INTEGERa,b;//等效于:inta,b;又如:typedefcharNAME[20];NAMEa1,a2,s1,s2;//等效于:chara1[20],a2[20],s1[20],s2[20];小测验【例1】变量a所占内存字节数是

unionU{charst[4];inti;longl;};structA{intc;unionUu;}a;

A)

4

B)5 C)6

D)

8√小测验【例2】下列程序的输出结果是

structabc{inta,b,c;};main(){

温馨提示

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

评论

0/150

提交评论