第十一章 结构体与共用体链表_第1页
第十一章 结构体与共用体链表_第2页
第十一章 结构体与共用体链表_第3页
第十一章 结构体与共用体链表_第4页
第十一章 结构体与共用体链表_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第十一章结构体与共用体链表第一页,共三十八页,编辑于2023年,星期五例题1:某学生,姓名是Li,学号是9800,化学成绩是85。请编写程序输出这些数据。见程序:

main(){charname[4]="Li";intnum=9800;intscore=85;printf("%s,%d,%c,%f",name,num,sex,score);}如果有100个学生,则更麻烦.TC允许我们定义自己的数据类型,以解决特定的实际问题。为了很好地解决例题1,我们可以定义一种叫structstudent的数据类型。第二页,共三十八页,编辑于2023年,星期五结构体类型也是属于一种构造类型数据,它将不同类型的数据项组织成一个组合项,这些组合项中的数据项是互相联系的。定义一个结构体类型的一般形式:

struct结构体名{成员表列};例如:对于一名学生,有如下不同类型的属性:学号、姓名、年龄、性别、成绩、地址等。要表示一个学生的六个方面不同类型的有关数据,就可以定义一个结构体类型。§11.1结构体类型概述第三页,共三十八页,编辑于2023年,星期五

structstudent{intnum;charname[10];charsex;intage;floatscore;charaddr[30];};其中:struct是关键字,表示结构体类型。student是结构体类型名,

structstudent和标准类型名(int、float)一样可以用作定义变量的类型。花括号内是结构体中的各个成员,每个成员都应进行类型说明。§11.1结构体类型概述结构体名相当float,int分号不能少成员表列第四页,共三十八页,编辑于2023年,星期五一、先定义结构体类型,再定义变量名例如:structstudent{intnum;charname[10];charsex;intage;floatscore;charaddr[30];};

structstudentstudent1,student2;上面的student1和student2是structstudent类型的变量,它们具有structstudent类型的结构。定义结构体变量后,系统为变量分配内存单元。可用sizeof(student1)来计student1和student2各占49个字节。§11.2定义结构体类型变量的方法第五页,共三十八页,编辑于2023年,星期五二、在定义结构体类型的同时定义变量例如:structstudent{intnum;charname[10];charsex;intage;floatscore;charaddr[30];}student1,student2;§11.2定义结构体类型变量的方法第六页,共三十八页,编辑于2023年,星期五三、直接定义结构体类型变量(不写类型名)

例如:struct{intnum;charname[10];charsex;intage;floatscore;charaddr[30];}student1,student2;§11.2定义结构体类型变量的方法第七页,共三十八页,编辑于2023年,星期五说明:1.定义类型与定义变量是不同的,在编译时对类型不分配空间,只对变量分配存储空间。2.只能对变量赋值、存取或运算,而对结构体类型不可以。3.对结构体中的成员可以单独使用,它的作用和地位相当于普通变量。4.可以用sizeof运算符测一个类型数据的长度。n=sizeof(structstudent)或n=sizeof(student1)n=sizeof(int)n=sizeof(float)

§11.2定义结构体类型变量的方法第八页,共三十八页,编辑于2023年,星期五5.成员也可以是结构体变量。structstudent{intnum;charname[20];charsex;intage;

structdatebirthday;charaddr[30];}student1,student2;

structdate{intmonth;intday;intyear;};numnamesexagebirthdayaddrmonthdayyear第九页,共三十八页,编辑于2023年,星期五一个结构体类型的变量不能作为一个整体进行输入和输出,只能对结构体变量中的各个成员进行输入、输出和运算。scanf(“%d,%s,%c,%d,%f,%s”,&student1);printf(“%d,%s,%c,%d,%f,%s”,student1);§11.3结构体类型变量的引用引用方式:结构体变量名.成员名例如:scanf(“%d”,&student1.num);student2.num=student1.num;printf(“%d,%d”,student1.num,student2.num);“.”是成员运算符,表示在student1结构体变量中找出成员num的值。其优先级最高,结合性为自左向右。如student1.num+100;第十页,共三十八页,编辑于2023年,星期五若结构体类型嵌套一个结构体类型,则采用逐级访问的方法,只能对最低级的成员进行访问。student1.birthday.year访问结构体变量student1的成员出生年份。而不能用student1.birthday访问birthday。结构体变量的成员可以和普通变量一样进行各种运算student2.score=student1.score;student1.age++;++student1.age;第十一页,共三十八页,编辑于2023年,星期五例如:

structstudent{longintnum;charname[20];

charsex;charaddr[20];}a={89031,"LiLin",'M',"123BeijingRoad"};Printf(“%ld,%s,%c,%s\n”,a.num,,a.sex,a.addr);§11.4结构体类型变量的初始化第十二页,共三十八页,编辑于2023年,星期五结构体数组中的每个元素都是一个结构体类型的数据,它们都分别包括各个成员项。例如:要表示3名学生的学号、姓名和成绩。

structstudent{intnum;charname[20];floatscore;};

structstudentstu[3]={{1000,“liming”,70},{1001,“wangfan”,80},{1002,“zhangyan”,65.5}};§11.5结构体数组第十三页,共三十八页,编辑于2023年,星期五程序举例:有四个学生,每个学生包括学号、姓名、成绩,要求找出成绩最高者的姓名和成绩。S11_ex1.cmain(){structstudent{intnum;charname[20];intscore;};structstudentstu[4];inti,k=0,max;printf("请按行输入学生的记录:\n");

§11.5结构体数组第十四页,共三十八页,编辑于2023年,星期五for(i=0;i<4;i++)scanf("%d%s%d”,&stu[i].num,stu[i].name,&stu[i].score);for(max=stu[0].score,i=1;i<4;i++)if(stu[i].score>max){max=stu[i].score;k=i;}printf("\n最高成绩为:\n");printf(”No.:%d\nname:%s\nscore:%d\n”,stu[k].num,stu[k].name,stu[k].score);}§11.5结构体数组第十五页,共三十八页,编辑于2023年,星期五11.6.1指向结构体变量的指针一个结构体变量的指针就是该变量所占据的内存空间的起始地址,可以设一个指针变量指向一个结构体变量。例如:structstudent{intnum;charname[20];intscore;}stu;structstudent*p=&stu;§11.6指向结构体类型数据的指针第十六页,共三十八页,编辑于2023年,星期五

如果要表示stu变量中的num成员项可写成下面三种形式:

1.stu.num2.(*p).num3.p->num§11.6指向结构体类型数据的指针第十七页,共三十八页,编辑于2023年,星期五

10.6.2指向结构体数组的指针对结构体数组也可以用指针变量来指向。例如:已知三名学生的有关数据,现全部输出。s11_4.cstructstudent{intnum;charname[10];charsex;intage;}stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19}, {10104,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<=stu+2;p++)printf("%5d%-10s%2c%4d\n",p->num,p->name,p->sex,p->age);}

第十八页,共三十八页,编辑于2023年,星期五§10.3共用体unionstudent{intnum;floatscore;};unionstudentb;b.num=1;b.score=2;

sizeof(b)为4structstudent{intnum;floatscore;};structstudenta;a.num=1;a.score=2;sizeof(a)为6abnumscorenumscore┅┅┅┅第十九页,共三十八页,编辑于2023年,星期五11.8.1共用体类型的定义和变量的定义方式使几个不同的变量共占同一段内存单元的结构,称为“共用体”类型的结构。它也是一种构造类型的数据。共用体类型的定义形式:

union共用体名

{成员表列;};例如:uniondata{inti;charch;floatf;};uniondataa,b,c;§11.8共用体定义形式也可以:uniondata{inti;charch;floatf;}a,b,c;第二十页,共三十八页,编辑于2023年,星期五11.8.2共用体变量的引用方式不能直接引用共用体变量本身scanf(“%d”,&a);printf(“%d”,a);而应引用共用体变量的成员。例如:a.ia.cha.f

11.8.3共用体类型数据的特点1.

共用体与结构体的不同:结构体变量所占内存长度为各成员所占内存长度之和;而共用体变量所占内存长度为最长的成员的长度,所有的成员共用同一段内存,同一时刻只有一个成员起作用。§11.8共用体第二十一页,共三十八页,编辑于2023年,星期五2.共用体变量的地址和它的各成员项的地址是同一地址。如:&a、&a.i、&a.ch、&a.f都是同一地址值。3.共用体变量不能赋初值。4.共用体和结构体可以互相成为其中的成员;5.共用体变量起作用的成员是最后一次存放值的成员。例如:a.i=10;a.ch=‘a’;printf(“%d”,a.i);a.f=1.5;printf(“%f”,a.f);则当前共用体变量中,只有a.f是有效的。§11.8共用体第二十二页,共三十八页,编辑于2023年,星期五#include<stdio.h>unionun{inti;charc[2];}main(){unionunx;x.c[0]=10;x.c[1]=1;printf("\n%d",x.i);}266第二十三页,共三十八页,编辑于2023年,星期五思考题1:求下面程序的输出结果。

main(){uniontime {longi;intk[5];charc;};structdate{intcat;uniontimecow;doubledog;}dt;uniontimemax;

printf("%d\n",sizeof(dt)+sizeof(max));}说明:sizeof()是求类型长度的运算符,即在内存中所占的字节数。20+10=30第二十四页,共三十八页,编辑于2023年,星期五思考题2:求下面程序的输出结果。structks{inta;int*b;}s[4],*p;main(){intn=1,i;printf("\n");for(i=0;i<4;i++){s[i].a=n;s[i].b=&s[i].a;n=n+2;}p=&s[0];p++;printf("%d,%d\n",(++p)->a,(p++)->a);}s[0].a=1s[1].a=3s[2].a=5s[3].a=77,3右结合第二十五页,共三十八页,编辑于2023年,星期五先观察链表示意图,后理解链表概念。某3位同学的物理成绩分别为96,89,93。分别用数组和链表存储这些数据的示意图如下:613609605601938996p指针89空93指针963个节点的链表:3个元素的数组:floata[3];a11.9简单链表第二十六页,共三十八页,编辑于2023年,星期五§11.9.1链表的概念链表是一种动态数据结构,可以用来表示顺序访问的线性群体。链表是由系列结点组成的,结点可以在运行时动态生成。每一个结点包括数据域和指向链表中下一个结点的指针(即下一个结点的地址)。如果链表每个结点中只有一个指向后继结点的指针,则该链表称为单链表。链表不要求逻辑上相邻的元素在物理位置上也相邻,在内存允许的范围内,占用空间大小不受限制,摒弃了数组的弱点。第二十七页,共三十八页,编辑于2023年,星期五§11.9.2数组与链表的比较数组:仅能实现静态存储。链表:可以实现动态存储。链表的使用步骤:建立链表(使用malloc函数)访问链表(使用*p表达式)释放链表(使用free函数)p指针89空93指针96第二十八页,共三十八页,编辑于2023年,星期五1.链表结构(1)头指针变量head──指向链表的首结点。(2)每个结点由2个域组成:1)数据域──存储结点本身的信息。2)指针域──指向后继结点的指针。(3)尾结点的指针域置为“NULL(空)”,作为链表结束的标志QianSunLiZhouWuWangHead^第二十九页,共三十八页,编辑于2023年,星期五链表结构的定义structstudent{charname[10];structstudent*next;};next为structstudent类型指针变量,指向下一个结点。结点的变量或指针变量的定义:

structstudentnode,*head;node可以存放一个学生结点指针head可以存放学生结点的地址。第三十页,共三十八页,编辑于2023年,星期五相关库函数1.void*malloc(unsignedintsize);

用途:在内存的动态存储区中分配一个size长度的连续存储空间。返回值:返回一个指向分配域地址的指针(类型为void);若未成功,则返回空指针(NULL)例如:int*p;p=(int*)malloc(8);p指示系统分配的4个整型存储单元的起始地址也可看成包含4个数组元素的p数组:p[0],p[1],p[2],p[3]第三十一页,共三十八页,编辑于2023年,星期五2.voidfree(void*p);用途:释放由指针变量p所指示的内存区域。 例如:free(p);通过函数free将已分配的内存区域交还系统,使系统可以重新对其进行分配。第三十二页,共三十八页,编辑于2023年,星期五§11.9.3建立链表尾插法建立单链表特点:头指针固定不变,新产生的结点总是链接到链表的尾部。操作步骤:(1)设head为链表头,last为链表尾结点,

head=last=NULL;(2)生成新结点,由p指针指示,并将新结点的地址域清空: p->next=NULL;(3)如果head为NULL,则head=p;

否则last->next=p; (4)last=p;(5)重复(2)~(4),继续建立新结点。第三十三页,共三十八页,编辑于2023年,星期五#include"stdio.h"structs{inta;structs*q;};#defineLENsizeof(structs)main(){structs*head,*p1,*p2;intm,i,n;for(i=1;i<=3;i++){p2=(structs*)malloc(LEN);scanf("%d",&m);p2->a=m;if(i==1)head=p1=p2;else{p1->q=p2;p1=p2;}if(i==3)p2->q=NULL;}for(p1=head;p1!=NULL;){printf("\n%d",p1->a);p1=p1->q;}while(head){p1=head->q;head->q=NULL;free(head);head=p1;}}例三位同学的化学成绩分别是90,89,96。请分别用数组和链表存储这些数据。main(){inta[3],i;for(i=0;i<3;i++)scanf("%d",&a[i]);for(i=0;i<3;i++)

温馨提示

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

评论

0/150

提交评论