第一章 数据结构基础

合集下载

《数据结构》课后习题答案(第2版)

《数据结构》课后习题答案(第2版)

《数据结构》课后习题答案(第2版)数据结构课后习题答案(第2版)第一章:基本概念1. 什么是数据结构?数据结构是指数据元素之间的关系,以及相应的操作。

它研究如何组织、存储和管理数据,以及如何进行高效的数据操作。

2. 数据结构的分类有哪些?数据结构可以分为线性结构和非线性结构。

线性结构包括数组、链表、栈和队列;非线性结构包括树和图。

3. 什么是算法?算法是解决特定问题的一系列有序步骤。

它描述了如何输入数据、处理数据,并产生期望的输出结果。

4. 算法的特性有哪些?算法具有确定性、有限性、输入、输出和可行性这五个特性。

5. 数据结构和算法之间的关系是什么?数据结构是算法的基础,算法操作的对象是数据结构。

第二章:线性表1. 顺序表的两种实现方式是什么?顺序表可以通过静态分配或动态分配的方式实现。

静态分配使用数组,动态分配使用指针和动态内存分配。

2. 单链表的特点是什么?单链表由节点组成,每个节点包含数据和一个指向下一个节点的指针。

它的插入和删除操作效率高,但是查找效率较低。

3. 循环链表和双向链表分别是什么?循环链表是一种特殊的单链表,在尾节点的指针指向头节点。

双向链表每个节点都有一个指向前一个节点和后一个节点的指针。

4. 链表和顺序表的区别是什么?链表的插入和删除操作效率更高,但是查找操作效率较低;顺序表的插入和删除操作效率较低,但是查找操作效率较高。

第三章:栈和队列1. 栈是什么?栈是一种特殊的线性表,只能在表的一端进行插入和删除操作。

后进先出(LIFO)是栈的特点。

2. 队列是什么?队列是一种特殊的线性表,只能在表的一端进行插入操作,在另一端进行删除操作。

先进先出(FIFO)是队列的特点。

3. 栈和队列的应用有哪些?栈和队列在计算机科学中有广泛的应用,例如浏览器的前进后退功能使用了栈,操作系统的进程调度使用了队列。

4. 栈和队列有哪些实现方式?栈和队列可以使用数组或链表来实现,还有更为复杂的如双端队列和优先队列。

数据结构考研辅导-基础篇

数据结构考研辅导-基础篇

运算实现:
stack::stack(){ count = 0; }
Bool stack::empty()const{
if ( count == 0 ) return TRUE;
else return FALSE;
}
Bool stack::full()const{
if ( count == maxlen ) return TRUE;
/
2
+ 150
# 12
栈顶算符‘/’比当前运算符 ‘-’优先级高,故要执行 ‘/’运算 150/2 并入栈
#12+5*(2+3)*6/2-4# CurrentS=#
+ 75 # 12
栈顶算符‘+’比当前运 算符‘-’优先,故执行 ‘+’运算 12+75 并入栈
-4 # 87
栈顶算符‘-’比当前运算 符‘#’优先级高,故要执 行‘-’运算 87-4 并入栈
class queue{ public:
queue(); Bool empty()const; Bool full()const; error_code get_front(elementtype &x)const; error_code append(const elementtype x); error_code serve(); … …//定义其它成员 };
error_code get_front(elmenttype &x)const;
error_code append(const elementtyoe x);
error_code serve();
private:
int count;
maxlen-1
int front, rear;

数据结构课程教案

数据结构课程教案

数据结构课程教案第一章:数据结构概述1.1 数据结构的概念介绍数据结构的基本概念和重要性讨论数据的组织、存储和操作1.2 常见的数据结构线性结构:数组、链表、栈、队列非线性结构:树、图1.3 算法和复杂度介绍算法的概念和设计方法讨论时间复杂度和空间复杂度第二章:线性表2.1 数组介绍数组的概念和实现讨论数组的操作和优缺点2.2 链表介绍链表的概念和实现讨论链表的操作和优缺点2.3 栈和队列介绍栈和队列的概念和实现讨论栈和队列的操作和应用场景第三章:非线性结构3.1 树介绍树的概念和性质讨论树的遍历和操作3.2 二叉树介绍二叉树的概念和性质讨论二叉树的遍历和操作3.3 图介绍图的概念和表示方法讨论图的遍历和操作第四章:排序和搜索算法4.1 排序算法介绍排序算法的概念和分类讨论常见的排序算法(如冒泡排序、选择排序、插入排序等)4.2 搜索算法介绍搜索算法的概念和分类讨论常见的搜索算法(如顺序搜索、二分搜索等)第五章:算法设计技巧5.1 分治法介绍分治法的概念和应用讨论分治法的实现和优点5.2 动态规划介绍动态规划的概念和应用讨论动态规划的实现和优点5.3 贪心算法介绍贪心算法的概念和应用讨论贪心算法的实现和优点第六章:线性表的扩展6.1 串介绍串的概念和实现讨论串的操作和应用场景6.2 多维数组和稀疏矩阵介绍多维数组和稀疏矩阵的概念和实现讨论它们的操作和应用场景第七章:树状数组和离散化7.1 树状数组介绍树状数组的概念和实现讨论树状数组的操作和应用场景7.2 离散化介绍离散化的概念和实现讨论离散化的操作和应用场景第八章:排序算法的进阶8.1 快速排序介绍快速排序的概念和实现讨论快速排序的优化和时间复杂度分析8.2 归并排序介绍归并排序的概念和实现讨论归并排序的优化和时间复杂度分析8.3 堆排序介绍堆排序的概念和实现讨论堆排序的优化和时间复杂度分析第九章:高级搜索算法9.1 深度优先搜索(DFS)介绍深度优先搜索的概念和实现讨论深度优先搜索的适用场景和应用9.2 广度优先搜索(BFS)介绍广度优先搜索的概念和实现讨论广度优先搜索的适用场景和应用9.3 A搜索算法介绍A搜索算法的基本概念和实现讨论A搜索算法的优势和应用场景第十章:动态规划的进阶应用10.1 背包问题介绍背包问题的概念和分类讨论动态规划解决背包问题的方法和时间复杂度分析10.2 最长公共子序列和最长公共子串介绍最长公共子序列和最长公共子串的概念和实现讨论它们的适用场景和应用10.3 矩阵链乘问题介绍矩阵链乘问题的概念和实现讨论动态规划解决矩阵链乘问题的方法和时间复杂度分析十一章:图论基础11.1 图的基本概念介绍图的定义、术语和表示方法讨论图的类型和应用场景11.2 图的遍历介绍深度优先搜索(DFS)和广度优先搜索(BFS)讨论图的遍历算法实现和应用11.3 最小树介绍最小树的概念和性质讨论克鲁斯卡尔算法和普里姆算法十二章:网络流和匹配12.1 网络流介绍网络流问题的定义和性质讨论最大流和最小费用流算法12.2 匹配介绍匹配的概念和类型讨论匈牙利算法和最大匹配算法十三章:并查集和路径压缩13.1 并查集的基本概念介绍并查集的数据结构和操作讨论并查集的实现和应用场景13.2 路径压缩介绍路径压缩的概念和实现讨论路径压缩对并查集性能的改进十四章:线段树和树状数组14.1 线段树介绍线段树的概念和性质讨论线段树的构建和操作实现14.2 树状数组回顾树状数组的概念和操作讨论树状数组的应用场景和优势十五章:总结与实践项目15.1 课程总结回顾整个课程的主要概念、算法和应用强调数据结构在软件工程中的重要性15.2 实践项目设计一个或多个综合性的实践项目要求学生应用所学知识解决实际问题这个教案旨在为学生提供一个全面的数据结构学习框架,从基本概念到高级应用,涵盖了各种常见的数据结构和算法。

数据结构基础知识

数据结构基础知识

复习提纲第一章数据构造概述根本概念与术语〔P3〕1.数据构造是一门研究非数值计算程序设计问题中计算机的操作对象以及他们之间的关系和操作的学科.2.数据是用来描述现实世界的数字,字符,图像,声音,以及能够输入到计算机中并能被计算机识别的符号的集合2.数据元素是数据的根本单位3.数据对象一样性质的数据元素的集合4.数据构造三方面容:数据的逻辑构造.数据的存储构造.数据的操作.〔1〕数据的逻辑构造指数据元素之间固有的逻辑关系.〔2〕数据的存储构造指数据元素及其关系在计算机的表示( 3 ) 数据的操作指在数据逻辑构造上定义的操作算法,如插入,删除等.5.时间复杂度分析--------------------------------------------------------------------------------------------------------------------1、名词解释:数据构造、二元组2、根据数据元素之间关系的不同,数据的逻辑构造可以分为集合、线性构造、树形构造和图状构造四种类型。

3、常见的数据存储构造一般有四种类型,它们分别是___顺序存储构造_____、___链式存储构造_____、___索引存储构造_____和___散列存储构造_____。

4、以下程序段的时间复杂度为___O(N2)_____。

int i,j,*;for(i=0;i<n:i++) n+1for(j=0;j<n;j++) n+1*+=i;------------------------------------------------------------------------------------------------------------------第二章线性表1.顺序表构造由n(n>=0)个具有一样性质的数据元素a1,a2,a3……,an组成的有穷序列//顺序表构造#define MA*SIZE 100typedef int DataType;Typedef struct{DataType items[MA*SIZE];Int length;}Sqlist,*LinkList;2.单链表(1)链表结点构造//链表的节点构造Typedef struct Node{int data;struct Node *ne*t;} Lnode,*Pnode,*LinkList;(2)结点遍历void TraverseList(LinkList t){LinkList p;while(t){p=t;t=t->ne*tfree(p);}}(3)链表操作算法:初始化、插入、输出、删除void InitList(LinkList *h){*h=(LinkList)malloc(sizeof(LNode));if(!h){print("初始化错误〞);return;}(*h)->ne*t=NULL;}void InsertList(LinkList h,int pos,datatype *){ LinkList p=h,q;int i=0;while(p&&i<pos-1){p=p->ne*t;i++;}if(!p||i>pos-1)print("插入位置出错!!〞);InitList(&q);q->ne*t=NULL;q->data=*;}void DeleteList(LinkList h,int pos){LinkList p=h,q;int i=0;while(p&&i<pos-1){p=p->ne*t;i++;}if(!p||i>pos-1){cout<<〞删除位置错误〞;return;}q=p->ne*t;p->ne*t=q->ne*t;free(q);}-----------------------------------------------------------------------------------------------------------------1、线性表中,第一个元素没有直接前驱,最后一个元素没有直接后驱。

《数据结构》教案(精华版)

《数据结构》教案(精华版)

《数据结构》教案(精华版)《数据结构》教案(精华版)前言数据结构是计算机学科中的重要基础课程,它涉及到数据的存储、组织和管理。

本教案旨在帮助学生掌握数据结构的基本概念、算法和应用,提高其解决实际问题的能力。

第一章:引言在本章中,我们将介绍数据结构的基本概念和重要性。

学生将了解到数据结构在计算机科学中的作用,以及为什么学习数据结构对于他们的职业发展至关重要。

1.1 数据结构的定义数据结构是一种组织和存储数据的方式,它涉及到数据元素之间的关系,以及对这些关系的操作。

1.2 数据结构的分类数据结构可以分为线性结构和非线性结构。

线性结构中的数据元素之间存在一个明确的顺序关系,而非线性结构中的数据元素之间没有固定的顺序关系。

1.3 数据结构的应用数据结构在计算机科学中有广泛的应用。

例如,在数据库管理系统中,数据结构被用来组织和管理大量的数据;在图形图像处理中,数据结构被用来存储和操作图像数据。

第二章:线性结构本章将介绍线性结构,包括线性表、栈和队列。

学生将学习这些线性结构的定义、实现和应用。

2.1 线性表线性表是一种最简单的数据结构,它由一组数据元素组成,这些元素按照线性的顺序存储。

2.2 栈栈是一种特殊的线性表,它具有“先进后出”的特点。

学生将学习栈的定义、实现和常见应用。

2.3 队列队列是另一种特殊的线性表,它具有“先进先出”的特点。

学生将学习队列的定义、实现和应用。

第三章:树结构本章将介绍树结构,包括二叉树、搜索树和平衡树。

学生将学习这些树结构的定义、实现和应用。

3.1 二叉树二叉树是一种常见的树结构,它的每个节点最多有两个子节点。

学生将学习二叉树的定义、实现和遍历算法。

3.2 搜索树搜索树是一种特殊的二叉树,它的每个节点都符合一定的大小关系。

学生将学习搜索树的定义、实现和查找算法。

3.3 平衡树平衡树是一种自平衡的二叉树,它可以保持树的高度平衡。

学生将学习平衡树的定义、实现和平衡算法。

第四章:图结构本章将介绍图结构,包括无向图和有向图。

数据结构第一章

数据结构第一章

1.3 算法的描述
(2) 空间效率 一个算法在执行过程中所占用的存储空间大小,称为空间效率或空 间复杂度。与时间复杂度类似,空间复杂度是指算法在计算机内执行 时临时占用的存储空间大小。算法的空间复杂度一般以数量级形式给 出。 提高算法空间复杂度的措施有原地工作和压缩存储。
1.3 .4算法的描述语言
1.3 算法的描述
例1.6 求下列4个程序段的语句频度 (a) i++; x=0; (b)for(i=1;i<=n;i++) x=x+1;
(c)for(i=1;i<=n;i++) for (j=1;j<=n;j++) x=x+1;
(d)for(i=1;i<=n;i++) for (j=1;j<=n;j++) for (k=1;k<=n;k++) x=x+1;
记录号 学号 980001 980002 姓名 吴承志 李淑芳 性别 男 女 专 业 计算机科学与技术 信息与计算科学 年级 98级 2001级 98级 9,10 1,2 2000级 6,7,8
1 2 3 4 5
990301
990302
刘 丽
张会友


数学与应用数学
信息与计算科学
99级
99级
98级
99级
数学与应用数学
2000级 2001级
2001级
姓名索引表
9
10
学生信息表
教学计划编排问题 案例2
问题: 如何通过计算机编排教学计划? 算法分析: 一个教学计划包含许多课程,在教学计划包含的许多课程之间,有些必须按规 定的先后次序进行,有些则没有次序要求。即有些课程之间有先修和后续 的关系,有些课程可以任意安排次序。这种各个课程之间的次序关系可用 一个称作图的数据结构来表示

《数据结构》课件

《数据结构》课件

第二章 线性表
1
线性表的顺序存储结构
2
线性表的顺序存储结构使用数组来存储元素,
可以快速随机访问元素。
3
线性表的常见操作
4
线性表支持常见的操作,包括插入、删除、 查找等,可以灵活地操作其中的元素。
线性表的定义和实现
线性表是一种数据结构,它包含一组有序的 元素,可以通过数组和链表来实现。
线性表的链式存储结构
线性表的链式存储结构使用链表来存储元素, 支持动态扩展和插入删除操作。
第三章 栈与队列
栈的定义和实现
栈是一种特殊的线性表,只能在一 端进行插入和删除操作,遵循后进 先出的原则。
队列的定义和实现
队列是一种特殊的线性表,只能在 一端进行插入操作,在另一端进行 删除操作,遵循先进先出的原则。
栈和队列的应用场景和操作
哈希表是一种高效的查找数据结构, 通过哈希函数将关键字映射到数组 中,实现快速查找。
排序算法包括冒泡排序、插入排序 和快速排序等,可以根据数据规模 和性能要求选择合适的算法。
结语
数据结构的学习心得 总结
学习数据结构需要掌握基本概念 和常见操作,通过实践和练习加 深理解和熟练度。
下一步学习计划的安 排
在掌握基本数据结构的基础上, 可以进一步学习高级数据结构和 算法,提升编程技能。
相关学习资源推荐
推荐一些经典的数据结构教材和 在线学习资源,如《算法导论》 和LeetCode等。
栈和队列在计算机科学中有许多应 用,如函数调用、表达式求值和作 业调度等。
第四章 树与二叉树
树的定义和性质
树是由节点和边组成的一种非线性数据结构,每个 节点可以有多个子节点。
二叉树的遍历方式
二叉树的遍历方式包括前序遍历、中序遍历和后序 遍历,可以按不同顺序输出节点的值。

数据结构讲义精品PPT课件

数据结构讲义精品PPT课件

003 陈诚 02 男 19840910 638
… … … ……

数据元素
数据结构 具有结构的数据元素的集合。它包 括数据元素的逻辑结构、存储结构和相适应的 运算。
逻辑结构
数据元素之间的逻辑关系,与计算机无关。 可用一个二元组表示:Data_Structure = (D,R) D:数据元素的有穷集合,R:集合D上关系的有穷集合。
《The Art of Computer Programming》
Art Evans
数据结构在计算机科学中是一门综合性的专业基础课, 也是计算机专业的必修课,是其它许多课程的先修课程, 是设计编译程序、操作系统、数据库系统等系统程序和 大型应用程序的重要基础。
1.2 基本概念和术语
基本术语
数据 被计算机加工处理的对象。 数据元素(记录、表目) 数据的基本单位,
几种常用的运算有: (1)建立数据结构 (2)清除数据结构 (3)插入数据元素 (4)删除数据元素 (5)排序
(6)检索* (7)更新 (8)判空和判满* (9)求长*
*操作为引用型操作,即数据值不发生变化; 其它为加工型操作。
抽象数据类型
抽象数据类型 ADT( Abstract Data Type ): 数据类型概念的引伸。指一个数学模型以及在其上定义的操作集 合,与计算机无关。 数据类型:一组值的集合和定义在其上的一组操作的总称。
抽象数据类型的描述方法
ADT 抽象数据类型名 { 数据对象:〈数据对象的定义〉 数据关系:〈数据关系的定义〉 基本操作:〈基本操作的定义〉
} ADT 抽象数据类型名
其中基本操作的定义格式为:
基本操作名(参数表) 初始条件:〈初始条件描述〉 操作结果:〈操作结果描述〉
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.4.4 出栈操作
出栈操作就是在栈顶取出数据,栈顶指针随之下移的 操作。每当从栈内弹出一个数据,栈的当前容量就减少1。 可以重复出栈操作,直到该栈变为空栈为止。
1.4.5 栈的其他操作
除了以上介绍的创建栈,入栈,出栈等操作外,对栈 还有一些其他的操作。例如:清空一个栈,销毁一个栈,计 算栈的当前容量等。其实程序员完全可以根据实际编程的需 要来设计这些操作。 1.清空一个栈
1.2.3 从顺序表中删除元素
下面介绍如何删除长度为n的顺序表中的第i个位置的元 素。 所谓删除长度为n的顺序表中的第i个位置的元素,就是 指将顺序表第i个位置上的元素去掉。 函数DelElem的作用是从顺序表Sqlist中删除第i个位置 的元素,并将表的长度值减1。其实现过程如下。 (1)判断要删除的元素是否合法。对于一个长度为n的 顺序表,删除元素的合法位置是1~n,因此如果i<1或者i>n都 是不合法的。 (2)将顺序表的第i位置以后的元素依次前移,这样就 将第i个元素覆盖掉了,也就起到删除第i个位置元素的作用。 (3)最后将表长减1。
2.销毁一个栈 3.计算栈的当前容量
1.4.6 实例与分析
【实例1-4】利用栈的数据结构,将二进制数转换为十进制数。 分析: 二进制数是计算机中数据的存储形式。它是由一串0/1编码组成。 每个二进制数都可以转换成为相应的十进制数,转换的方法如下: 一个二进制数要转换为相应的十进制数,就是从最低位起用每一 位去乘以对应位的基,也就是说用第i位去乘以2i-1,然后再将每一位的 乘积累加,就得到原二进制数对应的十进制表达。 由于栈具有后进先出的特性,因此可以用栈很方便地实现二进制 转换为十进制。具体做法是,将一串二进制的0/1码从高位到低位顺序 入栈,然后再逐一从栈顶取出元素,取出的第i个元素乘以2i-1,再逐一 累加在一起,最终得到该二进制数的十进制表达。
1.2.4 实例与分析
前面介绍了静态顺序表和动态顺序表的定义,创建, 插入元素,删除元素等方法。下面通过具体的实例巩固学到 的知识。 【实例1-1】创建一个静态的顺序表存放整数,大小为 10,完成以下的操作: (1)输入6个整数,打印出顺序表中的内容,并显示 表中剩余的空间个数。 (2)在顺序表中的第3个位置插入元素0,打印出顺序 表中的内容,并显示表中剩余的空间个数。 (3)再试图插入表中第11个位置整数0,程序提示超 出范围 (4)删除表中第6个元素,打印出顺序表中的内容, 并显示表中剩余的空间个数。
1.1 什么是数据结构
数据结构就是指计算机内部数据的组织形式和存储方法。 我们再熟悉不过的数组就是一种简单而典型的线性数据结构类型 。本章中将更加具体地介绍一些常用的数据结构,主要包括:线 性结构、树、图。 线性结构是最常用,也是最简单的一种数据结构。还有一 种常用的数据结构叫做图状结构,简称图结构。图结构中数据元 素之间存在着“多对多”的关系,因此图结构较树结构,线性结 构要复杂得多。在处理一些复杂的问题中,图结构往往能派上用 场。
1.5 队列
1.5.1 队列的定义
队列(queue)也是一种重要的线性结构。与栈相同,实 现一个队列同样需要顺序表或者链表作为基础,也就是说可以 用链表或者顺序表来构造一个队列。但是与栈不同的是,队列 是一种先进先出(FIFO: first in first out)的线性表。它要求所有 的数据从队列的一端进入,从队列的另一端离开。在队列中, 允许插入数据的一端叫做队尾(rear),允许数据离开的一端叫做 队头(front)。
1.5.3 入队列操作
入队列操作就是将一个QNode类型的元素从队列的尾 部进入队列。每当将一个队列元素插入队列,队列的尾指针 都要进行修改(因为元素从队列的尾部进入队列),队头的 指针不发生改变。
1.5.4 出队列操作
出队列操作是将队列中的元素从队列的头部移出。每当 从队列中移出数据时,队头指针不发生改变,但是头结点的 next指针发生改变。队尾指针只有在原队列中只有一个元素, 即队头等于队尾的情况下才会改变,否则也不改变。
下面介绍如何从非空链表中删除q所指的结点。在讨论 这个问题时,必须考虑以下三种情形: (1)q所指向的是链表的第一个结点; (2)q所指向的结点的前驱结点的指针已知; (3)q所指向的结点的前驱结点的指针未知。
1.3.4 销毁一个链表
在链表使用完毕后建议销毁它,因为链表本身会占用内存空 间。如果一个系统中使用很多的链表,而使用完毕后又不及时地 销毁它,那么这些垃圾空间积累过多,最终可能导致内存的泄漏 甚至程序的崩溃。因此应当养成及时销毁不用的链表的习惯。 函数destroyLinkList的作用是销毁一个链表list,它包括以 下步骤。 (1)首先将*list的内容赋值给p,这样p也指向链表的第一 个结点,成为了链表的表头。 (2)然后判断只要p不为空(NULL),就将p指向的下一 个结点的指针(地址)赋值给q,并应用函数free释放掉p所指向 的结点,p再指向下一个结点,如此循环,直到链表为空为止。 (3)最后将*list的内容置为NULL,这样主函数中的链表 list就为空了,防止了list变为野指针。而且链表在内存中也被完 全地释放掉了。
第一章 数据结构基础
要想成为一名真正的程序员,数据结构是必备的基础知识。 只有学过数据结构,才能真正有效规范地组织程序中的数据。而 在实际编程中,有些问题必须通过特定的数据结构才能更方便地 解决。因此数据结构是每一个搞计算机的人都应当十分掌握的知 识。 要想全面而系统地学习数据结构的知识,这里的介绍显然是 不充分的,建议应当找来专门介绍数据结构的书籍学习。如果你 只想掌握一般层次的知识,或是已经学过数据结构,只是为了深 入地学习本书后续的内容而进行回顾和复习,那么本章的介绍是 足够的。
1.3.5 实例与分析
【实例1-3】编写一个程序,要求:从终端输入一组整 数(大于10个数),以0作为结束标志,将这一组整数存放 在一个链表中(结束标志0不包括在内),打印出该链表中 的值;然后删除该链表中的第5个元素,打印出删除后的结 果;最后在内存中释放掉该链表。
1.4 栈
栈是一种重要的线性结构。可以这样讲,栈是前面讲过 的线性表的一种具体形式。也就是说,栈必须通过顺序表或 者链表来实现。顺序表或者链表既可以像前面介绍的那样独 立存在,组织和操作数据,同时它们也是一些特殊的数据结 构(栈,队列等)的实现的基础,它们的概念更宽泛一些。
1.4.1 栈的定义
栈(stack)是一个后进先出(LIFO: last in first out)的 线性表,它要求只在表尾进行删除和插入等操作。也就是说 ,所谓栈其实就是一个线性表(顺序表,链表),但是它在 操作上有一些特殊的要求和限制。首先,栈的元素必须先进 后出,这与一般的顺序表不同。其次,栈的操作只能限定在 这个顺序表的表尾进行。
1.3.1 创建一个链表
建立一条长度为n的链表的全过程,共分为以下几个步骤。 (1)用malloc函数在内存的动态存储区中开辟一块大小为 sizeof(LNode)的空间,并将其地址赋值给LinkList类型变量p,然 后将数据e存入该结点的数据域data,指针域存放NULL。其中数 据e由函数Get获得。 (2)如果指针变量list为空,说明本次生成的结点为第一个 结点,所以将p赋值给list,list是LinkList类型变量,只用来指向 第一个链表结点,因此它是该链表的头指针,最后要返回。 (3)如果指针变量list不为空,则说明本次生成的结点不是 第一个结点,因此将p赋值给r->next。 (4)再将p赋值给r,目的是使r再次指向最后的结点,以便 生成链表的下一个结点,即:保证r永远指向原先链表的最后一个 结点。 (5)最后将生成的链表的头指针list返回主调函数,通过 list就可以访问到该链表的每一个结点,并对该链表进行操作。
1.3 链表
与顺序表相同,链表也是一种线性表,它的数据的逻 辑组织形式是一维的。而与顺序表不同的是,链表的物理存 储结构是用一组地址任意的存储单元存储数据的。也就是说 ,它不像顺序表那样占据一段连续的内存空间,而是将存储 单元分散在内存的任意地址上。在链表结构中,存储的每个 数据元素记录都存放到幢淼囊桓鼋岬悖node)中,而每个 结点之间由指针将其连接在一起,这样就形成了一条如同“ 链”的结构。
1.3.2 向链表中插入结点
下面介绍如何在指针q指向的结点后面插入结点。该过 程的步骤如下: (1)先创建一个新结点,并用指针p指向该结点。 (2)将q指向的结点的next域的值(即q的后继结点的 指针)赋值给p指向结点的next域。 (3)将p的值赋值给q的next域。
1.3.3 从链表中删除结点
1.2 顺序表
在计算机内部存储一张线性表(线性结构的数表), 最为方便简单的就是用一组连续地址的内存单元来存储整张 线性表。这种存储结构称为顺序存储结构,这种存储结构下 的线性表就叫做顺序表。如图1-1所示,就是顺序表的示意 。
1.2.1 顺序表的定义
定义一张顺序表也就是在内存中开辟一段连续的存储 空间,并给它一个名字来标识。只有定义了一个顺序表, 才能利用该顺序表存放数据元素,也才能对该顺序表进行 各种操作。 有两种定义顺序表的方法,一是静态地定义一张顺序 表;二是动态生成一张顺序表。
1.5.5 销毁一个队列
由于链队列是建立在内存的动态区的,因此当一个队 列不再有用时应当把它及时销毁掉,以免过多地占用内存空 间。销毁一个队列的方法与销毁一个链表的方法类似,代码 如下: DestroyQueue(LinkQueue *q){ while(q->front){ q->rear = q->front->next; free(q->front); q->front = q->rear; } } 通过上面的代码可以完整的销毁一个队列,最终q>rear和q->front都为空。
1.2.2 向顺序表中插入元素
下面介绍如何在长度为n的顺序表中的第i个位置插入新元素 item。 所谓在长度为n的顺序表中的第i个位置插入新元素是指在顺序 表第i-1个数据元素和第i个数据元素之间插入一个新元素item。 函数InserElem的作用是在顺序表Sqlist中第i个位置上插入元 素item,并将顺序表长度加1。其实现过程如下。 (1)判断插入元素的位置是否合法。一个长度为n的顺序表的 可能插入元素的位置是1~n+1,因此如果i<1或者i>n+1或者表满 n==MaxSize(因为表的内存大小固定不变)的插入都是非法的。 (2)将顺序表的i-1以后的元素顺序后移一个元素的位置,即 :将顺序表从第i个元素到第n个元素顺序后移一个元素的位置。 (3)在表的第i个位置(下标为i-1)上插入元素item,并将表 长加1。
相关文档
最新文档