樊媛媛《c语言程序设计》11-结构体.ppt

上传人:牧羊曲112 文档编号:5992286 上传时间:2023-09-12 格式:PPT 页数:43 大小:303.61KB
返回 下载 相关 举报
樊媛媛《c语言程序设计》11-结构体.ppt_第1页
第1页 / 共43页
樊媛媛《c语言程序设计》11-结构体.ppt_第2页
第2页 / 共43页
樊媛媛《c语言程序设计》11-结构体.ppt_第3页
第3页 / 共43页
樊媛媛《c语言程序设计》11-结构体.ppt_第4页
第4页 / 共43页
樊媛媛《c语言程序设计》11-结构体.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《樊媛媛《c语言程序设计》11-结构体.ppt》由会员分享,可在线阅读,更多相关《樊媛媛《c语言程序设计》11-结构体.ppt(43页珍藏版)》请在三一办公上搜索。

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

2、minscore)minscore=score;minnum=num;strcpy(minname,name);输出,明显缺点:变量过多,同一学生的各个数据无联系,没有整体概念,不便管理。操作不便(如更新过程)。显然,选用一种能把一个学生的数据构造成一个整体的构造型数据结构更合适,但不能是数组。对于这种情况,可以将一个学生的数据定义为一个结构体类型:,struct student 类型名 int num;成员表 char name20;int score;定义了一个结构体类型,它包含三个成员。,11.2 定义结构体类型变量的方法 前面定义的结构体类型只是一种“模型”,还必须定义结构体变量后才能

3、存放数据。定义结构体变量有三种方法:,1、先定义结构体类型再定义结构体变量 先定义结构体类型,后定义结构体变量:struct student 类型名 int num;成员表 char name20;int score;struct student st,stmax,stmin;类型符 变量名 定义了三个结构体变量,每个变量包含三个成员,每个变量可存放一个学生的数据。,2、在定义结构体类型的同时定义结构体变量 struct student int num;char name20;int score;st,stmax,stmin;,3、直接定义结构体类型变量 struct 不出现类型名 int n

4、um;char name20;int score;st,stmax,stmin;常用第一种方法,说明:类型与变量的区别:只对变量分配空间与操作。对成员可以单独使用,相当于普通变量。成员也可以是一个结构体变量。struct date struct student int month;int num;int day;char name20;int year;struct date birthday;st1,st2;成员名可以与程序中的变量名相同,两者代表不同的对象。,11.3 结构体变量的引用 成员引用 可以对成员单独引用,形式为:结构体变量名.成员名 成员运算符st.num=1001;st.sc

5、ore=90;strcpy(st.name,”Li”);scanf(“%d%s%d”,可以引用成员的地址,如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员,只能对最低级的成员进行存取与运算。st1.birthday.year=1960;st1.birthday.month=5;st1.birthday.day=15;,整体引用 可以对结构体变量进行整体赋值:stmax=st;将st中的所有内容赋值给stmax。对结构体变量的整体操作只限于赋值操作和参数传递,而且要求类型一致。不能对结构体变量进行整体输入输出。,结构体应用举例:编写程序输入100个学生的学号、

6、姓名和考试成绩,找出高分者和低分者。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%15s%5d”,stmin.num,stmin.name,stmin

7、.score);例T11-1.c,11.4 结构体变量的初始化 对结构体变量可以在定义时指定初始值 struct student int num;char name20;int score;st=1001,”wang”,95;,11.5 结构体数组 可以定义结构体数组来存放批量数据。结构体数组的定义 struct student int num;char name20;int score;;struct student a100;定义a数组,可以存放100个学生的数据。a数组的每个元素又是一个结构体变量。,结构体数组的初始化 在定义结构体数组的同时指定初值。struct student int

8、 num;char name20;int score;;struct student a2=1001,”LiLi”,85,1002,”wang”,90;,或:struct student int num;char name20;int score;a2=1001,”LiLi”,85,1002,”wang”,90;,结构体数组元素的引用 成员引用:a0.num=1001;strcpy(a0.name,”wang”);a0.score=85;整体引用:a1=a0;与普通数组元素的引用相同,结构体数组的应用 输入100个学生的学号、姓名和考试成绩,然后按从高分到低分的顺序排列后输出。,struct

9、student int num;char name20;int score;main()int i,j;struct student a100,t;for(i=0;i100;i+)scanf(“%d%s%d”,for(i=0;i99;i+)for(j=i+1;j100;j+)if(ai.scoreaj.score)t=ai;ai=aj;aj=t;整体引用 for(i=0;i100;i+)printf(“n%5d%15s%5d”,ai.num,ai.name,ai.score);例T11-2.c,例:(p266例11.2)对候选人得票的统计程序。设有三个候选人,每次输入一个得票候选人的名字,要求

10、最后输出各候选人的得票结果。#include“string.h”struct person char name20;int count;leader3=“Li”,0,”zhang”,0,”wang”,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;i3;i+)printf(“n%15s%5d”,leaderi.name

11、,leaderi.count);例T11-3.c,11.6 指向结构体类型数据的指针 指向结构体类型变量的指针 struct student st,st1;struct student*p;p=,定义指向结构体类型数据的指针变量p,通过指针变量引用结构体变量:p=,指向结构体数组的指针 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,”w

12、ang”);,对于第i个结构体元素:(*(p+i).num=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;,用结构体变量和指向结构体的指针作函数参数 用结构体变量作函数参数时,对应的实参应该是同类型的结构体变量(或数组元素),参数传递是“值传递”。用指向结构体的指针作函数参数时,对应的实参应该是同类型的结构体变量的地址(或数组的地址),

13、参数传递是“地址传递”。,main()struct student st=1001,”LiLi”,70;f(st);printf(“n%5d%10s%5d”,st.num,st.name,st.score);void f(struct student a)a.score=90;printf(“n%5d%10s%5d”,a.num,a.name,a.score);例T11-4-1.c,1001LiLi70,st,1001LiLi70,a,90,main()struct student st=1001,”LiLi”,70;f(通过指针变量a可以访问它所指向的结构体。例T11-4-2.c,1001L

14、iLi70,st,2000,2000,a,90,11.7 用指针处理链表 链表概述 链表是一种重要的数据结构动态数据结构。以具体例子来说明链表的概念及其应用:例:选择合适的数据结构来存放一批学生的学号及考试成绩,以便进一步处理。由于学生人数未知,用静态数据结构不合适。用链表处理较恰当。,用链表处理该问题的基本思路:将各学生的数据进行离散存放,来一个学生就分配一小块内存(结点)。并将各结点用指针依次连接起来链表。每结点应包含下一结点的开始地址。最后一个结点中的指针为空。链头指针指向第一个结点,是访问链表的重要依据。这样的链表称单向链表。,head,学号成绩指针,学号成绩指针,学号成绩指针,学号成

15、绩指针,学号成绩NULL,一个结点可用如下结构体描述:typedef struct student int num;学号 int score;成绩 struct student*next;下一结点的首地址 STU;typedef:自定义类型符(见P316),单向链表的建立 输入一个学生的数据。分配结点空间,数据存入。将该结点的首地址赋给上一结点的next,若该结点是第一个结点,则赋给头指针。将该结点的next置为空,表示该结点为当前的最后结点。,head,学号成绩next,学号成绩next,学号成绩next,学号成绩next,学号成绩NULL,STU*creat()STU st,*p0=NUL

16、L,*p,*head=NULL;while(1)scanf(%d%d,head,学号成绩next,学号成绩next,学号成绩NULL,单向链表的访问 以输出为例 通过头指针找到第一个结点.输出当前结点的内容,并通过next找到后继结点,直到next为空.,void output(STU*head)STU*p=head;while(p)printf(n%d%d,(*p).num,(*p).score);p=(*p).next;,head,学号成绩next,学号成绩next,学号成绩NULL,学号成绩next,删除结点操作 按链表的访问方法找到相应结点。若该结点是第一个结点,则将后继结点指针赋给头

17、指针。若该结点是最后一个结点,则将前缀结点的next置为空。若该结点是中间结点,则将后继结点指针赋给前缀结点的next。释放该结点所占的内存单元。,head,学号成绩next,学号成绩next,学号成绩NULL,STU*delete(STU*head,int number)STU*p=head,*p0=NULL;while(p)if(*p).num=number)if(p=head)head=(*p).next;else if(*p).next=NULL)(*p0).next=NULL;else(*p0).next=(*p).next;free(p);break;else p0=p;p=(*p

18、).next;return head;,假定要删除某一指定学号的结点,插入操作 假定将结点p 插入到结点p0的后面,则插入操作的关键为:p-next=p0-next;p0-next=p;,head,学号成绩next,学号成绩next,学号成绩next,学号成绩NULL,STU*insert(STU*head,STU*stud)STU*p0,*p1,*p2;p1=head;p0=stud;/p1指向第一个结点,p0指向要插入的结点if(head=NULL)/原来是空表 head=p0;p0-next=NULL;/p0作为第一个结点else while(p0-num p1-num),void main()例T11-5.cSTU*stud_head,*student;int number,score,i;stud_head=creat();/创建链表output(stud_head);/输出链表for(i=0;inum=number;student-score=score;stud_head=insert(stud_head,student);output(stud_head);,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号