C语言第8章结构体和其他构造类型.ppt

上传人:牧羊曲112 文档编号:5426482 上传时间:2023-07-05 格式:PPT 页数:121 大小:999.50KB
返回 下载 相关 举报
C语言第8章结构体和其他构造类型.ppt_第1页
第1页 / 共121页
C语言第8章结构体和其他构造类型.ppt_第2页
第2页 / 共121页
C语言第8章结构体和其他构造类型.ppt_第3页
第3页 / 共121页
C语言第8章结构体和其他构造类型.ppt_第4页
第4页 / 共121页
C语言第8章结构体和其他构造类型.ppt_第5页
第5页 / 共121页
点击查看更多>>
资源描述

《C语言第8章结构体和其他构造类型.ppt》由会员分享,可在线阅读,更多相关《C语言第8章结构体和其他构造类型.ppt(121页珍藏版)》请在三一办公上搜索。

1、第8章 结构体和其他构造类型,8.1 结构体类型变量的定义和使用8.2 结构体和函数调用8.3 提高部分,8.1 结构体类型变量的定义和使用P241,8.1.1 结构体类型的概念和声明8.1.2 结构体类型变量的定义和使用,8.1.1 结构体类型的概念和声明,迄今为止,已介绍了基本类型(或称简单类型)的变量(如整型、实型、字符型变量等),也介绍了一种构造类型数据数组,数组中的各元素是属于同一个类型的。但是只有这些数据类型是不够的。有时需要将不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。C语言允许用户自己指定这样一种数据结构,它称为结构体(structu

2、re)。它相当于其他高级语言中的“记录”。,8.1.1 结构体类型的概念和声明,结构体类型的概念:把不同类型的数据组合在一个类型之中,作为一个整体进行处理 结构体类型。,要表示日期struct date int year,month,day;,要表示学生情况 struct student char name20,number9;float s1,s2,s3;,结构体类型,2.结构体类型的声明 结构体类型声明的一般形式为:struct 结构体名类型名1 成员名表1;类型名2 成员名表2;类型名n 成员名表n;,关键字,也称“域”,;,8.1.2 结构体类型变量的定义和使用P242,【例8.1】假

3、设学生基本情况包括学号和两门课成绩,编写程序计算某学生两门课的平均成绩,并输出该学生的有关信息。,编程点拨,声明结构体类型。struct ex1 long int num;float s1;float s2;,等价于float s1,s2;,在主函数中定义“struct ex1”类型变量wang和“float”类型变量ave。,main(),float ave;struct ex1 wang;,就像float、int 型一样使用。,计算平均成绩并通过变量wang输出有关信息。,main(),float ave;struct ex1 wang;,wang.num=1000101;,wang.s1

4、=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);,?ave占四个字节,wang占多少字节,main(),float ave;struct ex1 wang;,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,s

5、2,4字节,4字节,4字节,1000101,89.5,90.0,12字节,main(),float ave;struct ex1 wang;,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,等价于,struct ex1 wang=1000101,89.5,90.0;,main(),float ave;struct ex1

6、wang;,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,【例8.2】假设学生基本情况包括学号和多门课成绩,计算某学生的平均成绩。,#define N 3struct ex2 long int num;float sN;,要处理的成绩较多时,main()struct ex2 wang,*p;float ave,sum=0,x;int i;p=,等价于wang.num,p

7、rintf(学号:%ldn,p-num);for(i=0;i si;printf(%8.1f,p-si);printf(n);ave=sum/N;printf(平均成绩:%.1f,ave);,等价于(*p).num,等价于(*p).si,wang,num,s0,s1,s2,p,(*p),结构体变量名.成员名(*指针变量名).成员名指针变量名-成员名,“.”、“-”分别是结构体成员运算符和指向结构体成员运算符。在c语言的所有运算符中,这些运算符的优先级最高。(*p).num写成*p.num,由于“.”的优先级高于“*”,因此相当于*(p.num)形式。,【例8.3】设有5名学生,而且每位学生基本

8、情况都包括学号和多门课成绩,计算各学生3门课平均成绩。,#define N 3struct ex2 long int num;float sN;,main()struct ex2 stu5;float ave,sum,k;int i,j;for(i=0;i 5;i+)scanf(%ld,for(i=0;i 5;i+)printf(%10ld,stui.num);sum=0;for(j=0;j N;j+)printf(%8.1f,stui.sj);sum=sum+stui.sj;ave=sum/N;printf(%8.1f n,ave);,注此行的位置,stu0,stu1,stu2,stu3,s

9、tu4,num,s0,s1,s2,各学生平均分:86.2、67.7、64.2、81.0、91.5,【例8.4】假设学生基本情况包括学号和五门课成绩,找出某学生五门课成绩中的最高成绩。,struct ex3 char n10;float s5;,将学号定义为字符串,main()struct ex3 wang=1000101,89.5,90.0,79.0,99.0,69.0;float max;int i;max=0;for(i=0;i5;i+)if(maxwang.si)max=wang.si;printf(“%s号学生,%5.1f,wang.n,max);,scanf(“%s”,wang.n)

10、;功能?,gets(wang.n);功能?,strcpy(wang.n,1000101);功能?,puts(wang.n);功能?,【例8.5】假设学生基本情况包括学号和英语、C程序设计、数学三门课成绩,输出五个学生中,数学成绩最高的学生所有信息。,struct ex4 char n10;float s3;,main()struct ex4 stu5=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;int i,k=

11、0;,for(i=1;i 5;i+)if(stuk.s2 stui.s2)k=i;printf(“%s号学生n,stuk.n);for(i=0;i 3;i+)printf(%5.1f,stuk.si);,1000105 号学生90.5 95.0 89.0,8.2 结构体和函数调用 P249,结构体类型变量的成员作实参。,【例8.6】结构体类型变量的成员 作实参示例。,struct ex2 long int num;float s3;,long型,实型数组名,void myfun1(long int num,float*p),wang,num,s,p,num,*p,*(p+1),*(p+2),1

12、000101,printf(学号:%ld,成绩:,num);,for(i=0;i 3;i+),printf(%5.1f,*(p+i);,printf(n);,1000101 89.5 90.0 79.0,wang,num,s,p,num,*p,*(p+1),*(p+2),1000101,void myfun1(long int num,float*p),结构体类型变量作实参。,【例8.7】结构体变量作实参的示例。,struct ex2 long int num;float s3;,void myfun2(struct ex2 xiaowang),xiaowang.num=1000105;,xi

13、aowang.s2=95.5;,main(),struct ex2 wang=1000101,89.5,90.0,79.0;,int i;,myfun2(wang);,printf(学号:%ld,成绩:,wang.num);,for(i=0;i3;i+),printf(%5.1f,wang.si);,printf(n);,num,s,1000101 89.5 90.0 79.0,wang,xiaowang,num,s,xiaowang.num=1000105;,1000105,xiaowang.s2=95.5;,95.5,结构体类型变量地址作实参。,【例8.8】结构体变量地址作实参的示例。,s

14、truct ex2 long int num;float s3;,void myfun3(struct ex2*p),p-num=1000105;,p-s2=95.5;,main(),struct ex2 wang=1000101,89.5,90.0,79.0;,int i;,myfun3(,printf(学号:%ld,成绩:,wang.num);,for(i=0;i3;i+),printf(%5.1f,wang.si);,printf(n);,myfun3(,void myfun3(struct ex2*p),1000105,95.5,结构体类型数组名作实参。,【例8.9】结构体类型数组名作

15、实参的示例。,struct ex2 long int num;float s3;,void myfun4(struct ex2*p)int i;float k;struct ex2*q;for(q=p;q num);for(i=0;isi=k;,main()int i,j;struct ex2 stu5;myfun4(stu);for(i=0;i5;i+)printf(%ld 号学生成绩是:,stui.num);for(j=0;j 3;j+)printf(%5.1f,stui.sj);printf(n);,8.3 提高部分 P252,8.3.1 结构体的进一步讨论8.3.2 链表8.3.5 实

16、例的部分程序,8.3.1 结构体的进一步讨论 P252,在一个结构体类型中可以含有另一个结构体类型。,【例8.10】内嵌结构体类型的示例。,struct date inty,m,d;struct student char name10;struct date birthday;float s3;,main()struct student Li=LiLan,1982,12,25,88,75,85.5;printf(%sn,Li.name);printf(%d-%d-%dn,Li.birthday.y,Li.birthday.m,Li.birthday.d);printf(%f,%f,%fn,Li

17、.s0,Li.s1,Li.s2);,LiLan,1982-12-25,88.000000,75.000000,85.500000,y,m,d,s0,s1,s2,name,birthday,s,要改为1985,Li.birthday.y=1985;,y,m,d,s0,s1,s2,name,birthday,s,要改为10,Li.birthday.m=10;,y,m,d,s0,s1,s2,name,birthday,s,要输入值,scanf(%d,y,m,d,s0,s1,s2,name,birthday,s,要改为5,p-birthday.d=5;,p,(*p).birthday.d=5;,y,m

18、,d,s0,s1,s2,name,birthday,s,要输入值,p,scanf(%d,scanf(%d,声明可改为:struct student char name10;struct int y,m,d;birthday;float s3;,【例8.11】内嵌结构体类型为 本结构体类型的示例。,#include struct lst intnum;struct lst*next;;,能指向 struct lst 类型变量,a.num=1;,a.next=,b.num=2;,b.next=,c.num=3;,c.next=NULL;,p=,printf(%4d,p-num);,1,2,3,0,

19、p,1,a,b,c,num,next,num,next,num,next,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,a,b,c,num,next,num,next,num,next,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=

20、p-next;,printf(%4d,p-num);,1,2,3,0,p,1,2,3,8.3.2 链表 P256,链表的概念,非空链表结构,head,头结点,结点1,结点2,尾结点,0,链表的概念,8.3.2 链表 P256,链表特点:所有结点为相同结构体类型;至少一个成员为指针,该指针基类型与链表结点的类型相同。,需解决问题:(1)建立链表;(2)输出链表中各结点的值;(3)在链表中插入一个结点;(4)删除链表中的一个结点。,动态开辟和释放函数,malloc、calloc、realloc,动态开辟函数:,释放函数:,free,#include,【例8.12】动态开辟和释放存储单元的示例。,#

21、include,#include,main(),int*p;,p=(int*)malloc(2);,if(p!=NULL),printf(%4d,*p);,free(p);,p,*p,6,*p=6;,6,【例8.12】动态开辟和释放存储单元的示例。,#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;,3

22、8,*p,(int*),sizeof,动态链表,【例8.13】调用函数完成链表的建立、输出各结点的值、插入或删除一个结点的功能。,具体要求:,调用mycreat函数,建立链表;调用myinsert函数,插入一个结点;调用mydelete函数,删除值为m的结点;调用myprint函数,输出各结点。,(1)声明结构体类型:struct lst int num;struct lst*next;;typedef struct lst LST;,可用LST代替struct lst,(2)编写主函数,并先用空函数占被调函数的位置后测试。,#include#include typedef struct ls

23、t int num;struct lst*next;LST;LST*mycreat()void myprint()void myinsert()int mydelete(),main()LST*head;int k,m,choose;head=mycreat();printf(新建链表为:);myprint(head);printf(“请选择:1.插入 2.删除”);scanf(%d,switch(choose),case 1:printf(插入点:);scanf(%d,myinsert(head,m);,break;,case 2:printf(删除点:);scanf(%d,k=mydele

24、te(head,m);,if(k=1),printf(删除点后:);myprint(head);,else printf(“不存在n);,break;,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,开辟头结点,并用头指针head指向它。,head=(LST*)malloc(sizeof(LST);,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,q,num,next,使指针变量q也指向该头结点。,q=head;,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,q

25、,p,num,next,开辟新的结点,并使指针变量p指向它。,p=(LST*)malloc(sizeof(LST);,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,q,num,next,结点1,num,next,连接新结点和当前链表的最后结点。,q-next=p;,p,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,q,num,next,结点1,num,next,将数据赋予新结点的num成员。,p-num=m;,101,p,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head

26、,头结点,q,num,next,结点1,num,next,使q指向新链表的最后一个结点。,101,p,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,q,num,next,结点1,num,next,使q指向新链表的最后一个结点。,q=p;,101,p,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,num,next,结点1,num,next,开辟新的结点,并使指针变量p指向它。,101,p,q,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,num,next,结点

27、1,num,next,新结点,num,next,开辟新的结点,并使指针变量p指向它。,101,p,q,p=(LST*)malloc(sizeof(LST);,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,num,next,结点1,num,next,新结点,num,next,连接新结点和当前链表的最后结点。,q-next=p;,101,p,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,num,next,结点1,num,next,新结点,num,next,将数据赋予新结点的num成员。,p-num=m;,1

28、01,103,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,num,next,结点1,num,next,新结点,num,next,使q指向新链表的最后一个结点。,101,103,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,num,next,结点1,num,next,新结点,num,next,使q指向新链表的最后一个结点。,q=p;,101,103,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,num,next,结点1,num,next,新结点,num,ne

29、xt,链表的最后一个结点设为尾结点。,q-next=NULL;,101,103,0,(3)编写mycreat()函数,并用此函数代替对应的空函数后运行程序。,返回链表头结点的地址。,return head;,head,头结点,num,next,结点1,num,next,新结点,num,next,101,103,0,LST*mycreat(),head=(LST*)malloc(sizeof(LST);,q=head;,printf(建立链表,请输入数值:n);,printf(Input m:);scanf(%d,while(m!=-1),p=(LST*)malloc(sizeof(LST);,

30、q-next=p;,p-num=m;,q=p;,printf(Input m:);scanf(%d,q-next=NULL;,return head;,(4)编写myprint()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,结点1,结点2,尾结点,0,101,103,105,使指针p指向链表中结点1。,p,p=head-next;,head,头结点,结点1,结点2,尾结点,0,101,103,105,输出p所指结点的num成员值。,p,printf(%5d,p-num);,101,head,头结点,结点1,结点2,尾结点,0,101,103,105,移动p,即使p指向下一个

31、结点。,p,head,头结点,结点1,结点2,尾结点,0,101,103,105,移动p,即使p指向下一个结点。,p=p-next;,head,头结点,结点1,结点2,尾结点,0,101,103,105,输出p所指结点的num成员值。,p,printf(%5d,p-num);,103,head,头结点,结点1,结点2,尾结点,0,101,103,105,移动p,即使p指向下一个结点。,p,head,头结点,结点1,结点2,尾结点,0,101,103,105,移动p,即使p指向下一个结点。,p=p-next;,head,头结点,结点1,结点2,尾结点,0,101,103,105,输出p所指结点的

32、num成员值。,p,printf(%5d,p-num);,105,移动p,即使p指向下一个结点。,head,头结点,结点1,结点2,尾结点,0,101,103,105,p,head,头结点,结点1,结点2,尾结点,0,101,103,105,移动p,即使p指向下一个结点。,不存在,所以 p=NULL,p=p-next;,void myprint(LST*head)LST*p;p=head-next;if(p=NULL)printf(链表为空表!);else do printf(%5d,p-num);p=p-next;while(p!=NULL);printf(n);,(5)编写myinsert

33、()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,指针s去开辟需插入的结点。,s=(LST*)malloc(sizeof(LST);,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,需插入的数值赋予新结点的num成员。,s-num=m;,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,q指向头结点。,q=head;,p指向结点1,p=head-next;,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105

34、,0,104,q,p,判断是否找到插入点。,if(p-num=m),head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,q,p,q、p都移到下一个结点。,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,q、p都移到下一个结点。,q=q-next;,p,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,q,q、p都移到下一个结点。,q=q-next;,p=p-next;,head,头结点,结点1,尾结点,新结点,s,101,103,105,0,104,q,判断是否找到插入点。,

35、if(p-num=m),p,结点2,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,q,p,q、p都移到下一个结点。,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,q、p都移到下一个结点。,p,q=q-next;,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,q、p都移到下一个结点。,q=q-next;,p=p-next;,q,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,判断是否找到插入点。,if(p-num=m),p,

36、q,head,头结点,结点1,尾结点,结点2,新结点,s,101,103,105,0,104,插入新结点。,s-next=p;,p,q-next=s;,q,void myinsert(LST*head,int m)LST*p,*q,*s;s=(LST*)malloc(sizeof(LST);s-num=m;q=head;p=head-next;while(p!=NULL)if(p-num next;p=p-next;else break;s-next=p;q-next=s;,(6)编写mydelete()函数,并用此函数代替对应的空函数后运行程序。,head,头结点,结点1,尾结点,结点2,1

37、01,103,105 0,q指向头结点,p指向结点1。,q=head;,p=head-next;,head,头结点,结点1,尾结点,结点2,101,103,105 0,判断是否找到需删结点。,q,if(m!=p-num),p,head,头结点,结点1,尾结点,结点2,p,101,103,105 0,q、p都移到下一个结点。,q,head,头结点,结点1,尾结点,结点2,p,101,103,105 0,q、p都移到下一个结点。,q=q-next;,head,头结点,结点1,尾结点,结点2,101,103,105 0,q、p都移到下一个结点。,q,q=q-next;,p=p-next;,head,

38、头结点,结点1,尾结点,结点2,101,103,105 0,判断是否找到需删结点。,if(m!=p-num),p,q,head,头结点,结点1,尾结点,结点2,101,103,105 0,删除结点,q-next=p-next;,p,q,释放该结点,free(p);,int mydelete(LST*head,int m)LST*p,*q;q=head;p=head-next;while(p!=NULL)if(m!=p-num)q=q-next;p=p-next;else break;if(p=NULL)return 0;q-next=p-next;free(p);return 1;,8.3.5 实例的部分程序 P268,【实例12】用结构体类型数据,编写实现电子通讯录功能的程序。演 示 shili12.exe,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号