第10章结构体与链表.ppt

上传人:hyn****60 文档编号:70381262 上传时间:2023-01-19 格式:PPT 页数:61 大小:2.65MB
返回 下载 相关 举报
第10章结构体与链表.ppt_第1页
第1页 / 共61页
第10章结构体与链表.ppt_第2页
第2页 / 共61页
点击查看更多>>
资源描述

《第10章结构体与链表.ppt》由会员分享,可在线阅读,更多相关《第10章结构体与链表.ppt(61页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、上页上页 下页下页节节末页末页结束结束问题及作业说明:问题及作业说明:9.2 将输入字符串将输入字符串(有效字符有效字符)按逆序复制到字符串按逆序复制到字符串str1。按题意按题意原字符串似不应改变原字符串似不应改变,使用库函数要明确其详细,使用库函数要明确其详细功能(查功能(查baidu或测试)或测试),且不使用标准库函数也要会。且不使用标准库函数也要会。#include#includeint strReverse(char*str1,char*str2)char*p;p=strrev(str2);/翻转str2并返回首址 strcpy(str1,p);return strlen(str1)

2、;void main()char str1100,str2100;/必须是数组必须是数组 int length;gets(str2);length=strReverse(str1,str2);puts(str2);puts(str1);printf(“%d”,length);/按此程序源串也被反转!int strReverse(char*str1,char*str2)char*p=str2;int count=0;while(*p!=0)+p;/定位结束符 -p;/指向最末一个字符 while(p=str2)/从后向前逐个拷贝*str1=*p;+count;+str1;-p;*str1=0;/

3、注意注意str1当前位置与当前位置与0 return count;/较调用strlen高效!上页上页 下页下页节节末页末页结束结束问题及作业说明:问题及作业说明:作业作业9.3 字符串连接字符串连接.其一不应引入新数组其一不应引入新数组str3,其二注,其二注意意0的处理,其三,测试时注意字符数组的长度的处理,其三,测试时注意字符数组的长度int strCatch(char*str1,char*str2)int count=0;while(*str1!=0)+str1;+count;while(*str2!=0)*str1=*str2;count+;+str1;+str2;*str1=0;re

4、turn count;#includeint strCatch(char*str1,char*str2)int count=0;while(*str1)+str1;+count;while(*str1+=*str2+)+count;return count;void main()char str1200,str2100;/注意长度注意长度 int length;gets(str1);gets(str2);length=strCatch(str1,str2);puts(str1);puts(str2);printf(%d,length);上页上页 下页下页节节末页末页结束结束作业作业9.4 9.

5、4 字符串裁剪字符串裁剪/裁剪尾部空格或制表符和换行符裁剪尾部空格或制表符和换行符int trim(char*str)int count=0;while(*str)+str;+count;-str;while(*str=|*str=t|*str=n)-str;-count;*(str+1)=0;return count;/裁剪头部和尾部空格裁剪头部和尾部空格制表符和换行符制表符和换行符int ntrim(char*str)char*first=str,*last;int count=0;while(*first=|*first=t|*first=n)+first;last=first;whil

6、e(*last)+last;-last;while(*last=|*last=t|*last=n)-last;*(last+1)=0;while(first”引用结构体变量的成员。引用结构体变量的成员。struct student stu,*p=&stu;p-num=10001;scanf(%s,p-name);scanf(%f,&p-score);printf(age of%s is%d,stu.name,age);(4)将结构体变量作为一个整体将结构体变量作为一个整体取地址或赋值取地址或赋值。如。如struct student stu1,stu2,*p=&stu1;stu2=stu1;pr

7、intf(“%X,%X,p,&stu2);“(*p).成员名成员名”、“p-成员成员名名”与与“stu.成员名成员名”等价,等价,后两种更直观后两种更直观 成员运算符成员运算符“.”与指向运与指向运算符算符“-”的优先级同,高于指的优先级同,高于指针运算符针运算符*u不能将结构体变量当作一个不能将结构体变量当作一个整体进行输入、输出或整体进行输入、输出或“赋值赋值”struct date date1,date2;date1=1988,8,5;scanf(“%d%d%d”,&date2);printf(%d%d%d,date2);【思考思考】“(*p).成员名成员名”中的圆中的圆括号能否省略?括

8、号能否省略?上页上页 下页下页节节末页末页结束结束3 3结构体变量的初始化结构体变量的初始化定义结构体变量的同时依次写出全部或部分成员变量的初始值。如定义结构体变量的同时依次写出全部或部分成员变量的初始值。如:struct student stu1=1001,Zhang San,M,1988,8,10,580;struct student stu2=1002,Li Ping,F,1989,2,5,595;struct student stu3=1002,“Li Ping”,F,1989;/其余默认零其余默认零【说明说明】初始化前,结构体变量各成员的取值是随机的。初始化前,结构体变量各成员的取值

9、是随机的。花括号内初值的顺序、类型要与结构体成员的顺序和类型一致。花括号内初值的顺序、类型要与结构体成员的顺序和类型一致。【注意注意】初始化时,花括号内的数据不能包含变量。如以下程序片段的初始化时,花括号内的数据不能包含变量。如以下程序片段的最后一行不正确:最后一行不正确:struct date int year;int month;int day;date1=1988,8,10;struct studentint num;char name20;char sex;struct date birthday;float score;stu=10010,zhangsan,M,date1,580;上

10、页上页 下页下页节节末页末页结束结束10.1.3 10.1.3 结构体程序举例结构体程序举例l例例10.1 输入一个学生的信息并显示。输入一个学生的信息并显示。#includevoid main()struct dateint year;int month;int day;struct studentint num;char name20;char sex;struct date birthday;float score;struct student stu;scanf(%d,&stu.num);scanf(%s,stu.name);scanf(“%c”,&stu.sex);/%c前有一空格前

11、有一空格,若上一句是若上一句是gets(stu.name)则不必!则不必!scanf(%d%d%d,&stu.birthday.year,&stu.birthday.month,&stu.birthday.day);scanf(%f,&stu.score);printf(学号学号%dn姓名姓名%sn性别性别%cn生日生日%d年年%d月月%d日日n成绩成绩%.1fn,stu.num,stu.name,stu.sex,stu.birthday.year,stu.birthday.month,stu.birthday.day,stu.score);上页上页 下页下页节节末页末页结束结束例例10.21

12、0.2函数函数inputinput中输入一学生的信息,函数中输入一学生的信息,函数listlist中显示中显示#includestruct date int year;int month;int day;struct studentint num;char name20;char sex;struct date birthday;float score;struct student input()struct student stu;printf(“请输入学生学号请输入学生学号:”);/后文提示略后文提示略scanf(%d,&stu.num);scanf(%s,stu.name);scanf(

13、%c,&stu.sex);scanf(%d%d%d,&stu.birthday.year,&stu.birthday.month,&stu.birthday.day);scanf(%f,&stu.score);return(stu);void list(struct student stu)printf(学号学号:%dn姓名姓名:%sn性别性别:%cn出生日期出生日期:%d年年%d月月%d日日n 成绩成绩:%6.1fn,stu.num,stu.name,stu.sex,stu.birthday.year ,stu.birthday.month,stu.birthday.day,stu.scor

14、e);void main()struct student stu;stu=input();list(stu);3个函数中个函数中stu对应对应内存空间是否相同?内存空间是否相同?将结构体类型定义将结构体类型定义放到放到main函数如何函数如何?上页上页 下页下页节节末页末页结束结束例例10.310.3用指针作参数输出结构体数组内的学生信息用指针作参数输出结构体数组内的学生信息#includestruct student int num;char name20;float score;void print(struct student*p)int i;printf(学号学号 姓名姓名 成绩成绩n

15、);for(i=0;inum,p-name,p-score);void main()struct student stu3=101,li,583,102,wu,590,103,han,560;void print(struct student*);print(stu);教材图教材图10.4中算法与程序不符中算法与程序不符区分区分p-num+;(p+)-num;(+p)-num上页上页 下页下页节节末页末页结束结束例例10.410.4多人通过输入候选人姓名投票多人通过输入候选人姓名投票,统计各候选人票数统计各候选人票数#include#include#define N 3#define M 11

16、void main()struct personchar name20;int count;leaderN=zhangsan,0,lisi,0,wangwu,0;int i,j;char name20;for(i=0;iM;i+)printf(请输入候选人姓名:请输入候选人姓名:n);gets(name);for(j=0;jN;j+)if(strcmp(leaderj.name,name)=0)leaderj.count+;for(i=0;iN;i+)printf(%8s:%dn,leaderi.name,leaderi.count);结构体数组初始化的方式?结构体数组初始化的方式?上页上页

17、下页下页节节末页末页结束结束例例10.510.5输入学生学号姓名及成绩输入学生学号姓名及成绩,求平均分与最高分学生信息求平均分与最高分学生信息struct studentint num;char name20;float score;void input(struct student stu);float aver(struct student stu)int search(struct student stu)void list(struct student student1)void main()struct student stuN;float average;int max;input

18、(stu);average=aver(stu);max=search(stu);printf(平均成绩为%6.2fn,average);printf(最高分学生为:n);list(stumax);上页上页 下页下页节节末页末页结束结束作业作业:l10.1l10.2l10.3l10.4上页上页 下页下页节节末页末页结束结束回顾:回顾:l结构体变量结构体变量+结构体类型结构体类型+结构体成员引用结构体成员引用+结构体作函结构体作函数参数数参数+结构体指针结构体指针+结构体数组结构体数组lP276input函数中输入姓名函数中输入姓名scanf(“%s”,&stusi.name)?#includes

19、truct Student int num;char name20;float score;/分号!分号!void print(struct Student*p)int i;printf(学号学号 姓名姓名 成绩成绩n);for(i=0;inum,p-name,p-score);/-是是(*).的缩写,如的缩写,如(*p).num (*p).namevoid main()struct student stus3=101,li,583,102,wu,590,103,han,560;print(stus);上页上页 下页下页节节末页末页结束结束10.2 10.2 链表链表引言引言:数组元素存储在一

20、片连续的内存单元中,从而给数组带来:数组元素存储在一片连续的内存单元中,从而给数组带来两方面问题:其一,个数不确定时需定义一个两方面问题:其一,个数不确定时需定义一个最大长度最大长度;其二,;其二,向数组增加或删除一个数据时,需要向数组增加或删除一个数据时,需要移动大量元素移动大量元素。链表链表:一种动态地进行存储分配的数据结构,不需要事先确定最:一种动态地进行存储分配的数据结构,不需要事先确定最大长度,在插入或者删除一个元素时也不会引起大量数据的移动大长度,在插入或者删除一个元素时也不会引起大量数据的移动要求要求:掌握链表掌握链表结构、链表的定义与链表的创建结构、链表的定义与链表的创建/插入

21、插入/删除删除/输出输出head/L上页上页 下页下页节节末页末页结束结束1 1、链表结构、链表结构【结构结构】“首首”结点结点+“尾尾”结点结点+中间结点中间结点,每个结点包括两部,每个结点包括两部分:一部分是用户需要用的实际数据,称为分:一部分是用户需要用的实际数据,称为数据域;数据域;另一部分是另一部分是下一个结点的地址,称为下一个结点的地址,称为指针域指针域。头指针头指针head指向链表的首结点,指向链表的首结点,首结点与中间结点的指针域指向后继结点首结点与中间结点的指针域指向后继结点,表尾结点的指针域存放表尾结点的指针域存放空地址(常表示为空地址(常表示为NULL,是值为,是值为0的

22、符号常量的符号常量,编程时需先定义)。编程时需先定义)。【说明说明】(1)链表中各元素在内存中的存储单元通常不连续)链表中各元素在内存中的存储单元通常不连续(2)查找链表结点必须从头指针开始顺序访问至找到或到表尾)查找链表结点必须从头指针开始顺序访问至找到或到表尾(NULL不可缺!不可缺!),不如数组快!不如数组快!(3)头指针至关重要,可标识或者代表整个单链表,)头指针至关重要,可标识或者代表整个单链表,声明链表实声明链表实际就是声明一个基类型为结点类型的头指针际就是声明一个基类型为结点类型的头指针head/L上页上页 下页下页节节末页末页结束结束2 2、链表的定义、链表的定义AE EB B

23、C CD DL Lstruct student int num;char name20;float score;struct student*next;struct student stuA;struct student*head,*L,*p;stuA.num=101;stuA.next=NULL;head=&stuA;/L=&stu;p=head;printf(“%d”,p-num);struct LNode/表结点表结点 char data;/数据域数据域 struct LNode*next;/指针域指针域;Strcut LNode node1,node2;/定义两表结点定义两表结点str

24、uct LNode*La,*Lb;/定义两链表定义两链表/或或typedef struct LNode LNode/typedef struct LNode*LinkList;/LNode node1,node2;LinkList La,Lb;上页上页 下页下页节节末页末页结束结束p链表的分类链表的分类分类分类:创建链表结点有两种方式:其一,使用结构体变:创建链表结点有两种方式:其一,使用结构体变量或数组元素充当结点;其二,在程序执行过程中量或数组元素充当结点;其二,在程序执行过程中动态动态开辟结点开辟结点。第一种方式创建的链表称为。第一种方式创建的链表称为静态链表静态链表,第二,第二种方式创

25、建的链表称为种方式创建的链表称为动态链表动态链表。特点特点:静态链表各结点所占用的存储空间在程序执行完:静态链表各结点所占用的存储空间在程序执行完毕后由系统释放;动态链表可在程序执行过程中调用动毕后由系统释放;动态链表可在程序执行过程中调用动态存储分配函数释放;后者更灵活态存储分配函数释放;后者更灵活适用范围适用范围:链表长度固定且结点个数较少时通常使用:链表长度固定且结点个数较少时通常使用“静态链表静态链表”,其它情况用动态链表,其它情况用动态链表动态链表操作动态链表操作:创建创建+输出输出+删除删除+插入插入上页上页 下页下页节节末页末页结束结束静态链表示例静态链表示例eg10.6eg10

26、.6含三个学生的静态链表含三个学生的静态链表#includestruct studentint num;char name20;float score;struct student*next;void main()struct student a=10011,zhangsan,592,b=10012,lisi,581,c=10013,wangwu,656;struct student*L,*p;/教材中教材中L一律用一律用headL=&a;a.next=&c;c.next=&b;b.next=NULL;for(p=L;p!=NULL;p=p-next)printf(%5d%8s%6.1fn,p

27、-num,p-name,p-score);用数组构造静态链表也可:struct student stus=.,.,.;struct student*L=stus;stus0.next=&stus2;stus2.next=&stus1;如何”顺序“输出?上页上页 下页下页节节末页末页结束结束动态链表示例动态链表示例动态创建三个结点构造链表动态创建三个结点构造链表#includestruct studentint num;char name20;float score;struct student*next;void main()struct student*L,*p;p=(struct stud

28、ent*)malloc(sizeof(struct student);scanf(“%d%s%f”,&p-num,p-name,p-score);p-next=NULL;L=p;p=(struct student*)malloc(sizeof(struct student);scanf(“%d%s%f”,&p-num,p-name,p-score);p-next=NULL;L-next=p;for(p=L;p!=NULL;p=p-next)printf(%5d%8s%6.1fn,p-num,p-name,p-score);如何创建n个结点的动态链表?上页上页 下页下页节节末页末页结束结束3 3

29、、链表基本操作、链表基本操作动态创建动态创建思路:共循环思路:共循环n次,每次循环开辟一个结次,每次循环开辟一个结点,并令点,并令p1指向该新结点,把指向该新结点,把p1所指向所指向的结点连接到当前表尾结点(的结点连接到当前表尾结点(p2)的后)的后面。面。若首次开辟则让表名或头指针指向若首次开辟则让表名或头指针指向首结点首结点,此外注意新结点指针域的赋值此外注意新结点指针域的赋值上页上页 下页下页节节末页末页结束结束eg10.7eg10.7设计函数创建含设计函数创建含n n个顶点的链表个顶点的链表#include#include#define LEN sizeof(struct studen

30、t);struct student*create(int n)struct student*head=NULL,*p1,*p2;int i;for(i=1;inum,&p1-score);p1-next=NULL;/注意!注意!if(i=1)head=p1;p2=p1;elsep2-next=p1;p2=p1;return(head);上页上页 下页下页节节末页末页结束结束3 3、链表基本操作、链表基本操作-输出输出#includevoid print(struct student*head)struct student*p=head;while(p!=NULL)/只要只要p不空不空,用用fo

31、r更不容易出错更不容易出错 printf(学号学号:%d 成绩成绩:%3fn,p-num,p-score);p=p-next;/p+可否?可否?上页上页 下页下页节节末页末页结束结束3 3、链表的基本操作、链表的基本操作-删除删除(指定学号的学生结点指定学号的学生结点)p思路思路:定位需删除结点及其前驱,修改前驱结点指针进行删除定位需删除结点及其前驱,修改前驱结点指针进行删除p定位定位:设指针设指针prePtr和和curPtr,只要只要curPtr还指向一个结点且指还指向一个结点且指向的结点的学号不符合要求则两个指针均后移向的结点的学号不符合要求则两个指针均后移。循环结束后。循环结束后若若cu

32、rPtr为为NULL说明未找到,否则说明找到。说明未找到,否则说明找到。struct student*ListDelete(struct student*head,int num)/删除指定学号的学生结点,删除指定学号的学生结点,返回删除该结点后的链表的头指针返回删除该结点后的链表的头指针struct student*prePtr=NULL,*curPtr=head;while(curPtr!=NULL&curPtr-num!=num)/常用技巧常用技巧,注意短路运算注意短路运算prePtr=curPtr;/注意改错,不能写成注意改错,不能写成prePtr=prePtr-nextcurPtr=

33、curPtr-next;if(curPtr=NULL)printf(学号为学号为%d的学生不存在的学生不存在n,num);elseif(curPtr=head)head=curPtr-next;free(curPtr);/注意及时释放注意及时释放else prePtr-next=curPtr-next;free(curPtr);/删除尾结点也可删除尾结点也可printf(学号为学号为%d的学生已被删除的学生已被删除n,num);return(head);/教材教材:只要只要curP非所寻且未到尾结点则继续非所寻且未到尾结点则继续,循环结束后看循环结束后看有没有找到有没有找到上页上页 下页下页节

34、节末页末页结束结束3 3、链表基本操作、链表基本操作删除删除2-2-教材教材只要只要curP非所寻且未到尾结点则继续非所寻且未到尾结点则继续,循环结束后看循环结束后看有没有找到有没有找到若中间找到则若中间找到则curP-num=num;若中间没找到则不等若中间没找到则不等上页上页 下页下页节节末页末页结束结束例例10.910.9写函数删除指定学号的学生写函数删除指定学号的学生,头指针和学号作参数头指针和学号作参数struct student*del(struct student*head,int num)/删除指定学号的学生结点,删除指定学号的学生结点,返回删除该结点后的链表的头指针返回删除该

35、结点后的链表的头指针struct student*p1,*p2;if(head=NULL)printf(原表为空!原表为空!n);return(NULL);elsep1=head;while(p1-num!=num&p1-next!=NULL)/常用技巧!常用技巧!p2=p1;p1=p1-next;if(p1-num=num)if(p1=head)head=p1-next;elsep2-next=p1-next;printf(学号为学号为%d的学生已被删除的学生已被删除n,num);elseprintf(学号为学号为%d的学生不存在的学生不存在n,num);return(head);注意对比,

36、教材程序需单独处理空表.函数返回类型能否空?上页上页 下页下页节节末页末页结束结束3 3、链表的基本操作、链表的基本操作-插入插入(指定学号的学生结点)指定学号的学生结点)p思路思路:定位第一个大于待插入学生的结点定位第一个大于待插入学生的结点,修改其前驱结点指针修改其前驱结点指针p定位定位:设指针设指针prePtr和和curPtr,只要只要curPtr还指向一个结点且所指还指向一个结点且所指结点学号不比结点学号不比num大则两指针都后移大则两指针都后移。循环结束后通常插入到。循环结束后通常插入到prePtr后即可后即可,但但prePtr为为NULL除外,说明插入到表头除外,说明插入到表头p注

37、意:注意:分析有等值结点时的插入情况!分析有等值结点时的插入情况!p教材教材:curP逐个遍历并比较到尾结点停逐个遍历并比较到尾结点停,循环结束后看循环结束后看curPtr所所指结点的学号是否比待插入结点的学号大,是则插入其前指结点的学号是否比待插入结点的学号大,是则插入其前(此处此处还要看是否插入到表头还要看是否插入到表头),否则插入到表尾之后。,否则插入到表尾之后。struct student*ListInsert(struct student*head,struct student*q)/插入指定学号的学生使仍然有序,插入指定学号的学生使仍然有序,返回插入该结点后链表的头指针返回插入该结

38、点后链表的头指针struct student*prePtr=NULL,*curPtr=head;while(curPtr!=NULL&curPtr-num num)/常用技巧常用技巧,注意短路注意短路prePtr=curPtr;/注意改错,不能写成注意改错,不能写成prePtr=prePtr-nextcurPtr=curPtr-next;if(prePtr=NULL)q-next=head;head=q;else prePtr-next=q;q-next=curPtr;/无论是否插入到表尾均可无论是否插入到表尾均可return(head);/按此算法即使原表为空也不必特殊处理按此算法即使原表为

39、空也不必特殊处理,上例也如此!教材算法不可,上例也如此!教材算法不可上页上页 下页下页节节末页末页结束结束3 3、链表基本操作、链表基本操作在特定位置插入结点在特定位置插入结点只要只要curP非所寻且未到非所寻且未到尾结点则继续尾结点则继续,循环结循环结束后看束后看有没有找到有没有找到:若中间找到则若中间找到则curP-nump0-num;若中若中间没找到则此式不成立间没找到则此式不成立上页上页 下页下页节节末页末页结束结束例例1010链表结点按学号小到大排列,插入新结点使仍有序链表结点按学号小到大排列,插入新结点使仍有序struct student*insert(struct student

40、*head,struct student*stud)struct student*p0,*p1,*p2;p0=stud;p1=head;if(head=NULL)/*原链表为空则将新结点作为头结点处理原链表为空则将新结点作为头结点处理*/head=p0;p0-next=NULL;elsewhile(p0-nump1-num)&(p1-next!=NULL)p2=p1;p1=p1-next;if(p0-numnum)if(head=p1)head=p0;elsep2-next=p0;p0-next=p1;elsep1-next=p0;p0-next=NULL;return(head);试简化该算

41、法,如尾结点统一化处理,只用一个指针变量,引入头结点,在指定位置插入上页上页 下页下页节节末页末页结束结束回顾回顾基本操作的综合测试基本操作的综合测试void main()struct student*head,*q;int n,k;printf(请输入学生个数请输入学生个数:n);scanf(%d,&n);printf(请按学号输入各学生的信息请按学号输入各学生的信息:n);head=create(n);/注意返回值类型注意返回值类型printf(原链表为原链表为:n);print(head);printf(输入要删除学生的学号输入要删除学生的学号:n);scanf(%d,&k);head=

42、ListDelete(head,k);/注意返回值类型注意返回值类型printf(删除后链表为删除后链表为:n);print(head);q=(struct student*)malloc(sizeof(struct student);printf(输入欲插入学生的学号及成绩输入欲插入学生的学号及成绩n);scanf(%d%f,&q-num,&q-score);head=ListInsert(head,q);/注意返回值类型注意返回值类型printf(插入后链表为插入后链表为:n);print(head);上页上页 下页下页节节末页末页结束结束实验报告:实验报告:l实验实验11 指针的应用指针

43、的应用l实验目的:实验目的:掌握用指针进行字符串操作的方法掌握用指针进行字符串操作的方法l实验内容:实验内容:9.4 三个三个Trim函数函数要求:写出代码,给出调试说明和总结要求:写出代码,给出调试说明和总结上页上页 下页下页节节末页末页结束结束实验报告:实验报告:l实验实验12 结构体结构体l实验目的:实验目的:1.掌握结构体类型与结构体变量的定义、引用和初始化方掌握结构体类型与结构体变量的定义、引用和初始化方法法2.掌握结构体数组的相关操作掌握结构体数组的相关操作l实验内容:实验内容:作业本上作业本上3 4题写入实验报告题写入实验报告要求写出代码并给出调试说明和总结要求写出代码并给出调试

44、说明和总结上页上页 下页下页节节末页末页结束结束实验报告:实验报告:l实验实验13 链表链表l实验目的:实验目的:1.理解链表的概念和定义理解链表的概念和定义2、掌握链表的基本操作、掌握链表的基本操作l实验内容:实验内容:5 6 8要求写出代码并给出调试说明和总结要求写出代码并给出调试说明和总结为验证正确性需事先将教材中创建链表、为验证正确性需事先将教材中创建链表、输出链表的函数调试好输出链表的函数调试好上页上页 下页下页节节末页末页结束结束l实验实验14 文件的使用文件的使用l实验实验15 综合性实验综合性实验上页上页 下页下页节节末页末页结束结束10.3 10.3 共用体共用体例例10.1

45、2 某门课程,部分学生选修,某门课程,部分学生选修,部分学生必修。对选修学生按等级部分学生必修。对选修学生按等级制打分,分制打分,分ABCDE五级,对必修五级,对必修课学生按百分制打分。定义图示的课学生按百分制打分。定义图示的结构体数组,之后输入输出结构体数组,之后输入输出struct Stdent int num;char name20;char optional;float scoreMark;char scoreGrade;/若若optional为为T/缺点:空间浪费缺点:空间浪费方案一方案一:对于对于score设置设置scoreMark和和scoreGrade两个成员两个成员方案二方案

46、二:两者占用同一段内存两者占用同一段内存,通过通过score.mark或或score.grade访问访问union Score float mark;char grade;struct Stdent int num;char name20;char optional;union Score score;struct student stuN;for(i=0;iN;i+)scanf(%c,&stui.optional);if(stui.optional=T)scanf(%c,&stui.score.grade);else scanf(%f,&stui.score.mark);上页上页 下页下页节

47、节末页末页结束结束例例10.2 10.2 代码代码#include#define N 3void main()struct student stuN;int i;printf(请输入请输入%d个学生的信息个学生的信息:n,N);printf(学号学号 姓名姓名 是否选修是否选修 成绩成绩n);for(i=0;iN;i+)scanf(%d%s%c,&stui.num,stui.name,&stui.optional);if(stui.optional=T)scanf(%c,&stui.score.grade);elsescanf(%f,&stui.score.mark);for(i=0;iN;i

48、+)printf(%d号号%s,stui.num,stui.name);if(stui.optional=T)printf(选修选修,成绩成绩%cn,stui.score.grade);elseprintf(必修必修,成绩成绩%5.1fn,stui.score.mark);union Score float mark;char grade;struct Stdent int num;char name20;char optional;union Score score;上页上页 下页下页节节末页末页结束结束共用体基本概念:共用体基本概念:共用体共用体:使多个类型相同或不同的成员变量占用同一段内

49、:使多个类型相同或不同的成员变量占用同一段内存的结构。它与结构体类似,都属于构造数据类型,都由存的结构。它与结构体类似,都属于构造数据类型,都由若干类型可以互不相同的成员组成。不同的是,结构体变若干类型可以互不相同的成员组成。不同的是,结构体变量的各个成员拥有自己独立的存储单元,而共用体变量的量的各个成员拥有自己独立的存储单元,而共用体变量的各个成员各个成员“共用共用”一段内存,该内存段允许各成员在不同一段内存,该内存段允许各成员在不同的的地方地方分别起作用。更有效利用内存分别起作用。更有效利用内存u共用体变量所占存储空间不是全部成员变量空间之和,而共用体变量所占存储空间不是全部成员变量空间之

50、和,而是各成员空间中的最大值是各成员空间中的最大值。u共用体各成员变量的存储空间相互覆盖,一个成员值的改共用体各成员变量的存储空间相互覆盖,一个成员值的改变会影响其他成员(变会影响其他成员(但实际不会出问题,因同一结构体变但实际不会出问题,因同一结构体变量中只有一个有意义。量中只有一个有意义。union Score score;/内存内容随机内存内容随机score.mark=0;printf(“%c”,score.grade);上页上页 下页下页节节末页末页结束结束共用体语法:共用体语法:共用体类型定义共用体类型定义union UNodechar c;short i;float f;node1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁