[2017年整理]C语言 结构体与链表

上传人:豆浆 文档编号:910020 上传时间:2017-05-21 格式:DOC 页数:32 大小:1.14MB
返回 下载 相关 举报
[2017年整理]C语言  结构体与链表_第1页
第1页 / 共32页
[2017年整理]C语言  结构体与链表_第2页
第2页 / 共32页
[2017年整理]C语言  结构体与链表_第3页
第3页 / 共32页
[2017年整理]C语言  结构体与链表_第4页
第4页 / 共32页
[2017年整理]C语言  结构体与链表_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《[2017年整理]C语言 结构体与链表》由会员分享,可在线阅读,更多相关《[2017年整理]C语言 结构体与链表(32页珍藏版)》请在金锄头文库上搜索。

1、CHAPTER 10第 10 章结构体与共用体学习目标 本章主要介绍结构体的定义和使用方法,然后介绍链表的概念和相关操作,最后介绍两种新的数据类型共用体和枚举。通过本章的学习,需要掌握结构体的概念与结构体类型的定义方法,熟练掌握结构体变量的定义、引用和初始化方法,掌握链表的概念,熟练掌握链表的相关操作,了解共用体和枚举的概念及其使用方法。实际问题中,经常需要对一些类型不同但又相互关联的数据进行处理。比如,对一个学生而言,他的学号(num)、姓名( name)、性别(sex )、年龄(age )、成绩(score)等数据都与该学生有联系。如果将 num、name、 sex、age、score分别

2、定义成相互独立的简单变量,则无法反映它们之间的内在联系;又因为这些数据彼此类型不同,而数组只能对同种类型的成批数据进行处理,所以,此时也无法使用数组。这就需要有一种新的数据类型,它能将具有内在联系的不同类型的数据组合成一个整体,在C语言里,这种数据类型就是“结构体”。结构体属于构造数据类型,它由若干成员组成,成员的类型既可以是基本数据类型,也可以是构造数据类型,而且可以互不相同。由于不同问题需要定义的结构体中包含的成员可能互不相同,所以,C语言只提供定义结构体的一般方法,结构体中的具体成员由用户自己定义。这样,编程人员可以根据实际需要定义各种不同的结构体类型。10.1 结 构 体结构体遵循“先

3、定义后使用”的原则,其定义包含两个方面,一是定义结构体类型;二是定义该结构体类型的变量。第 10 章结构体与共用体 210.1.1 结构体类型的定义 格式:struct 结构体类型名类型1 成员名1;类型2 成员名2;类型n 成员名n;功能:定义一种结构体类型。例如,图10.1所示结构体类型可有如下定义:birthdaynum name sexyear month day score图 10.1 struct student 结构体类型组织结构图struct dateint year;int month;int day;struct studentint num;char name20;cha

4、r sex;struct date birthday;float score;【说明】 “结构体类型名”与“成员名”都遵循标识符命名规则。 成员类型可以是除本身所属结构体类型外的任何已有数据类型。 在同一作用域内,结构体类型名不能与其它变量名或结构体类型名重名。 同一个结构体各成员不能重名,但允许成员名与程序中的变量名、函数名或者不同结构体类型中的成员名相同。 结构体类型的作用域与普通变量的作用域相同:在函数内定义,则仅在函数内部起作用;在函数外定义,则有全局作用域。第 10 章结构体与共用体 3【注意】结构体类型定义的末尾必须有分号。10.1.2 结构体变量的定义、引用和初始化1结构体变量的

5、定义(1)先定义结构体类型,再定义结构体变量。如struct dateint year;int month;int day;struct date date1,date2;(2)定义结构体类型的同时定义结构体变量。如struct studentint num;char name20;char sex;struct date birthday;float score;stu1,stu2;(3)直接定义结构体变量。如structint num;char name20;char sex;struct date birthday;float score;stu1,stu2;【说明】 结构体类型与结构体

6、变量是两个不同的概念。前者只声明结构体的组织形式,本身不占用存储空间;后者是某种结构体类型的具体实例,编译系统只有定义了结构体变量后才为其分配内存空间。 结构体变量各成员存储在一片连续的内存单元中。 可以用sizeof测出某种基本类型数据或构造类型数据在内存中所占用的字节数。如pirntf(%d,sizeof(struct student); 第 10 章结构体与共用体 4【思考】测试并分析struct student类型的结构体变量在内存所占用存储空间的长度。2. 结构体变量的引用(1)使用成员运算符引用结构体变量的成员。格式:结构体变量名.成员名功能:引用结构体变量中指定名称的成员变量。如

7、struct student stu1,stu2;int age;stu1.num=1001;gets(stu1.name);scanf(%d,&stu1.birthday.year);age=2006-stu1.birthday.year;(2)使用指针运算符和成员运算符引用结构体变量的成员。如struct student stu,*p=&stu;(*p).num=10001;scanf(%s,(*p).name);scanf(%f,&(*p).score);(3)使用指向运算符“-”引用结构体变量的成员。如struct student stu,*p=&stu;p-num=10001;sca

8、nf(%s, p-name);scanf(%f,&p-score);printf(age of %s is %dn,stu.name,age);(4)将结构体变量作为一个整体进行操作。如struct student stu1,stu2,*p=&stu1;stu2=stu1;printf(the address of struct student variable stu2 is %x,&stu2);【说明】 “(*p).成员名”、“p-成员名”与“stu.成员名”等价,不过后两种方式更直观。 成员运算符“.”与指向运算符“-”的优先级相同,都高于指针运算符“*”。【注意】不能将结构体变量当作一

9、个整体进行输入、输出或赋值,如struct date date1,date2;date1=1988,8,5;scanf(%d%d%d,&date2);printf(%d%d%d,date2);第 10 章结构体与共用体 5【思考】“(*p).成员名”中的圆括号能否省略?3结构体变量的初始化在定义结构体变量的同时,按照所属结构体类型的组织形式依次写出全部或部分成员变量的初始值。如:struct student stu1=1001,Zhang San,M,1988,8,10,580;struct student stu2=1002,Li Ping,F,1989,2,5,595;struct stu

10、dent stu3=1002,Li Ping,F,1989;【说明】 初始化前,结构体变量各成员的取值是随机的。 花括号内初值的顺序、类型要与结构体成员的顺序和类型一致。【注意】初始化时,花括号内的数据不能包含变量。如以下程序片段的最后一行不正确:struct dateint 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.1.3 结构体程序举例例

11、10.1 输入一个学生的信息并显示。程序的算法描述如图10.2所示,代码如下: 定 义 结 构 体 变 量 stu输 入 学 号 stu.nm输 入 姓 名 st.ae输 入 出 生 年 月 日输 入 学 生 成 绩 stu.core输 出 学 生 信 息图 10.2 例 10.1 主函数 N-S 图#includevoid main()struct date第 10 章结构体与共用体 6int year;int month;int day;struct studentint num;char name20;char sex;struct date birthday;float score;s

12、truct student stu;printf(请输入学生学号:);scanf(%d,&stu.num);printf(请输入学生姓名:);scanf(%s,stu.name);printf(请输入学生性别:);scanf( %c,&stu.sex);printf(请输入学生出生日期:);scanf(%d%d%d,&stu.birthday.year,&stu.birthday.month,&stu.birthday.day);printf(请输入学生成绩:);scanf(%f,&stu.score);printf(学号:%dn姓名:%sn性别:%cn出生日期:%d 年%d 月%d日n成绩:

13、%6.1fn,stu.num,stu.name,stu.sex,stu.birthday.year,stu.birthday.month,stu.birthday.day,stu.score);【注意】若连续输入两个字符或者先输入一个字符串后输入一个字符,则输入第二个字符的控制符%c 前应加一个空格。如语句scanf( %c,&stu.sex) 中,格式控制符%c 之前的空格不能省略,否则,两次输入之间的分隔符将被作为第二个字符的输入加以处理。例10.2 在函数 input中输入一个学生的信息,在函数list中显示。程序的算法描述如图10.3所示,代码如下: 定 义 结 构 体 变 量 stu

14、 调 用 input()函 数 输 入 学 生 信 息调 用 list()函 数 输 出 学 生 信 息(a)主 函 数 N-S图 输 入 学 号 stu.nm输 入 姓 名 st.ae输 入 出 生 年 月 日输 入 学 生 成 绩 stu.core返 回 st(b) input()函 数 N-S图 输 出 学 号 stu.nm输 出 姓 名 st.ae输 出 出 生 年 月 日输 出 学 生 成 绩 stu.core(c) list()函 数 N-S图图 10.3 例 10.2 各函数 NS 图#includestruct date第 10 章结构体与共用体 7int year;int m

15、onth;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);printf(请输入学生姓名:);scanf(%s,stu.name);printf(请输入学生性别:);scanf( %c,&stu.sex);printf(请输入学生出生日期:);scanf(%d%d%d,&stu.birthday.year,&stu.birthday.month,&stu.birthday.day);printf(请输入学生成绩:);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.score);void main()struct stu

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

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号