c语言程序设计课件:第十一章结构体.ppt

上传人(卖家):罗嗣辉 文档编号:2057676 上传时间:2022-01-26 格式:PPT 页数:43 大小:157.50KB
下载 相关 举报
c语言程序设计课件:第十一章结构体.ppt_第1页
第1页 / 共43页
c语言程序设计课件:第十一章结构体.ppt_第2页
第2页 / 共43页
c语言程序设计课件:第十一章结构体.ppt_第3页
第3页 / 共43页
c语言程序设计课件:第十一章结构体.ppt_第4页
第4页 / 共43页
c语言程序设计课件:第十一章结构体.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

1、第十一章第十一章 结构体结构体 11.1 11.1 概述概述 在实际应用中,有不少应用问题如果只采在实际应用中,有不少应用问题如果只采用已学的变量和数组作为数据结构显得很不方用已学的变量和数组作为数据结构显得很不方便。便。 例:输入例:输入100100个学生的学号、姓名和考试成个学生的学号、姓名和考试成绩,编写程序找出高分者和低分者。绩,编写程序找出高分者和低分者。 用变量和数组作数据结构用变量和数组作数据结构可编写程序如下:可编写程序如下:main() int i, num, maxnum, minnum; char name20, maxname20, minname20; int sco

2、re, maxscore, minscore; maxscore=0; minscore=100; for(i=1; imaxscore) maxscore=score; maxnum=num; strcpy(maxname,name); if(scoreminscore) minscore=score; minnum=num; strcpy(minname,name); 输出输出 明显缺点:明显缺点: 变量过多,同一学生的各个数据无联系,变量过多,同一学生的各个数据无联系,没有整体概念,不便管理。没有整体概念,不便管理。 操作不便(如更新过程)。操作不便(如更新过程)。 显然,选用一种能把一

3、个学生的数据构造成显然,选用一种能把一个学生的数据构造成一个整体的构造型数据结构更合适,但不能是数一个整体的构造型数据结构更合适,但不能是数组组。 对于这种情况,可以将一个学生的数据定义对于这种情况,可以将一个学生的数据定义为一个为一个结构体类型结构体类型:struct student 类型名类型名 int num; 成员表成员表 char name20; int score; 定义了一个结构体类型,它包含三个成员。定义了一个结构体类型,它包含三个成员。 11.2 11.2 定义结构体类型变量的方法定义结构体类型变量的方法 前面定义的结构体类型只是一种前面定义的结构体类型只是一种“模型模型”,

4、还必须定义结构体变量后才能存放数据。还必须定义结构体变量后才能存放数据。 定义结构体变量有三种方法:定义结构体变量有三种方法: 1 1、先定义结构体类型再定义结构体变量、先定义结构体类型再定义结构体变量 定义了结构体类型后:定义了结构体类型后: structstruct student student st, stmax, stmin st, stmax, stmin; ; 类型符类型符 变量名变量名 定义了三个结构体变量,每个变量包含三个成定义了三个结构体变量,每个变量包含三个成员,每个变量可存放一个学生的数据。员,每个变量可存放一个学生的数据。 2 2、在定义结构体类型的同时定义结构体变量

5、、在定义结构体类型的同时定义结构体变量 struct student int num; char name20; int score; st, stmax, stmin;3 3、直接定义结构体类型变量、直接定义结构体类型变量 struct struct 不出现类型名不出现类型名 int int num;num; char name20; char name20; int int score; score; st, stmax, stminst, stmax, stmin; ; 常用第一种方法常用第一种方法说明:说明: 类型与变量不同,只对变量分配空间与操作。类型与变量不同,只对变量分配空间与操

6、作。 对成员可以单独使用,相当于普通变量。对成员可以单独使用,相当于普通变量。 成员也可以是一个结构体变量。成员也可以是一个结构体变量。 struct date struct student int month; int num; int day; char name20; int year; struct date birthday; ; st1, st2; 成员名可以与程序中的变量名相同,两成员名可以与程序中的变量名相同,两者代表不同的对象。者代表不同的对象。 11.3 11.3 结构体变量的引用结构体变量的引用 成员引用成员引用 可以对成员单独引用,形式为:可以对成员单独引用,形式为:

7、结构体变量名结构体变量名 . . 成员名成员名 成员运算符成员运算符st.num=1001;st.score=90;strcpy(st.name,”Li”);printf(“%d%s%d”,st.num,st.name,st.score);scanf(“%d%s%d”,&st.num,st.name,&st.score) ; 可以引用成员的地址可以引用成员的地址 如果成员本身又属一个结构体类型,则如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最要用若干个成员运算符,一级一级地找到最低一级的成员,只能对最低级的成员进行存低一级的成员,只能对最低级的成员进行存取与运算。取与

8、运算。 st1.birthday.year=1960; st1.birthday.month=5; st1.birthday.day=15; 整体引用整体引用 可以对结构体变量进行整体赋值:可以对结构体变量进行整体赋值: stmax=ststmax=st; ; 将st中的所有内容赋值给stmax。 对结构体变量的整体操作只限于赋值操作对结构体变量的整体操作只限于赋值操作和参数传递,而且要求类型一致。不能对结构和参数传递,而且要求类型一致。不能对结构体变量进行整体输入输出。体变量进行整体输入输出。 结构体应用举例:结构体应用举例: 编写程序输入编写程序输入100100个学生的学号、姓名和个学生的

9、学号、姓名和考试成绩,找出高分者和低分者。考试成绩,找出高分者和低分者。 struct student int num; char name20; int score; ; main() int i; struct student st,stmax,stmin; stmax.score=0; stmin.score=100; for(i=1;istmax.score) stmax=st; if(st.scorestmin.score) stmin=st; printf(“n%5d%15s%5d”,stmax.num,stmax.name, stmax.score); printf(“n%5d%

10、15s%5d”,stmin.num,stmin.name, stmin.score); 11.4 11.4 结构体变量的初始化结构体变量的初始化 对结构体变量可以在定义时指定初始值对结构体变量可以在定义时指定初始值 struct student int num; char name20; int score; st=1001,”wang”,95; 11.5 11.5 结构体数组结构体数组 可以定义结构体数组来存放批量数据。可以定义结构体数组来存放批量数据。 结构体数组的定义结构体数组的定义 struct student int num; char name20; int score; ;str

11、uct student a100; 定义定义a a数组,可以存放数组,可以存放100100个学生的数据。个学生的数据。 a a数组的每个元素又是一个结构体变量。数组的每个元素又是一个结构体变量。 结构体数组的初始化结构体数组的初始化 在定义结构体数组的同时指定初值。在定义结构体数组的同时指定初值。 struct struct studentstudent int int num;num; char name20; char name20; int int score;score; ; struct student a2= 1001,”LiLi”,85,1002,”wang”,90; 或:或:

12、struct student int num; char name20; int score; a2= 1001,”LiLi”,85,1002,”wang”,90; 结构体数组元素的引用结构体数组元素的引用 成员引用:成员引用: a0.num=1001; a0.num=1001; strcpy(a0.name,”wang strcpy(a0.name,”wang”);”); a0.score=85; a0.score=85; 整体引用:整体引用: a1=a0; a1=a0; 与普通数组元素的引用相同与普通数组元素的引用相同 结构体数组的应用结构体数组的应用 输入输入100100个学生的学号、姓

13、名和考试成绩,个学生的学号、姓名和考试成绩,然后按从高分到低分的顺序排列后输出。然后按从高分到低分的顺序排列后输出。struct student int num; char name20; int score; ;main() int i, j; struct student a100, t; for(i=0;i100;i+) scanf(“%d%s%d”,&ai.num,ai.name, &ai.score); for(i=0;i99;i+) for(j=i+1; j100; j+) if(ai.scoreaj.score) t=ai; ai=aj; aj=t; 整体引用整体引用 for(i

14、=0;i100;i+) printf(“n%5d%15s%5d”,ai.num, ai.name,ai.score); 例:(例:(p266p266例例11.211.2) 对候选人得票的统计程序。设有三个候选人,对候选人得票的统计程序。设有三个候选人,每次输入一个得票候选人的名字,要求最后输每次输入一个得票候选人的名字,要求最后输出各候选人的得票结果。出各候选人的得票结果。# #include “string.h”include “string.h”struct struct personperson char name20; char name20; int int count;count;

15、 leader3=“Li”,0,”zhang”,0,”wan leader3=“Li”,0,”zhang”,0,”wang g”,0;”,0;main() int i, j ; char leader_name20; for(i=1;i=100;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,leaderj.name)=0) leaderj.count+; printf(“n”); for(i=0;inum=1001;(*p).score=85; 或或 p-score=85;strcpy(*p).name,”w

16、ang”); 或或 strcpy(p-name,”wang”); 整体引用整体引用 st1=*p; 等效于等效于 st1=st; 指向结构体数组的指针指向结构体数组的指针 struct student a100; struct student *p; p=a; 通过指针变量引用结构体数组元素:通过指针变量引用结构体数组元素: 成员引用成员引用 (*p).num=1001; 或或 p-num=1001; (*p).score=85; 或或 p-score=85; strcpy(*p).name,”wang”); 或或strcpy(p-name,”wang”); 一般地:一般地:(*(p+i).n

17、um=1001; 或或 (p+i)-num=1001;(*(p+i).score=85; 或或 (p+i)-score=85;strcpy(*(p+i).name,”wang”); 或或 strcpy(p+i)-name,”wang”);也可以用下标法:也可以用下标法:pi.num=1001; 整体引用整体引用*(p+1)=*(p+0); 或或 p1=p0; 用结构体变量和指向结构体的指针作函数参数用结构体变量和指向结构体的指针作函数参数 用结构体变量作函数参数时,对应的实参应用结构体变量作函数参数时,对应的实参应该是同类型的结构体变量(或数组元素),参数该是同类型的结构体变量(或数组元素),

18、参数传递是传递是“值传递值传递”。 用指向结构体的指针作函数参数时,对应的用指向结构体的指针作函数参数时,对应的实参应该是同类型的结构体变量的地址(或数组实参应该是同类型的结构体变量的地址(或数组的地址),参数传递是的地址),参数传递是“地址传递地址传递”。main() struct student st=1001,”LiLi”,70; f(st); printf(“n %5d%10s%5d”, st.num,st.name,st.score);f(struct student a) a.score=90; printf(“n %5d%10s%5d”, a.num,a.name,a.score

19、);1001LiLi70st1001LiLi70a90main() struct student st=1001,”LiLi”,70; f(&st); printf(“n %5d%10s%5d”,st.num,st.name,st.score); f(struct student *a) a-score=90; printf(“n%5d%10s%5d”,a-num,a-name,ascore);通过指针变量通过指针变量a a可以访问它所指向的结构体。可以访问它所指向的结构体。 1001LiLi70st20002000a9011.7 11.7 用指针处理链表用指针处理链表 链表概述链表概述 链表

20、是一种重要的数据结构链表是一种重要的数据结构动态数据结构。动态数据结构。 以具体例子来说明链表的概念及其应用:以具体例子来说明链表的概念及其应用:例:选择合适的数据结构来存放一批学生的学号例:选择合适的数据结构来存放一批学生的学号及考试成绩,以便进一步处理。及考试成绩,以便进一步处理。 由于学生人数未知,用静态数据结构不合适。由于学生人数未知,用静态数据结构不合适。用链表处理较恰当。用链表处理较恰当。用链表处理该问题的基本思路:用链表处理该问题的基本思路: 将各学生的数据进行离散存放,来一个学生将各学生的数据进行离散存放,来一个学生就分配一小块内存(结点)。并将各结点用指针就分配一小块内存(结

21、点)。并将各结点用指针依次连接起来依次连接起来链表。链表。 每结点应包含下一结点的开始地址。每结点应包含下一结点的开始地址。 最后一个结点中的指针为空。最后一个结点中的指针为空。 链头指针指向第一个结点链头指针指向第一个结点, ,是访问链表的重要依据。是访问链表的重要依据。 这样的链表称这样的链表称单向链表单向链表。 head学号成绩指针学号成绩指针学号成绩指针学号成绩指针学号成绩NULL 一个结点可用如下结构体描述:一个结点可用如下结构体描述:typedef struct student int num; 学号学号 int score; 成绩成绩 struct student *next;

22、下一结点的首地址下一结点的首地址 STU; typedef : 自定义类型符自定义类型符(见(见11.10) 单向链表的建立单向链表的建立 输入一个学生的数据。输入一个学生的数据。 分配结点空间,数据存入。分配结点空间,数据存入。 将该结点的首地址赋给上一结点的将该结点的首地址赋给上一结点的nextnext,若,若该结点是第一个结点,则赋给头指针。该结点是第一个结点,则赋给头指针。 将该结点的将该结点的nextnext置为空,表示该结点为当前置为空,表示该结点为当前的最后结点。的最后结点。head学号成绩next学号成绩next学号成绩next学号成绩next学号成绩NULLSTU *creat() STU st,*p0=NULL,*p,*head=NULL; while(1) scanf(%d%d,&st.num,&st.score); if(st.numnext=p0-next; p0-next=p;p-next=p0-next; p0-next=p; head学号成绩next学号成绩next学号成绩next学号成绩NULL

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

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(c语言程序设计课件:第十一章结构体.ppt)为本站会员(罗嗣辉)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|