资源预览内容
第1页 / 共175页
第2页 / 共175页
第3页 / 共175页
第4页 / 共175页
第5页 / 共175页
第6页 / 共175页
第7页 / 共175页
第8页 / 共175页
第9页 / 共175页
第10页 / 共175页
亲,该文档总共175页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章 复杂数据结构 结构体、联合及 用户自定义类型,C语言程序设计Programming in C,学习并不等于就是摹仿某些东西,而是掌握技巧和方法。,1、掌握定义结构体类型、结构体变量、结构体数 组和结构体指针的方法。 2、掌握初始化结构体变量、结构体数组的方法。 3、掌握结构体成员的引用方法。 4、应用结构体变量、结构体数组和结构体指针 5、掌握结构体在函数中的使用 6、掌握链表的概念和基本操作 7、掌握联合体的概念、存储特点及应用。 8、了解自定义类型、枚举类型的概念和应用,本章教学目标,本章项目任务,利用结构体,重新设计“学生信息管理系统”。,本章内容,7.1 结构及结构变量的引入 7.2 结构数组 7.3 结构与指针 7.4 结构体与函数 7.5 链表 7.6 特殊的数据类型联合体 7.7 用typedef定义类型 7.8 枚举(Enumeration)类型,7.1 结构(Structure)及结构变量的引入,7.1.1 结构体类型的定义 7.1.2 结构体变量的定义和初始化 7.1.3 结构体变量的使用,C语言引入了一种能集不同数据类型于一体的结构体类型。结构体类型的变量可以拥有不同数据类型的成员,是不同数据类型成员的集合。,例:住宿表、成绩表、通讯地址表如下,结构体类型适合将属于同一对象的,具有不同方面的不同类型的数据信息有机地组合在一起,即将具有内在联系的不同类型的数据统一为一个整体,形成一种新的数据类型。 “结构体”组合了一组相关联的数据,但各个数据成员并不需要具有同一数据类型,它能够客观反映现实信息的本质。 使用结构体类型和数据,均需要用户根据实际分析结果自行定义。,7.1.1 结构体类型(Structure type )的定义,结构体类型定义的一般形式: struct 结构体类型名 类型名1 结构成员名表1; 类型名2 结构成员名表2; 类型名n 结构成员名表n; ;,用户可按照实际需求,并根据C语言提供的结构体格式,自行定义结构体数据类型,某结构体一旦定义,程序中就具有了这种结构的数据类型,其用法与其它的数据类型相同。,说明: (1)“struct”为定义结构体类型的关键字; (2)“结构体名”为用户自行命名的结构体类型标识符; (3)结构体的各成员列表放在“ ”中; (4)整个结构体类型定义必须用“;”作为结束符。,代表客观现实信息的不同方面,依照结构体定义格式,前述各表格的用户自定义结构体类型可以定义如下。,(1) “住宿表”结构体类型: struct accommod /*结构体类型名*/ char name20; /*姓名*/ char sex; /*性别*/ char job40; /*职业*/ int age; /*年龄*/ long number; /*身份证号码*/ ;,(2)“成绩表”结构体类型: struct score /*结构体类型名*/ char grade20; /*班级*/ long number; /*学号*/ char name20; /*姓名*/ float os; /*操作系统*/ float datastru; /*数据结构*/ float compnet; /*计算机网络*/ ;,(3)“通讯地址表”结构体类型: struct addr /*结构体类型名addr*/ char name20; /*姓名*/ char department30; /*部门*/ char address30; /*住址*/ long box; /*邮编*/ long phone; /*电话号码*/ char email30; /*Email*/ ;,结构体类型根据不同的问题,其成员是不同的,可以有任意多的结构体类型描述。,结构体类型定义的嵌套: 结构体类型中的成员类型不仅可是简单数据类型,也可是构造类型,当然也可是某种结构体类型。当结构体定义中又包含结构体类型时称为结构体的嵌套。,(4)定义“日期”结构体类型: struct data /*结构体类型名data*/ int year, month, day; ; /*年、月、日为整型*/,(5)定义“学生”结构体类型: struct student /*结构体类型名student*/ long number; /*学号*/ char name20; /*姓名*/ char sex; /*性别*/ struct data birthday; /*出生日期,结构体嵌套*/ char addr30; /*住址*/ ;,分析: 综合前面各章节的分析,在“学生信息管理系统”中应该有用户、课程结、班级和学生结构体。各结构体类型定义如下: (1)用户结构体类型 对于登录系统的用户应包括两种最基本的用户:管理员(系统管理员)、普通用户(教师和学生)。每个用户都有各自的用户名、密码和用户类型三个最基本的属性,且不同的用户有不同的操作权限。因此可以将用户结构体定义如下:,【项目案例7-1】“学生信息管理系统”中不同结 构体类型的定义。,struct user /*定义用户结构体类型user*/ char username20; /*用户名(要保证唯一)*/ char userpass20; /*用户密码*/ char usertype; /*用户类型*/ ;,struct course /*定义课程结构体course */ int courseid; /*课程编号,用整型变量表示*/ char coursename20; /*课程名称*/ int credit; /*课程学分*/ int AcademicHour; /*教学课时*/ ;,(2)课程结构体类型 为了反映课程的特征,需要设置课程结构体。课程结构体定义如下:,struct class /*定义班级结构体class */ char classname20; /*班级编号*/ char specialty20; /*专业名称*/ int studentnum; /*班级的学生人数*/ int class_coursenum; /*班级要求所修的课程数*/ /*假设每班最多能设置N(符号常量)门课程*/ int class_courseidN; /*班级必修课程编号数组*/ ;,(3)班级结构体类型 为了反映班级的基本信息,需要设置班级结构体。班级结构体定义如下:,struct student /*定义学生结构体student */ char studentid20; /*学生学号,惟一*/ char classname20; /*所在班级编号*/ char studentnameN; /*学生姓名*/ struct date int year,month,day; birthday; /*出生日期*/ int scorearrN; /*学生成绩数组*/ ;,(4)学生结构体类型 学生结构体类型成员应该包含两大类:基本信息(学号、姓名、出生日期、班级代码等)和成绩信息(各科成绩)。因此可以把学生结构体定义如下:,/*定义班级-课程结构体class_course*/ struct class_course char classname20; /*班级编号*/ int class_courseidN; /*班级课程编号数组*/ char coursenameN 20; /*课程名称*/ ;,(5)班级-课程结构体 学校中的每个班级编号是唯一的,而不同的班级可以设置不同的课程组。为了反映班级和所选课程组之间的关系,定义班级-课程结构体如下:,/*定义班级-学生结构体class_student */ struct class_student char classnameN; /*班级编号*/ char specialty20; /*专业名称*/ char studentidN; /*学生学号*/ ;,(6)班级-学生结构体 入学时确定某学生属于某班级,但有可能发生学生异动的情况,为了反映班级和学生之间的关系,需要设置班级-学生结构体。定义如下:,通常情况下,结构体类型的定义在所有函数之外,位于main()函数之前。这使得新定义的结构体数据类型在程序的任何地方都可以被共享使用。 定义一个结构体类型并不分配内存,内存分配发生在定义这个新数据类型的变量中。,7.1.2 结构体变量的定义和初始化,定义所需要的结构体类型之后,利用所定义的类型可以进一步定义简单结构体变量、结构体数组、指向结构体变量或数组的指针等。,1.结构体变量的定义和初始化 结构体类型变量的定义有三种形式: (1)紧跟在结构体类型定义之后进行定义。 (2)在定义一个无名结构体类型的同时,直接进 行结构体变量的定义。 (3)先定义结构体类型,再单独定义变量。,(1)紧跟在结构体类型定义之后进行定义。 例如,定义某班级学生结构体类型和变量: struct score char grade20; /*班级*/ long number; /*学号*/ char name20; /*姓名*/ float os; /*操作系统*/ float datastru; /*数据结构*/ float compnet; /*计算机网络*/ std; /*定义某班级学生结构体类型score和结构体变量std*/,(2)在定义一个无名结构体类型的同时,直接进行结构体变量的定义。 例如: struct char grade20; /*班级*/ long number; /*学号*/ char name20; /*姓名*/ float os; /*操作系统*/ float datastru; /*数据结构*/ float compnet; /*计算机网络*/ std; /*定义某班级学生结构体类型和结构体变量std*/ 这种方式与前一种的区别仅仅是省去结构体标识名。通常用在不需要再次定义此类型结构体变量的情况。,(3)先定义结构体类型,再单独定义变量。 例如: struct data /*日期结构体类型名data*/ int year, month, day; ; /*年、月、日为整型*/ struct data ruxue; /*定义入学日期结构体变量ruxue*/,注意: 不能只使用struct而不写结构体标识名data,因为struct不象int、char可以唯一的标识一种数据类型。作为构造类型,属于struct类型的结构体可以有任意多种具体的“模式”,因此struct必须与结构体标识名共同来说明不同的结构体类型。,和一般变量一样,结构体变量也可以在定义的同时赋初值。 例如:,struct score char grade20; /*班级*/ long number; /*学号*/ char name20; /*姓名*/ float os; /*操作系统*/ float datastru; /*数据结构*/ float compnet; /*计算机网络*/ std=“0802“,20080101, “li lin“,79,92,86 ; 或: struct score std=“0802“,20080101, “li lin“,79,92,86;,对结构体变量赋初值时,C编译程序按每个成员在结构体中的顺序一一对应赋初值; 不允许跳过前边的成员给后面
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号