第8章结构体和其他结构类型PPT演示课件_第1页
第8章结构体和其他结构类型PPT演示课件_第2页
第8章结构体和其他结构类型PPT演示课件_第3页
第8章结构体和其他结构类型PPT演示课件_第4页
第8章结构体和其他结构类型PPT演示课件_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

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

文档简介

第8章结构体和其它构造类型,81结构体类型变量的定义和使用82结构体和函数调用83提高部分,1,8.1结构体类型变量的定义和使用,8.1.1结构体类型的概念和声明8.1.2结构体类型变量的定义和使用,2,8.1.1结构体类型的概念和声明,1.结构体类型的概念把不同类型的数据组合在一个类型之中,作为一个整体进行处理结构体类型,3,要表示日期structdateintyear,month,day;,要表示学生情况structstudentcharname20,number9;floats1,s2,s3;,结构体类型,4,2.结构体类型的声明结构体类型声明:struct结构体名类型名1成员名表1;类型名2成员名表2;类型名n成员名表n;,关键字,也称“域”,;,5,8.1.2结构体类型变量的定义和使用,【例81】假设学生基本情况包括学号和两门课成绩,编写程序计算某学生两门课的平均成绩,并输出该学生的有关信息,6,编程点拨,声明结构体类型structex1longintnum;floats1;floats2;,等价于floats1,s2;,7,在主函数中定义“structex1”类型变量wang和“float”类型变量ave,main(),floatave;structex1wang;,就象float、int型一样使用,8,计算平均成绩并通过变量wang输出有关信息,main(),floatave;structex1wang;,wang.num=1000101;,wang.s1=89.5;,wang.s2=90;,ave=(wang.s1+wang.s2)/2;,printf(%10ld%8.1f%8.1f%8.1fn,wang.num,wang.s1,wang.s2,ave);,9,?ave占四个字节,wang占多少字节,main(),floatave;structex1wang;,wang.num=1000101;,wang.s1=89.5;,wang.s2=90;,ave=(wang.s1+wang.s2)/2;,printf(%10ld%8.1f%8.1f%8.1fn,wang.num,wang.s1,wang.s2,ave);,wang,num,s1,s2,4字节,4字节,4字节,1000101,89.5,90.0,12字节,10,main(),floatave;structex1wang;,wang.num=1000101;,wang.s1=89.5;,wang.s2=90;,ave=(wang.s1+wang.s2)/2;,printf(%10ld%8.1f%8.1f%8.1fn,wang.num,wang.s1,wang.s2,ave);,wang,num,s1,s2,1000101,89.5,90.0,等价于,structex1wang=1000101,89.5,90.0;,11,main(),floatave;structex1wang;,wang.num=1000101;,wang.s1=89.5;,wang.s2=90;,ave=(wang.s1+wang.s2)/2;,printf(%10ld%8.1f%8.1f%8.1fn,wang.num,wang.s1,wang.s2,ave);,%ld%f%f,12,【例82】假设学生基本情况包括学号和多门课成绩,计算某学生的平均成绩,13,#defineN3structex2longintnum;floatsN;,要处理的成绩较多时,14,main()structex2wang,*p;floatave,sum=0,x;inti;p=,等价于wang.num,15,printf(学号:%ldn,p-num);for(i=0;isi;printf(%8.1f,p-si);printf(n);ave=sum/N;printf(平均成绩:%.1f,ave);,等价于(*p).num,16,wang,num,s0,s1,s2,p,(*p),结构体变量名.成员名(*指针变量名).成员名指针变量名-成员名,17,【例83】设有5名学生,而且每位学生基本情况都包括学号和多门课成绩,计算各学生3门课平均成绩,18,#defineN3structex2longintnum;floatsN;,19,main()structex2stu5;floatave,sum,k;inti,j;for(i=0;i5;i+)scanf(%ld,20,for(i=0;i5;i+)printf(%10ld,stui.num);sum=0;for(j=0;jN;j+)printf(%8.1f,stui.sj);sum=sum+stui.sj;ave=sum/N;printf(%8.1fn,ave);,注此行的位置,21,stu0,stu1,stu2,stu3,stu4,num,s0,s1,s2,各学生平均分:86.2、67.7、64.2、81.0、91.5,22,【例84】假设学生基本情况包括学号和五门课成绩,找出某学生五门课成绩中的最高成绩,23,structex3charn10;floats5;,将学号定义为字符串,24,main()structex3wang=1000101,89.5,90.0,79.0,99.0,69.0;floatmax;inti;max=0;for(i=0;i5;i+)if(maxwang.si)max=wang.si;printf(“%s号学生,%5.1f,wang.n,max);,scanf(“%s”,wang.n);功能?,gets(wang.n);功能?,strcpy(wang.n,1000101);功能?,puts(wang.n);功能?,25,【例85】假设学生基本情况包括学号和英语、C程序设计、数学三门课成绩,输出五个学生中,数学成绩最高的学生所有信息。,26,structex4charn10;floats3;,27,main()structex4stu5=1000101,89.5,90.0,79.0,1000102,68.0,80.0,55.0,1000103,56.5,59.0,77.0,1000104,81.0,88.0,74.0,1000105,90.5,95.0,89.0;inti,k=0;,28,for(i=1;i5;i+)if(stuk.s2stui.s2)k=i;printf(“%s号学生n,stuk.n);for(i=0;i3;i+)printf(%5.1f,stuk.si);,1000105号学生90.595.089.0,29,82结构体和函数调用,结构体类型变量的成员作实参,【例86】结构体类型变量的成员作实参示例,structex2longintnum;floats3;,30,long型,实型数组名,voidmyfun1(longintnum,float*p),wang,num,s,p,num,*p,*(p+1),*(p+2),1000101,31,printf(学号:%ld,成绩:,num);,for(i=0;is2=95.5;,main(),structex2wang=1000101,89.5,90.0,79.0;,inti;,myfun3(,printf(学号:%ld,成绩:,wang.num);,for(i=0;i3;i+),printf(%5.1f,wang.si);,printf(n);,myfun3(,voidmyfun3(structex2*p),1000105,95.5,37,结构体类型数组名作实参,【例8.9】结构体类型数组名作实参的示例,structex2longintnum;floats3;,38,voidmyfun4(structex2*p)inti;floatk;structex2*q;for(q=p;qnum);for(i=0;isi=k;,39,main()inti,j;structex2stu5;myfun4(stu);for(i=0;inum);,1,2,3,0,p,1,52,a.num=1;,a.next=,b.num=2;,b.next=,c.num=3;,c.next=NULL;,p=,printf(%4d,p-num);,p=p-next;,printf(%4d,p-num);,1,2,3,0,p,1,2,53,a.num=1;,a.next=,b.num=2;,b.next=,c.num=3;,c.next=NULL;,p=,printf(%4d,p-num);,p=p-next;,printf(%4d,p-num);,p=p-next;,printf(%4d,p-num);,1,2,3,0,p,1,2,3,54,832链表,链表的概念,55,非空链表结构,head,头结点,结点1,结点2,尾结点,0,832链表,链表的概念,56,链表特点:所有结点为相同结构体类型至少一个成员为指针,该指针基类型与链表结点的类型相同,需解决问题:(1)建立链表(2)输出链表中各结点的值(3)在链表中插入一个结点(4)删除链表中的一个结点,57,动态开辟和释放函数,malloc、calloc、realloc,动态开辟函数:,释放函数:,free,#include,58,【例812】动态开辟和释放存储单元的示例,#include,#include,main(),int*p;,p=(int*)malloc(2);,if(p!=NULL),printf(%4d,*p);,free(p);,p,*p,6,*p=6;,6,59,【例812】动态开辟和释放存储单元的示例,#include,#include,main(),int*p;,p=(int*)malloc(2);,if(p!=NULL),printf(%4d,*p);,free(p);,p=(int*)malloc(sizeof(int);,if(p!=NULL),printf(%4dn,*p);,free(p);,p,38,*p=6;,6,*p=38;,38,*p,(int*),sizeof,60,动态链表,61,【例813】调用函数完成链表的建立、输出各结点的值、插入或删除一个结点的功能,具体要求:,调用mycreat函数,建立链表调用myinsert函数,插入一个结点调用mydelete函数,删除值为m的结点调用myprint函数,输出各结点,62,(1)声明结构体类型:structlstintnum;structlst*next;;typedefstructlstLST;,可用LST代替structlst,63,(2)编写主函数,并先用空函数占被调函数的位置后测试,#include#includetypedefstructlstintnum;structlst*next;LST;LST*mycreat()voidmyprint()voidmyinsert()intmydelete(),64,main()LST*head;intk,m,choose;head=mycreat();printf(新建链表为:);myprint(head);printf(“请选择:1.插入2.删除”);scanf(%d,65,switch(choose),case1:printf(插入点:);scanf(%d,myinsert(head,m);,break;,case2:printf(删除点:);scanf(%d,k=mydelete(head,m);,if(k=1),printf(删除点后:);myprint(head);,elseprintf(“不存在n);,break;,66,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,开辟头结点,并用头指针head指向它,head=(LST*)malloc(sizeof(LST);,67,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,q,使指针变量q也指向该头结点,q=head;,68,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,q,p,开辟新的结点,并使指针变量p指向它,p=(LST*)malloc(sizeof(LST);,69,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,q,连接新结点和当前链表的最后结点,q-next=p;,p,70,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,q,将数据赋予新结点的num成员,p-num=m;,101,p,71,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,q,使q指向新链表的最后一个结点,101,p,72,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,q,使q指向新链表的最后一个结点,q=p;,101,p,73,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,开辟新的结点,并使指针变量p指向它,101,p,74,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,开辟新的结点,并使指针变量p指向它,101,p,p=(LST*)malloc(sizeof(LST);,75,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,连接新结点和当前链表的最后结点,q-next=p;,101,76,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,将数据赋予新结点的num成员,p-num=m;,101,103,77,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,使q指向新链表的最后一个结点,101,103,78,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,使q指向新链表的最后一个结点,q=p;,101,103,79,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,链表的最后一个结点设为尾结点,q-next=NULL;,101,103,0,80,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序,head,头结点,返回链表头结点的地址,returnhead;,101,103,0,81,LST*mycreat(),head=(LST*)malloc(sizeof(LST);,q=head;,printf(建立链表,请输入数值:n);,printf(Inputm:);scanf(%d,while(m!=-1),p=(LST*)malloc(sizeof(LST);,q-next=p;,p-num=m;,q=p;,printf(Inputm:);scanf(%d,q-next=NULL;,returnhead;,82,(4)编写myprint()函数,并用此函数代替对应的空函数后运行程序,83,head,头结点,结点1,结点2,尾结点,0,101,103,105,使指针p指向链表中结点1,p,p=head-next;,84,head,头结点,结点1,结点2,尾结点,0,101,103,105,输出p所指结点的num成员值,p,printf(%5d,p-num);,101,85,head,头结点,结点1,结点2,尾结点,0,101,103,105,移动p,即使p指向下一个结点,p,86,head,头结点,结点1,结点2,尾结点,0,101,103,105,移动p,即使p指向下一个结点,p=p-next;,87,head,头结点,结点1,结点2,尾结点,0,101,103,105,输出p所指结点的num成员值,printf(%5d,p-num);,103,88,head,头结点,结点1,结点2,尾结点,0,101,103,105,移动p,即使p指向下一个结点,89,head,头结点,结点1,结点2,尾结点,0,101,103,105,移动p,即使p指向下一个结点,p=p-next;,90,head,头结点,结点1,结点2,尾结点,0,101,103,105,输出p所指结点的num成员值,printf(%5d,p-num);,105,91,head,头结点,结点1,结点2,尾结点,0,101,103,105,移动p,即使p指向下一个结点,92,head,头结点,结点1,结点2,尾结点,0,101,103,105,移动p,即使p指向下一个结点,不存在,所以p=NULL,p=p-next;,93,voidmyprint(LST*head)LST*p;p=head-next;if(p=NULL)printf(链表为空表!);elsedoprintf(%5d,p-num);p=p-next;while(p!=NULL);printf(n);,94,(5)编写myinsert()函数,并用此函数代替对应的空函数后运行程序,95,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,指针s去开辟需插入的结点,s=(LST*)malloc(sizeof(LST);,96,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,需插入的数值赋予新结点的num成员,s-num=m;,97,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,q指向头结点,q=head;,p指向结点1,p=head-next;,98,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,判断是否找到插入点,if(p-numnext;,101,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,q、p都移到下一个结点,q=q-next;,p=p-next;,102,head,头结点,结点1,尾结点,新结点,s,101,103,105,0,104,判断是否找到插入点,if(p-numnext;,105,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,q、p都移到下一个结点,q=q-next;,p=p-next;,106,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,判断是否找到插入点,if(p-numnext=p;,q-next=s;,108,voidmyins

温馨提示

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

评论

0/150

提交评论