结构体与共用体程序设计甘玲.ppt

上传人:牧羊曲112 文档编号:6332276 上传时间:2023-10-17 格式:PPT 页数:136 大小:1.20MB
返回 下载 相关 举报
结构体与共用体程序设计甘玲.ppt_第1页
第1页 / 共136页
结构体与共用体程序设计甘玲.ppt_第2页
第2页 / 共136页
结构体与共用体程序设计甘玲.ppt_第3页
第3页 / 共136页
结构体与共用体程序设计甘玲.ppt_第4页
第4页 / 共136页
结构体与共用体程序设计甘玲.ppt_第5页
第5页 / 共136页
点击查看更多>>
资源描述

《结构体与共用体程序设计甘玲.ppt》由会员分享,可在线阅读,更多相关《结构体与共用体程序设计甘玲.ppt(136页珍藏版)》请在三一办公上搜索。

1、第8章 结构体与共用体程序设计,C语言程序设计,2,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,本章内容,共用体,结构体类型与变量、结构体数组,自引用结构、动态内存分配、链表,结构体指针,位运算、位段,3,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,信息查询问题,数组是非常有用的一种数据结构,但它的所有元素的数据类型都必须相同。但是,在现实生活中,将一组异型的数据看作一个整体也很重要。如:对一个班的所有学生各课程按平均分排名。,假定输入某班30个学生信息(包括:学号、姓名、性别、5门课程成绩、平均分),要求按平均分由高到低输出

2、该班学生信息。我们该怎么做呢?,4,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,问题分析,例8-1 对一个班的学生成绩进行排名。假定要求输入某班30个学生的信息(包括学号、姓名、性别、3门课成绩),求得平均成绩,要求按平均成绩由高到低输出该班学生信息。【分析】学生“学号”、“姓名”、“性别”使用字符型数据,几门课程的“成绩”使用整型数据,“平均分”使用实型数据,可以分别定义不同的变量来存放这几个类型的数据。如果要显示某个学生的信息,那么要找到该学生的信息就要从这几个变量中分别查找,并且还要同步移动数组元素位置,这给程序员带来了很多不便。,5,解析C程序设计(第

3、2版)第8章 结构体与共用体程序设计,2023/10/17,数组解决方式,int studentId30;/*最多可以管理30个学生,每个学生的学号用数组的下标表示*/char studentName3010;int studentSex;int scoreMath30;/*数学课的成绩*/int scoreEnglish30;/*英语课的成绩*/int scoreComputer30;/*计算机原理课的成绩*/int scoreC30;/*C语言课的成绩*/int scoreTelecomm30;/*通信网的成绩*/int aveage30;/*平均成绩*/,6,解析C程序设计(第2版)第8

4、章 结构体与共用体程序设计,2023/10/17,数组解决方式,数据的内存管理方式,分配内存不集中,寻址效率不高 对数组进行赋初值时,容易发生错位 结构显得比较零散,不容易管理,7,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,希望的内存分配,8,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,问题分析,在C语言中,允许用户自己构造一种新的数据类型,它的成员可以包括各种数据类型,这种数据结构就是结构体(structure),它相当于其他高级语言中的“记录”。结构体中的元素称为“成员”,在“记录”中称为“字段”,用来存储所有“记录”的

5、数据集合称为“数据库”。结构体中的所有成员变量在内存中是连续存储的,结构体的内存空间大小为各成员内存空间大小之和。本例声明一个结构体类型struct student,它包括:学号、姓名、性别、3门课成绩、平均成绩共5个成员。存放一个学生的信息定义一个结构体变量,要存放30个学生的信息就要定义一个结构体数组。,9,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-1 实现代码,/*LI8_1.c*/#include/*声明结构体类型*/struct student char num5;/*学号*/char name10;/*姓名*/char sex;/*性别:M

6、男,F女*/int score3;/*3门成绩*/float average;/*平均成绩*/;/*自定义函数的声明*/void enter(struct student a,int n);/*输入学生信息*/void sort(struct student a,int n);/*按平均成绩由高到低排序*/void print(struct student a,int n);/*输出学生信息*/*主函数*/int main()int n;struct student stu30;/*定义结构体数组*/printf(请输入该班学生人数n(n=30):);scanf(%d,10,解析C程序设计(第

7、2版)第8章 结构体与共用体程序设计,2023/10/17,例8-1程序(续1),/*输入函数*/void enter(struct student a,int n)int i,j,sum=0;printf(请输入%d 个学生信息(学号,姓名,性别,3门课成绩):n,n);for(i=0;in;i+)printf(请输入第%d 个学生的学号 姓名 性别:n,i+1);scanf(%s%s%c,ai.num,ai.name,/*求每个学生平均成绩*/,11,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-1程序(续2),/*选择法排序函数*/void sort

8、(struct student a,int n)int i,j,p;struct student temp;/*定义结构体变量*/for(i=0;iap.average)/*引用结构体成员*/p=j;if(p!=i)temp=ai;ai=ap;ap=temp;/*输出函数*/void print(struct student a,int n)int i,j,mc=1;/*mc表示名次*/printf(n按平均成绩排名的名次表:n);printf(学号t姓名t性别tcj1tcj2tcj3t平均成绩t名次n);for(i=0;in;i+)printf(%st%st%ct,ai.num,ai.nam

9、e,ai.sex);for(j=0;j3;j+)printf(%dt,ai.scorej);printf(%6.1ft%dn,ai.average,mc+);,12,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-1程序分析,本例程序定义了一个结构体类型student,并用它定义了包括30个元素的stu结构体数组和结构体变量temp。struct student char num5;/*学号*/char name10;/*姓名*/char sex;/*性别:M男,F女*/int score3;/*3门成绩*/float average;/*平均成绩*/;st

10、ruct student stu30;/*定义结构体数组*/struct student temp;/*定义结构体变量*/在“结构体数组元素之间交换”时,不是对结构体数组元素各成员进行交换,而是对该结构体数组元素进行整体交换。交换语句为:temp=ai;ai=ap;ap=temp;本程序涉及到结构体类型的声明、结构体变量和数组的定义、结构体成员的引用、结构体的赋值和输出等知识点。,13,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体,结构体(structure)是一个或多个相同数据类型或不同数据类型的变量集合在一个名称下的用户自定义数据类型。由于其成员的类

11、型可以不同,因此,用户必须先声明结构体类型,再根据结构体类型定义结构体变量来存放相应数据。,14,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体类型,结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型结构体类型定义格式:,15,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,声明结构体类型,例 struct student int num;char name20;char sex;int age;float score;char addr30;,结构体类型定义描述结构的组织形式,不分配内存,不能初始化

12、,结构体类型定义的作用域,16,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,使用typedef定义数据类型的别名,功能:用自定义名字为已有数据类型命名类型定义简单形式:typedef type name;,类型定义语句关键字,已有数据类型名,用户定义的类型名,例 typedef int INTEGER;,例 typedef float REAL;,类型定义后,与已有类型一样使用,例 INTEGER a,b,c;REAL f1,f2;,说明:1.typedef 没有创造新数据类型2.typedef 是定义类型,不能定义变量3.typedef 与 define 不

13、同,define typedef预编译时处理 编译时处理简单字符置换 为已有类型命名,17,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,声明一个新的类型别名的方法,1、按定义变量方法先写出定义体 如 int i;2、将变量名换成新类型名 如 int INTEGER;3、最前面加typedef 如 typedef int INTEGER;4、用新类型名定义变量 如 INTEGER i,j;,类型定义可嵌套,例 定义结构体类型 struct date int month;int day;int year;d;,例 定义结构体类型 struct date int m

14、onth;int day;int year;DATE;,例 定义结构体类型typedef struct date int month;int day;int year;DATE;,例 typedef struct club char name20;int size;int year;GROUP;typedef GROUP*PG;PG pclub;,GROUP为结构体类型PG为指向GROUP的指针类型,GROUP*pclub;struct club*pclub;,18,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量的定义,先定义结构体类型,再定义结构体变

15、量一般形式:,第一种形式,例 struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 变量名表列;,例#define STUDENT struct student STUDENT int num;char name20;char sex;int age;float score;char addr30;STUDENT stu1,stu2;,19,解析C程序设计

16、(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量的定义,定义结构体类型的同时定义结构体变量一般形式:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.变量名表列;,例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,第二种形式,20,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量的定义,第三种形式,直接定义结构体变量一般形式:,struct 类型标识符 成员名;类型标识符 成员名;.变

17、量名表列;,例 struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,用无名结构体直接定义变量,只能使用一次,不能再用该结构体定义变量名表列以外的其他变量,21,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体说明,结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期,22,解析C程序设计(第2版)第8章 结构体与共用体程序

18、设计,2023/10/17,结构体变量的引用,引用规则 结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用,成员(分量)运算符优先级:1结合性:从左向右,引用方式:结构体变量名.成员名,23,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量的初始化,形式一,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 结构体变量=初始数据;,例 struct student int num;char name20;char sex;int age;char addr30;

19、struct student stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,24,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量的初始化,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,形式二,25,解析C程序设计(第2版)第8章 结构体与共用体程序

20、设计,2023/10/17,结构体变量的初始化,struct 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,形式三,26,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-2 输出3门课平均成绩,【分析】学生的基本信息包括学号、姓名、性别、地址、3门课程成绩、平均成绩,假设这个学生的3门课程的成绩分别为数学90分、英语80分、C语言85分

21、,3门课程成绩用整型数组表示,平均成绩用浮点数表示。,27,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-2程序,/*LI8_2.c*/*声明结构体类型struct scoretype*/#include struct scoretype int score3;/*3门课成绩*/float average;/*平均成绩*/;/*声明结构体类型struct student*/typedef struct scoretype SCORE;struct student char num5;/*学号*/char name10;/*姓名*/char sex;/*性别

22、:M-男,F-女*/char*addr;/*地址*/SCORE a;/*成绩*/;typedef struct student STUDENT;,int main()int i,sum=0;STUDENT s=101,zhangjuan,F,Beijing,90,85,80,0.0;for(i=0;i3;i+)sum+=s.a.scorei;/*求总成绩*/*求平均成绩*/=sum/5.0;/*输出学生信息*/printf(num=%s,name=%s,sex=%c,addr=%s,average=%fn,s.num,s.name,s.sex,s.addr,);return 0;,28,解析C

23、程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体变量作函数参数,结构体变量作为函数的参数,系统采用“数据复制”的方式,系统开销大,影响程序的执行效率,因此一般采用结构体指针作为函数的参数。1、用结构体变量的成员作函数参数 如用:stu1.num、stu2.name2等作函数实参,将实参传给形参。用法和用普通变量作实参是一样的,属于“值传递”方式。应当注意实参与形参的类型保持一致。2、用结构体变量作函数实参 老版本的C系统不允许用结构体变量作实参,而ANSIC取消了这一限制。用结构体变量作实参时,采取的是“值传递”方式,应当注意实参与形参必须是同类型的结构体变量。由

24、于“值传递”时系统开销比较大,一般不采用这种方式。,29,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,函数的返回值为结构体类型,一个函数可以带回一个函数值,这个函数值可以是整型、实型、字符型、指针等,也可以是结构体变量或结构体指针。,30,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-3 输出学生成绩等信息,/*LI8_3.c*/#include#include#define FORMAT%st%st%fn%ft%fn/*声明结构体类型struct student*/struct student char num5;/*学

25、号*/char name10;/*姓名*/int score3;/*3门成绩*/;typedef struct student STUDENT;void print(STUDENT stu);int main()STUDENT stu;Strcpy(stu.num,106);/*给结构体成员赋值*/strcpy(stu.name,Li Lin);stu.score0=67;stu.score1=89;stu.score2=78;print(stu);return 0;void print(STUDENT stu)/*结构体变量作函数参数*/printf(FORMAT,stu.num,stu.n

26、ame,stu.score0,stu.score1,stu.score2);,31,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,思考题,例8-3只输出了一个学生的信息,如果需要输出200个学生的信息,又怎样实现呢?,32,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体数组,定义一个整型变量可以表示一个学生的某门课程的成绩,如果存储200个学生的某门课程的成绩,就必须使用具有200个元素的一维数组来处理。结构体变量只能表示一个学生(二维表中的一行)的数据,即一个学生的信息,如果要表示若干个学生(行)的数据,可以使用结构体数组

27、。结构体数组的每个元素仍是结构体类型,每个元素可以存储一个学生的数据,具有200个元素的结构体数组就可以存放200个学生信息。,33,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体数组的定义,形式一:struct student int num;char name20;char sex;int age;struct student stu2;,形式二:struct student int num;char name20;char sex;int age;stu2;,形式三:struct int num;char name20;char sex;int ag

28、e;stu2;,34,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体数组的引用,引用方式:结构体数组名下标.成员名,相同结构体变量可以相互赋值:hu=str2;str0=wu;结构体数组元素的输入输出:scanf(“%d,%s”,35,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体数组的初始化,例 struct int num;char name20;char sex;int age;stu=,;,顺序初始化:struct student int num;char name20;char sex;int age;str

29、uct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;,例 struct student int num;char name20;char sex;int age;stu=,;,36,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体数组作函数参数,结构体数组作函数参数与一般数组作函数参数一样,它是“地址传递”的。在主调函数中,只需要将结构体数组名带入即可,在被调函数中使用结构体数组的方法与主调函数一样。,37,解析C程序设计(第2版)第8章 结构体与共用体程序设计,

30、2023/10/17,例8-4 设计一个洗牌和发牌的程序,【分析】一幅扑克52张牌,分为4种花色,用H代表红桃,D代表方块,C代表梅花,S代表黑桃,每种花色又有13张牌:A、2、3、10、J、Q、K。显然,每一张牌由两个元素组成:花色和牌面,我们可以定义一个结构体表示一张牌。发牌的过程就是将52张牌按照随机顺序存放。我们可以定义一个结构体数组存放52张牌,然后用for循环排列52张牌(数组下标051),第i次循环,程序选择一个051的随机数j,然后将第i张牌和第j张牌交换,从而完成洗牌的过程。发牌的过程就是将52张牌按照随机顺序发放。,38,解析C程序设计(第2版)第8章 结构体与共用体程序设

31、计,2023/10/17,例8-4程序,/*LI8_4.c*/#include#include#include#include/*声明结构体类型*/struct card char suit2;/*花色*/char face3;/*牌面*/;typedef struct card CARD;/*自定义函数的声明*/void initcard(CARD deck,char s2,char f3);void shuffle(CARD deck);void print(CARD deck);int main()CARD deck52;/*定义一副纸牌有52张*/char s42=H,D,C,S;/*

32、花色:红H方D梅C黑S*/char f133=A,2,3,4,5,6,7,8,9,10,J,Q,K;/*牌面*/initcard(deck,s,f);/*按顺序初始化一副牌*/srand(unsigned)time(NULL);/*产生随机数的种子函数*/shuffle(deck);/*洗牌*/print(deck);/*输出发牌结果*/return 0;,39,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-4程序(续1),/*洗牌:随机产生一副牌*/void shuffle(CARD deck)int i,j;CARD temp;for(i=0;i52;

33、i+)j=rand()%52;/*产生051的随机数*/temp=decki;/*将第i张牌与第j张牌交换位置*/decki=deckj;deckj=temp;/*输出发牌结果*/void print(CARD deck)int i;for(i=0;i52;i+)/*输出一张牌的花色和牌面*/printf(%2s-%-2s,decki.suit,decki.face);printf(%c,(i+1)%4?t:n);/*条件运算符的应用*/,40,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-4程序(续2),/*按顺序初始化一副牌 H-A,H-2,H-K,D

34、-A,S-K*/void initcard(CARD deck,char s2,char f3)int i;for(i=0;i52;i+)strcpy(decki.suit,si/13);/*4种花色*/strcpy(decki.face,fi%13);/*13种牌面*/,41,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,举一反三,例8-5 计算某日是本年的第几天。【分析】一年12个月,除了2月份有闰年和非闰年相差1天外,其它月份均是不变的,1月份31天,2月份28天(闰年29天),3月份31天,4月份30天,5月份31天,6月份30天,7月份31天,8月份3

35、1天,9月份30天,10月份31天,11月份30天,12月份31天。如果当前月份在3月之后,并且该年度是闰年,则总天数加1。,42,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-5程序,/*LI8_5.c*/#include/*声明结构体类型struct date*/struct date int year;/*年*/int month;/*月*/int day;/*日*/;typedef struct date YMD;/*声明结构体别名*/*自定义函数的声明*/int countdays(YMD date);int main()YMD date;/*用

36、别名定义结构体变量*/int days;printf(Input year,month,day:);scanf(%d,%d,%d,43,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,信息打印问题,在对结构体变量进行操作的过程中,必然涉及多次访问结构体中的数据,通常的方式是使用圆点方式访问,除此之外,还可以使用指向结构体的指针来访问结构体中的数据。另外,指针还可以作为结构体的成员。例8-6 通过指针打印结构体中的信息。【分析】访问结构体成员的运算符有两种,一种是前面使用的圆点运算符“.”,还有一种是指向运算符“-”,它通过指向结构体的指针访问结构体的成员。,44,

37、解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-6实现代码,/*LI8_6.c*/#include/*声明结构体类型struct card*/struct card char*face;/*牌面*/char*suit;/*花色*/;typedef struct card CARD;/*声明结构体别名*/int main()CARD a;/*定义结构体变量*/CARD*aptr;/*定义结构体指针*/*分别给结构体成员赋值*/a.face=Ace;/*A*/a.suit=“Spades”;/*黑桃*/aptr=,本例程序中使用了aptr-face和(*aptr

38、).face两种新的方式访问结构体成员。这里涉及到指向结构体的指针知识点。,45,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,结构体中的指针,在结构体中定义指针和定义其他的一般变量的方式是一样的,使用的情况也一样,比如如果要在学生结构体中增加一个数据成员表示地址,可以定义如下:struct student int num;char*name;char sex;float score;,46,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,指向结构体变量的指针,如果通过指向结构体的指针访问上面定义的结构体student的各个数据成员

39、,代码如下 struct student stu;/*定义结构体变量*/struct student*p;/*定义结构体指针*/p=/*指针指向变量赋值方式*/这时使用p访问结构体中的变量有两种方式均:p-num 或(*p).num/*与stu.num等价*/p-name或(*p).name/*与stu.name等价*/其中:符号“-”为指向结构体成员运算符,其级别最高,结合方向从左到右。,47,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-7,/*LI8_7.c*/#include struct student char num5;char*name;c

40、har sex;float score;typedef struct student STUDENT;int main()STUDENT zhang=111,Zhang hua,M,88.5;STUDENT*pname;/*结构体指针*/pname=,48,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,指向结构体数组的指针,前面已经介绍,可以用指针指向数组或数组元素。同样,可以用指针指向结构体数组及其元素,其定义格式与指向结构体指针相同,其值为结构体数组的首地址。指向结构体数组的指针实际上与前面定义的指向二维数组的指针类似,可以理解为二维数组的行指针。,49,解

41、析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-8,/*LI8_8.c*/#include struct student char num5;char name10;char sex;int age;typedef struct student STUDENT;int main()STUDENT stu3=106,Li Lin,M,18,107,Zhang Fun,M,19,108,Wang Min,F,20;STUDENT*p;for(p=stu;pnum,p-name,p-sex,p-age);return 0;,50,解析C程序设计(第2版)第8章 结构

42、体与共用体程序设计,2023/10/17,举一反三,例8-9 已知学生的信息包括学号和成绩,求10名学生中成绩最高的学生信息。【分析】可以定义一个结构体数组存放学生信息,然后使用结构体指针方式求出最高成绩的学生信息。,/*LI8_9.c*/#include struct student char num5;/*学号*/int score;/*成绩*/;typedef struct student STU;int main()STU stu10=101,81,102,89,103,86,104,71,105,78,106,90,107,88,108,78,109,77,110,69;STU*p=

43、NULL;/*定义结构体指针变量,并赋空指针*/int i=0;printf(The original data is:n);for(i=0;iscorenum,p-score);/*输出最高分的学生信息*/return 0;,51,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-10 围着一圈报数问题,例8-10 13个人围成一圈,从第1个人开始顺序循环报数1、2、3,凡报到“3”者退出圈子。找出留在圈子中的人原来的序号。【分析】定义一个结构体表示围成一圈的人的信息,凡报3退出者,其序号赋为0,其余的人员的序号重新调整。,52,解析C程序设计(第2版)第8

44、章 结构体与共用体程序设计,2023/10/17,例8-10程序,/*LI8_10.c*/#include#define N 30struct person int number;/*当前人员的序号*/int nextp;/*下一个人的序号*/;typedef struct person PERSON;void init(PERSON link,int n);void number(PERSON link,int n,int m);void print(PERSON link,int n);int main()PERSON linkN+1;/*数组下标从1开始*/int n,m;printf(

45、Input person n(n=30):);scanf(%d,53,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-10程序(续1),/*报数并退出报m的人*/void number(PERSON link,int n,int m)int h=n,i,count=0;printf(sequence that persons leave the circle:n);while(countn-1)i=0;while(i!=m)h=linkh.nextp;/*h是当前人员的下一个人员编号*/if(linkh.number)/*未退出人员*/i+;/*报数计数:1

46、、2、m*/printf(%4d,linkh.number);/*输出退出人员编号*/linkh.number=0;/*退出后序号赋0值*/count+;/*退出人员计数*/,54,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,例8-10程序(续2),/*初始化函数*/void init(PERSON link,int n)int i;for(i=1;i=n;i+)linki.number=i;/*给每个人赋一个顺序号*/if(i=n)linki.nextp=1;/*如果是最后一个人,则下一个人就是第一个*/else linki.nextp=i+1;/*当前人员

47、的编号加1就是下一个人的编号*/*输出留下人员的号码*/void print(PERSON link,int n)int i;printf(nThe last one is:);for(i=1;i=n;i+)if(linki.number)printf(%3d,linki.number);,程序的运行结果如下:Input person n(n=30):13Input number m(m=5):3sequence that persons leave the circle:3 6 9 12 2 7 11 4 10 5 1 8The last one is:13,55,解析C程序设计(第2版)第

48、8章 结构体与共用体程序设计,2023/10/17,思考题,例8-10定义了一个可容纳31个结构体变量的数组,凡是报3的人退出,且将其序号置0,在以后报数时,凡是序号为0的就不报了。这样事先分配内存空间非常浪费,能不能在需要的时候再分配内存空间呢?13个人围成一圈,那么可否在结构体成员中定义一个指针来指向下一个人的数据呢?,若干人围成圈的问题是著名的约瑟夫环(Josephus)问题,下面介绍更有效的解决方案。,56,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,约瑟夫环问题,前面定义的数组大小都是固定的,但在实际应用中,数组的大小可能无法确定,因此只能将数组设置

49、偏大,这样造成空间浪费。C语言提供了动态内存分配机制,下面通过约瑟夫环问题来了解动态内存分配机制。例8-11 约瑟夫环问题。一群小孩(假设n个)围成一圈,任意假定一个数m,从第一个小孩起,顺时针方向数,每数到第m个小孩时,该小孩便离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩便是胜利者。问题是,究竟第几个小孩是胜利者?,57,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/17,问题分析,在这个问题中,小孩围成圈,最好用环链表来表达。一个结构体变量可以表示一个小孩,但是怎样表示小孩之间的前后关系呢?指针可以记录数据项之间的关系,在一个数据的内部表示中包含指向下一

50、个数据项的指针,从而说明这两个数据项之间有概念上的顺序关系。结构体成员可以是除自身类型外的任何数据类型变量,但可以是自身类型指针变量。在结构体中定义一个指向自身的指针成员(称为自引用结构体),声明如下:struct jose int code;/*当前小孩的编号*/struct jose*next;/*指向下一个小孩的指针*/;若干个这样的结点就构成了小孩的链表,数小孩即在循环链表中依次遍历结点,小孩的离开即将该小孩结点从链表中删除。如此循环,直到只剩最后一个,该结点自己指向自己。此时,该结点代表的小孩就是胜利者。,58,解析C程序设计(第2版)第8章 结构体与共用体程序设计,2023/10/

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号