第7章结构体与链表-2011.ppt

上传人:本田雅阁 文档编号:2257753 上传时间:2019-03-12 格式:PPT 页数:33 大小:356.51KB
返回 下载 相关 举报
第7章结构体与链表-2011.ppt_第1页
第1页 / 共33页
第7章结构体与链表-2011.ppt_第2页
第2页 / 共33页
第7章结构体与链表-2011.ppt_第3页
第3页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第7章结构体与链表-2011.ppt》由会员分享,可在线阅读,更多相关《第7章结构体与链表-2011.ppt(33页珍藏版)》请在三一文库上搜索。

1、,C+程序设计,计算机基础课教研室 李志芳,1,主要内容,第1章 C/C+概述 第2章 基本数据类型与表达式 第3章 控制结构 第4章 数组与字符串 第5章 函数 第6章 指针,第7章 结构体与链表 第8章 类和对象 第9章 继承与多态 第10章 模板与异常处理 第11章 标准库与输入输出流 第12章 程序设计与软件开发技术,2,第7章 结构体与链表,学习目标 熟练掌握结构体的定义,以及结构体变量的初始化和使用。 了解共用体和枚举类型的定义及使用。 了解链表的概念、定义及基本操作。 了解编译预处理功能及使用。,3,7.1 结构体 7.2 共用体 7.3 枚举类型 7.4 链表 7.5 编译预处

2、理,第7章 结构体与链表,4,7.1 结构体,在处理大量数据时,使用数组是很方便的。但是,由于数组是由同一类型的数据组成的,这就带来很大的局限性。 例如,不能利用普通数组存放一个班同学的全部资料,包括姓名、年龄、性别等信息。 C/C+提供自定义的结构体类型来解决这个问题。,5,1.结构体类型的定义,一般形式: struct 结构体类型名 成员项列表 ;,该定义仅规定了结构体类型的内存分配模式,只有初始化结构体的变量后才真正的开辟内存空间。,6,2. 结构体变量的说明和初始化,结构体变量的说明: 一般形式:在定义了结构体类型后,用已定义的结构体类型名定义变量。,或者,7,2. 结构体变量的初始化

3、,结构体变量的初始化: struct person stu1= “张三”,19,M;,可以用sizeof运算符测试结构体类型数据占据的字节数。 例:sizeof(struct person)或sizeof(stu1) 注:结构体变量的长度等于其所有成员长度之和。,int a,b=12;,8,3. 结构体变量的使用,结构体变量的成员变量的引用: .,9,结构体类型,两个相同类型的结构体变量之间可以互相赋值。 但是和数组一样,不能将结构体变量作为一个整体输入/输出,只能以结构体的成员作为基本变量,一次输入或输出结构变量中的一个成员。 实际上,在C+中的结构体和类一样,可以包含成员函数等,只是默认情

4、况下,结构体类型的成员均为公有。但大多数程序员习惯于使用类似C语言的结构体。,返回章节,10,7.2 共用体,共用体(或称联合体)与结构体类似,存放不同类型的数据,用法也相似。但共用体每个数据成员先后占据同一段存储空间。而在结构体的每一个数据成员都要单独占用存储空间。 在有些问题中,不同类型的数据成员并不需要同时出现。因此为了节约内存并便于数据处理,C语言允许在编程时用同一内存段存放不同类型数据成员,这种特殊的数据类型就是共用体。,11,7.2 共用体,例如:union exam int a; double b; char c; x,y;,共用体变量存储结构,例如:sizeof(union e

5、xam)或sizeof(x) 注:共用体变量的长度等于其最长成员的长度。,12,7.2 共用体,例如:在某校信息管理系统中有以下数据: (1)姓名 name (2)年龄 age (3)职业 job:取值有两种,即student或teacher (4)职位 position: 对学生而言,采用年级grand分级,取值1、2、3、4等。 对教师而言,采用职称title分级,取值Professor、AssociateProfessor、Lector等。,int型,char型数组,13,7.2 共用体,对于成员变量position可以在编程时用同一内存来存放两种不同类型的成员,但每一瞬间只有一个成员起

6、作用。 可以定义为:,union postion int grand; char title20; ;,14,例:学校信息管理,返回章节,15,7.3 枚举类型,如果某个数据项的取值范围仅限于少数几种可能的值,则可以将该数据项定义为枚举类型数据。 枚举类型的定义:,enum ;,或称枚举常量表,例如:定义“星期”的枚举类型,16,7.3 枚举类型,说明1:每个枚举元素实际上是一个以其所在位置顺序为值的常量。编译器为这些枚举元素取值为0、1、2、3、n-1,故叫枚举常量 。,说明3:可以在定义枚举类型同时对枚举常量重新定义值。但枚举元素是常量不能直接赋值。,说明2:枚举值只能是一些标识符,不能是

7、基本类型常量。,此时,white为7、yellow为8。,17,7.3 枚举类型,枚举变量的说明(与结构体、共用体类似):,枚举变量的赋值: 赋值只能选择枚举符号值或其对应的整数值。,强制类型转换,18,用户定义类型(typedef),typedef的作用:给已有的类型起一个别名。 例如:typedef int INTEGER; typedef struct person SP; 用于对数组和指针类型的命名,例如: typedef char* CHARP; /定义CHARP为字符型指针类型名 CHARP p,q; /等价于char *p,*q; typedef int Num10; /定义Nu

8、m为整型数组类型名 Num a; /定义a为整型数组;,返回章节,19,7.4 链表,在内存中存储方法: 使用数组存储结构体, SC20; 使用链式结构存储结构体,一块连续的内存区域,不连续的内存区域,struct stu_sc int num; char name20; char sex; float score; SC20;,20,7.4 链表,链表:链式结构,每一行存储结构:,链表结点,21,7.4 链表,链表是一种线性数据结构,与数组有不同: 用数组来存放数据的时候,需要事先确定数组的长度,并分配连续的内存空间。因而不能动态地分配内存,不能改变数组的大小。 而且在数组中做插入、删除等操

9、作需要频繁的移动数据。 链表可以使一组数据中内存中不连续存放,提高对存储空间的利用率。链表的插入、删除只与其相邻结点指针的值。,22,7.4 链表,要创建一个链表需要定义一个结构,结构成员中包含链表每一个结点的数据和指向下一个结点的指针变量。 每个链表都有一个头指针,链表的最后一个结点不指向其他结点,终点的指针为NULL。,注:链表第一个结点的地址可以通过其head找到。,23,7.4 链表,单向链表的定义:,struct sc_node int num; char name20; char sex; float score; sc_node *next; ;,struct node int

10、data; node *next; ;,next指向下一个node结点,建立单向链表: 声明一个链首指针变量,并赋初值NULL(包含0个结点的链表); 动态分配一个新的结点,将该结点链入链尾; 重复上一步骤;,24,7.4 链表,动态申请内存的方法: sc_node *p=new sc_node; 对链表的主要操作有以下几种: 建立链表; 遍历链表; 删除结点; 插入结点;,也可以使用系统函数malloc(),从头结点开始,依次读取数据并后移指针变量,直到尾结点。,将要删除结点的后继结点地址赋给其前驱结点的指针域,释放要删除结点的存储空间。,开辟新结点,找插入点结点;将新结点地址赋给插入点的前

11、驱结点的指针域,再将插入点后继结点地址赋给新结点的指针域。,25,建立链表,定义3个结点指针,head=new node;,temp=new node;,26,7.4 链表,链表类 将结点定义为一个类模板,结点中的数据类型为模板类型,这样每个结点的数据成员,可以是一个整型、字符型,也可以是一个构造类型。,成员可能用到的类型参数,template class node public: datatype data; node *next; ,27,7.4 链表,链表类模板,把链表的基本操作 定义为链表类的 成员函数,链表类模板,链表头指针,返回章节,28,7.5 编译预处理,C+提供的编译预处理的

12、功能,是它与其它许多编程语言的重要区别之一。 编译预处理:编译系统对程序进行编译之前,先对在源程序中出现的一些特殊的命令进行“预处理”;然后再进行正式的编译处理,得到目标代码。 编译预处理命令扩展了C+程序设计的能力,合理地使用编译预处理功能,可以使得编写的程序便于阅读、修改、 移植和调试。,29,7.5 编译预处理,主要有3种编译预处理命令: (1)宏定义 #define PI 3.1416 #define S PI*r*r 注:3.1416是个字符串常量,宏替换时仅以字符串替换宏名,预处理本身不做任何数据类型和合法性的检查,也不分配存储单元。 #define SUM(a,b) a+b 注:

13、只做实参替换,不做“值传递” 。,不带参数的宏定义,可以嵌套定义,在C+中可以使用常量修饰符const定义,效果更好。,带参数的宏定义,用法类似函数,30,7.5 编译预处理,(2)文件包含 是指一个源文件可以将另一个源文件的全部内容包含进来,编译时嵌入,格式如下: #include 或 “myfile.h” 其中,iostream便是一个系统提供的、有关输入输出操作信息的头文件。 注: 一条文件包含命令只能包含一个文件。 文件件包含命令可以嵌套使用,在一个被包含的头文件中,还可以包含头文件。,两种格式略有不同,31,7.5 编译预处理,(3)条件编译 使编译器按不同的条件去编译程序中不同的部分,产生不同的目标代码文件。 有3种条件编译命令,一般格式如下:,#if 程序段1 #else 程序段2 #endif,32,7.5 编译预处理,预处理命令共同的语法规则如下: 所有的预处理命令在程序中都是以“#”来引导,如“#include ”。 每一条预处理命令必须单独占用一行。 预处理命令一般都不是C语句,其后不加分号。 预处理命令一行写不下,需要加续行符“。,返回章节,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1