C语言12-StructuresandUnions-Adva.ppt_第1页
C语言12-StructuresandUnions-Adva.ppt_第2页
C语言12-StructuresandUnions-Adva.ppt_第3页
C语言12-StructuresandUnions-Adva.ppt_第4页
C语言12-StructuresandUnions-Adva.ppt_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

结构体与联合体:高级概念 吴清锋 2007年秋 提纲 指向结构体类型数据的指针 用指针处理链表 链表概述 简单链表(静态链表) 处理动态链表所需的函数 动态链表的处理 用typedef定义类型 运算符小结 结束 指向结构体类型数据的指针(1) 概述 结构体变量的指针就是该变量所占据的内存段的起始地址。 可以定义一个指针变量来指向一个结构体变量。 指针变量可以用来指向结构体数组中的元素。 定义结构体指针变量的一般形式是(回顾下之前如何定义?) struct 结构体类型 * 结构体指针名 务必注意每一部分的含义 通过结构体指针变量访问相应结构体成员 (* 结构体指针名).分量 指向运算符- 优先级、结合性与.运算符相同 结构体指针名-分量 总结下三种访问成员的三种形式。尤其是,使用*和-的对 象都是指针变量,但是书写上一定要注意差异! 例子(P289例11.3) 指向结构体类型数据的指针(2) 用结构体类型数据的指针来访问结构体数组。 例子P290例11.4,一定要注意p+的含义! p是一个指向结构体类型的指针变量,因此赋值的时候 要门当户对!否则就要进行强制类型的转换! 函数参数问题传递结构体入函数(注意门当户对 !) 将结构体变量的各个分量分别对应一个参数传递; 将结构体变量整体作为实参进行传递;P292例11.5 将指向结构体变量的指针变量作为实参进行传递.P293 比较 (p+)-num P291 (+p)-num P291 +(p-num) +p-num P290 p-num+ P290 返回 链表概述(1) 用数组存储一批数据时,必须事先定义固定的长度。当事 先并不很确定时,就只能定义长度为足够大。这样很浪费 空间。 数组之所以要事先定义固定的长度,目的是先分配好空间 以为保证各元素之间的连续性。 如果长度不固定必然要求空间是动态分配的。这就带来一 个问题:各个元素之间不一定能分配到相邻空间。如此, 每个元素中都必须有一个指针能指向下一个元素。 链表是一种常见而又重要的数据结构,是动态地进行存储 分配的一种结构。 简单链表的模型P294 链表的特点:链表中元素可以不连续存放 在链表结构中随机访问元素比较麻烦。 头指针 头结点尾结点 尾结点的标志是 其“后向指针”的 值为NULL NULL常量在头 文件stdio.h中定 义,值为0。 链表概述(2) 结构体变量用来表示链表结构最合适。Why? 可定义一个自引用的结构体以表示链表结点 例: struct student long num; float score; struct student * next; ; 一定要深刻理解其含义,这是一个基本操作! 注意,下面是错的: 为什么呢?会造成无穷尽现象! struct student long num; float score; struct student next; ; 注意:上面只是定义了一个结构体类型,还没有 实际分配空间,也就没有所谓的链表! 返回 处理动态链表所需的函数(1) 学习的时候,注意: 函数的功能,输入和输出情况! 这里是定义函数,而不是定义指向函数的指针! malloc #include void * malloc (size_t size); calloc #include void * alloc (size_t nelem, size_t elsize); free #include void free (void * block); 处理动态链表所需的函数(2) void *是ANSI中引进的,用来表示通用指针 malloc时的强制类型转换(P277) main() char * name; name=(char *)malloc(10); strcpy(name, “Zhang San“); printf(“%s“, name); free(name); 返回 链表的相关操作(1) 静态链表(简单链表) 程序的实现的几个关键步骤: 借助变量,构造空间和值 建立变量间关系 通过指针变量来访问链表中的每个节点 例子:P295例11.7 一定要注意c.next=NULL的作用 p=p-next;的含义,就是实现了“接力”! 链表的相关操作(2) 动态链表 注意: 都是基本操作!应该熟记! 初学时一定要思考每一语句的顺序和存在的意义! 一定要考虑多个节点的处理! 可能有的问题只需要用p1而有的用p2,需要思考必要性 动态链表的操作 动态链表的建立和输出 对链表中节点的删除和插入 注意:上面的各个操作只有提供了若干子函数,需要构 造一个主函数来调用后才能直观看见结果! 动态链表的建立(见1201) 例子:P298 链表的相关操作(3) 动态链表的输出 例子:P300例子11.9 基本操作步骤: 构造指针变量并建立指向关系 借助循环实现 注意循环体中,一边输出,一边指向的下移 循环跳出条件,借助NULL 思考,head!=NULL的必要性?从程序的健壮和完善性 角度考虑! 注意,void print(struct student *head) 没有*也没有返回值,仅是做一些操作! 如何体现“门当户对” 链表的相关操作(4) 对动态链表的删除 例子:P300例子11.10 实际上,此题可以分为结点的查找和删除两个 子操作! 基本操作步骤: 定位删除的节点,借助循环实现 定位后再作删除操作(应该有释放空间的操作) 思考, 1、循环设置两个跳出口的必要性! 2、在删除时,一定要理解,p2、p2-next和 p1-next三者间的指向关系! 链表的相关操作(5) 对动态链表的插入 例子:P305例子11.11 实际上,此题可以分为结点的定位和插入两个子操作! 顺序插入可以实现,有序链表的建立注意 基本操作步骤: 定位应该插入的位置,借助循环实现 定位后再作插入操作 思考的问题同动态链表的删除操作! 比较11.10和11.11:关键点还是在于查找(循环+ 两个出口)的操作!具体的删除和插入只是作连接 关系上的转移! 链表的相关操作(6) 请考虑各个函数的书写顺序! 考虑程序的完善性(P307): 在主函数中,插入的结点是一个变量,考虑下如何修改 程序让其动态的生成!需要引进指针变量! 如果是需要多个删除或是多个添加,该如何处理?这就 需要:借助循环,而且需要添加的空间是动态生成的! 思考,如何把第二个while改写成dowhile? 回忆结构体: 首先要记住结构体是一种构造类型(功能上类似int等) 区别结构体类型和结构体变量! 结构体同数组、指针等的联合! 结构体一个很大的用处,就是使用来表示链表的结点! 用typedef定义类型(1) 用typedef声明新的类型名(看名知意!) typedef 类型名 新类型名 其功能是:新声明的类型名可以代替已有的类型 注意,即为已定义的数据类型定义别名,而不是 创造一个新类型! 三种情景: 对普通类型(增加了程序的可读性!换说法+表含义!) 对结构体类型(重要!缩短类型名的长度!) 三种较为复杂的类型名定义解释(务必了解其实质功 能!注意:大写部分都声明成类型!) typedef int NUM100; typedef char *STRING; typedef int (*POINTER)(); 声明一个新的类型名的方法(4步骤)(P316) 用typedef定义类型(2) 宏与类型定义是有差异的,例如: 若有: #define PINT int * 则定义 PINT a, b; 相当于: int * a, b; 返回 若有: typedef int * PINT; 则定义 PINT a, b; 相当于: int * a, * b; 运算符小结 返回 运算符结合方向备注 、()、.、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论