数据结构 清华大学出版社 严蔚敏吴伟民编著
- 格式:doc
- 大小:309.50 KB
- 文档页数:63
长春理工大学研究生入学考试《数据结构》考试大纲一、考试科目:数据结构二、适用专业:计算机科学技术学院所有专业三、参考书目:1.《数据结构》(C语言版)严蔚敏吴伟民编著,清华大学出版社, 2011.11。
四、考试内容:(一)主要考查目标1. 理解数据结构的基本概念,掌握数据的逻辑结构、存储结构及其差异,以及基本操作及实现。
2. 掌握基本的数据处理原理和方法,能够对算法进行设计和分析。
3. 能够选择合适的数据结构和方法进行问题求解。
(二)知识点1、线性表1) 线性链表的顺序存储结构;线性链表的链式存储结构;线性表的插入与删除2) 线性表的应用2、栈和队列1) 栈的基本概念;栈的顺序存储结构;栈的链式存储结构;栈的基本操作及应用2) 队列的基本概念;队列的顺序存储结构;队列的链式存储结构;队列的基本操作及应用3、串1) 字符串的基本操作及应用2)字符串的模式匹配4、数组与广义表1) 特殊矩阵的压缩存储2) 广义表的概念和表示;广义表存储结构3)数组及广义表的基本操作和应用5、树与二叉树1) 树的概念2) 二叉树的定义;二叉树的性质;二叉树的顺序存储结构和链式存储结构3) 二叉树遍历4) 线索化二叉树的构造5) 树的存储结构;森林与二叉树的转换;树与森林的遍历6) 哈夫曼(Huffman)树和哈夫曼编码;树的基本应用6、图1) 图的基本概念2) 图的邻接矩阵;邻接表3) 图的深度优先搜索;广度优先搜索4) 最小生成树5) 拓扑排序6)最短路径;关键路径;图的基本应用7、查找1)查找的基本概念2)顺序查找法3)折半查找法4)散列(Hash)表及其查找;散列表与散列方法5)各种查找方法的比较和应用8、内部排序1) 直接插入排序;折半插入排序2) 起泡排序3)简单选择排序4)希尔排序5)快速排序6) 堆排序7) 归并排序8)各种排序方法比较及应用最高贵的复仇是宽容。
有时宽容引起的道德震动比惩罚更强烈。
君子贤而能容罢,知而能容愚,博而能容浅,粹而能容杂。
全国硕士研究生入学统一考试计算机专业课推荐参考书目一、数据结构★严蔚敏、吴伟民编著:《数据结构(c语言版)》,清华大学出版社★严蔚敏、吴伟民编著:《数据结构题集(C语言版)》,清华大学出版社二、计算机组成原理★唐朔飞编著:《计算机组成原理》,高等教育出版社,1999年版★唐朔飞编著:《计算机组成原理学习指导与习题解答》,高等教育出版社,2005年9月★白中英主编:《计算机组成原理》,科学出版社三、操作系统★汤小丹、梁红兵、哲凤屏、汤子瀛编著:《计算机操作系统(第三版)》,西安电子科技大学出版社★梁红兵、汤小丹编著:《计算机操作系统》学习指导与题解(第二版),西安电子科技大学出版社,2008年9月四、计算机网络★谢希仁编著:《计算机网络(第5版)》,电子工业出版社★高传善、毛迪林、曹袖主编:《数据通信与计算机网络(第2版)》,高等教育出版社说明:★为首推书;出版年份不需要严格要求,一般是越新越好,关键以出版社和作者为主要参照。
相关参考辅导书:★本书编写组:《全国硕士研究生入学统一考试计算机专业基础综合考试大纲解析》,高等教育出版社,2008年10月★巩微、冯东晖主编:《2009年考研计算机学科专业基础综合考试全真模拟试题集》,原子能出版社,2008年10月★阳光考研命题研究中心编写:《2009年考研计算机科学专业基础综合考试教程》,中国人民大学出版社,2008年11月2009年计算机科学与技术学科联考高分突破考前冲刺400题一、数据结构1.教材:《数据结构》严蔚敏清华大学出版社清华大学严蔚敏的这本数据结构的教材是国内数据结构教材的权威。
也是国内使用最广,其广度远远超越其他同类教材,计算机考研专业课命题必定以它为蓝本。
这一本数据结构是2007年的最新版本,完全适合任何学校的考研数据结构的复习之用,是数据结构学习最权威的教材。
2.辅导书:《算法与数据结构考研试题精析(第二版)》机械工业出版社网上广为流传的数据结构1800题相信只要是计算机考研的同学无人不知无人不晓。
吉首大学题库一、一、单选题(每题 2 分,共20分)1. 1.对一个算法的评价,不包括如下()方面的内容。
A.健壮性和可读性B.并行性C.正确性D.时空复杂度2. 2.在带有头结点的单链表HL中,要向表头插入一个由指针p指向的结点,则执行( )。
A. p->next=HL->next; HL->next=p;B. p->next=HL; HL=p;C. p->next=HL; p=HL;D. HL=p; p->next=HL;3. 3.对线性表,在下列哪种情况下应当采用链表表示?( )A.经常需要随机地存取元素B.经常需要进行插入和删除操作C.表中元素需要占据一片连续的存储空间D.表中元素的个数不变4. 4.一个栈的输入序列为1 2 3,则下列序列中不可能是栈的输出序列的是( )A. 2 3 1B. 3 2 1C. 3 1 2D. 1 2 35. 5.AOV网是一种()。
A.有向图B.无向图C.无向无环图D.有向无环图6. 6.采用开放定址法处理散列表的冲突时,其平均查找长度()。
A.低于链接法处理冲突 B. 高于链接法处理冲突C.与链接法处理冲突相同D.高于二分查找7.7.若需要利用形参直接访问实参时,应将形参变量说明为()参数。
A.值B.函数C.指针D.引用8.8.在稀疏矩阵的带行指针向量的链接存储中,每个单链表中的结点都具有相同的()。
A.行号B.列号C.元素值D.非零元素个数9.9.快速排序在最坏情况下的时间复杂度为()。
A.O(log2n) B.O(nlog2n) C.0(n) D.0(n2)10.10.从二叉搜索树中查找一个元素时,其时间复杂度大致为( )。
A. O(n)B. O(1)C. O(log2n)D. O(n2)二、二、运算题(每题 6 分,共24分)1. 1.数据结构是指数据及其相互之间的______________。
当结点之间存在M对N(M:N)的联系时,称这种结构为_____________________。
数据结构教材出版社:清华大学出版社作者:严蔚敏吴伟民ISBN :978-7-302-02368-5目录第1章绪论1.1 什么是数据结构1.2 基本概念和术语1.3 抽象数据类型的表现与实现1.4 算法和算法分析第2章线性表2.1 线性表的类型定义2.2 线性表的顺序表示和实现2.3 线性表的链式表示和实现2.4 一元多项式的表示及相加第3章栈和队列3.1 栈3.2 栈的应有和举例3.3 栈与递归的实现3.4 队列3.5 离散事件模拟第4章串4.1 串类型的定义4.2 串的表示和实现4.3 串的模式匹配算法4.4 串操作应用举例第5章数组和广义表5.1 数组的定义5.2 数组的顺序表现和实现5.3 矩阵的压缩存储5.4 广义表的定义5.5 广义表的储存结构5.6 m元多项式的表示5.7 广义表的递归算法第6章树和二叉树6.1 树的定义和基本术语6.2 二叉树6.2.1 二叉树的定义6.2.2 二叉树的性质6.2.3 二叉树的存储结构6.3 遍历二叉树和线索二叉树6.3.1 遍历二叉树6.3.2 线索二叉树6.4 树和森林6.4.1 树的存储结构6.4.2 森林与二叉树的转换6.4.3 树和森林的遍历6.5 树与等价问题6.6 赫夫曼树及其应用6.6.1 最优二叉树(赫夫曼树)6.6.2 赫夫曼编码6.7 回溯法与树的遍历6.8 树的计数第7章图7.1 图的定义和术语7.2 图的存储结构7.2.1 数组表示法7.2.2 邻接表7.2.3 十字链表7.2.4 邻接多重表7.3 图的遍历7.3.1 深度优先搜索7.3.2 广度优先搜索7.4 图的连通性问题7.4.1 无向图的连通分量和生成树7.4.2 有向图的强连通分量7.4.3 最小生成树7.4.4 关节点和重连通分量7.5 有向无环图及其应用7.5.1 拓扑排序7.5.2 关键路径7.6 最短路径7.6.1 从某个源点到其余各顶点的最短路径7.6.2 每一对顶点之间的最短路径第8章动态存储管理8.1 概述8.2 可利用空间表及分配方法8.3 边界标识法8.3.1 可利用空间表的结构8.3.2 分配算法8.3.3 回收算法8.4 伙伴系统8.4.1 可利用空间表的结构8.4.2 分配算法8.4.3 回收算法8.5 无用单元收集8.6 存储紧缩第9章查找9.1 静态查找表9.1.1 顺序表的查找9.1.2 有序表的查找9.1.3 静态树表的查找9.1.4 索引顺序表的查找9.2 动态查找表9.2.1 二叉排序树和平衡二叉树9.2.2 B树和B+树9.2.3 键树9.3 哈希表9.3.1 什么是哈希表9.3.2 哈希函数的构造方法9.3.3 处理冲突的方法9.3.4 哈希表的查找及其分析第10章内部排序10.1 概述10.2 插入排序10.2.1 直接插入排序10.2.2 其他插入排序10.2.3 希尔排序10.3 快速排序10.4 选择排序10.4.1 简单选择排序10.4.2 树形选择排序10.4.3 堆排序10.5 归并排序10.6 基数排序10.6.1 多关键字的排序10.6.2 链式基数排序10.7 各种内部排序方法的比较讨论第11章外部排序11.1 外存信息的存取11.2 外部排序的方法11.3 多路平衡归并的实现11.4 置换一选择排序11.5 最佳归并树第12章文件12.1 有关文件的基本概念12.2 顺序文件12.3 索引文件12.4 ISAM文件和VSAM文件12.4.1 ISAM文件12.4.2 VSAM文件12.5 直接存取文件(散列文件)12.6 多关键字文件12.6.1 多重表文件12.6.2 倒排文件附录A 名词索引附录B 函数索引参考书目。
一、数据结构1.教材:《数据结构》严蔚敏清华大学出版社清华大学严蔚敏的这本数据结构的教材是国内数据结构教材的权威。
也是国内使用最广,其广度远远超越其他同类教材,计算机考研专业课命题必定以它为蓝本。
这一本数据结构是2007年的最新版本,完全适合任何学校的考研数据结构的复习之用,是数据结构学习最权威的教材。
2.辅导书:《算法与数据结构考研试题精析(第二版)》机械工业出版社网上广为流传的数据结构1800题相信只要是计算机考研的同学无人不知无人不晓。
其实1800题是2001年推出来的,当时编者把电子版免费分享给大家,却很少有人知道它也有纸质版本就是《算法与数据结构考研试题精析》。
第二版是2007年最新出版的,对里面的题目进行了大量的更新,去掉了一些比较过时和重复的题,加上了很多名校最近几年的考研真题,总共大约1650题左右。
真题就是训练的最好武器,相信当你复习完这本数据结构辅导书后,任何关于数据结构的考题都是小菜一碟。
二、计算机组成原理1.教材:《计算机组成原理》唐朔飞高等教育出版社《计算机组成原理》白中英科学出版社这两本教材都是普通高等教育十一五国家级规划教材,其权威性不言而喻,在国内是使用最广的两本教材,而前者应该略胜一筹。
而且两位老师说教学的计算机组成原理课程都是国家级精品课程,网上甚至还有他们的讲课视频可以下载,再配合教材的使用,这样可以更加增强学习的效率。
2.辅导书:《计算机组成原理考研指导》徐爱萍清华大学出版社《计算机组成原理--学习指导与习题解答》唐朔飞高等教育出版社清华大学的这套辅导教材在广大的考生中有着极为优秀的口碑,特别是系列中的李春葆《数据结构考研辅导》在数据结构考研辅导资料中占据着数一数二的地位。
这本辅导书通俗易懂,重点突出,特别适合于考研复习,特别是武汉大学以前的专业试题就完全以这本书为蓝本,甚至直接考上面的原题。
唐朔飞的题集上面的题型也比较适合于考研,和它的配套教材一样,是一本不可多得的好书。
第一章绪论之阳早格格创做1、数据结构是预计机中保存、构制数据的办法.粗心采用的数据结构不妨戴去最劣效用的算法.2、步调安排=算法+数据结构3、办理问题要收的效用:●跟数据的构制办法有闭●跟空间的利用效用有闭●跟算法的巧妙程度有闭4、数据:所有能输进到预计机中,且被预计机处理的标记的集中,是预计机收配对付象的总称;是预计机处理的疑息的某种特定的标记表示形式.5、数据元素:数据中的一个“个体”,数据结构中计划的基础单位.相称于“记录”,正在预计机步调中常常动做一个真足思量战处理.6、数据项: 相称于记录的“域”, 是数据的不可分隔的最小单位,如教号.数据元素是数据项的集中.7、数据对付象:本量相共的数据元素的集中.比圆: 所有疏通员的记录集中8、数据结构:是相互间存留某种闭系的数据元素集中.9、数据结构是戴结构的数据元素的集中.10、分歧的闭系形身分歧的结构.11、序次闭系:{<ai,ai+1>|i=1,2,3,4,5,6}12、对付每种数据结构,主要计划如下二圆里的问题:1)数据的逻辑结构,数据结构的基础收配;2)数据的保存结构,数据结构基础收配的真止;13、数据的逻辑结构:数据之间的结构闭系,是简曲闭系的抽象.数据结构的基础收配:指对付数据结构的加工处理.14、数据的保存结构(物理结构):数据结构正在预计机内存中的表示.数据结构基础收配的真止:基础收配正在预计机上的真止(要收).15、数据结构的有闭观念16、数据元素的4类的基础结构:○1集中;○2线性结构:结构中数据元素之间存留一对付一的闭系;○3树形结构:结构中数据元素之间存留一对付多的闭系;○4图状结构大概网状结构:结构中数据元素之间存留多对付多的闭系.17、C谈话的便宜:C谈话不妨间接收配内存.18、每个节面皆由二部分组成:数据域战指针域.19、链接保存结构个性:●比程序保存结构的保存稀度小(每个节面皆由数据域战指针域组成).●逻辑上相邻的节面物理上不必相邻.●拔出、简略机动(不必移动节面,只消改叛变面中的指针).20、数据典型是一个值的集中战定义正在此集中上的一组收配的总称.21、ADT 有二个要害个性:数据抽象战数据启拆.22、抽象数据典型(Abstract Data Type 简称ADT):是指一个数教模型以及定义正在此数教模型上的一组收配.23、抽象数据典型有:数据对付象〈数据对付象的定义〉、数据闭系〈数据闭系的定义〉、基础收配〈基础收配的定义〉.24、数据典型的定义战含意.定义:数据典型是一个值的集中战定义正在那个值集上的一组收配的总称.含意:将数据按一定序次与形式存搁的结构.24、算法空间搀纯度S(n)算法的保存量包罗:①输进数据所占的空间;②步调自己所占的空间;③辅帮变量所占的空间.25、算法具备有贫性、决定性、可止性、输进战输出五大个性.26、抽象数据典型具备数据抽象、数据启拆的个性.27、数据的储藏结构分为:程序保存结媾战链式保存结构.第二章线性表1、线性结构的个性:正在数据元素中的非空有限集结.(1)存留唯一的一个被称做“第一”的数据元素;(2)存留唯一的一个被称做“末尾一个”的数据元素;(3)除第一个中,集中中的每一个数据元素均惟有一个前驱;(4)除末尾一个中,集中中的每一个数据元素均惟有一个后继.2、线性表(Linear List) :一个线性表是n个数据元素的有限序列.3、线性表的程序保存真止:typedef struct {ElementType Data[MAXSIZE];int Last;} List;List L, *PtrL;4、初初化(建坐空的程序表)List *MakeEmpty( ){ List *PtrL;PtrL = (List *)malloc( sizeof(List) );PtrL->Last = -1;return PtrL;}5、查找int Find( ElementType X, List *PtrL ){ int i = 0;while( i <= PtrL->Last && PtrL->Data[i]!= X )i++;if (i > PtrL->Last) return -1; /* 如果出找到,返回-1 */else return i; /* 找到后返回的是保存位子*/}6、拔出算法void Insert( ElementType X, int i, List *PtrL ){ int j;if ( PtrL->Last == MAXSIZE-1 ){ /* 表空间已谦,不克不迭拔出*/printf("表谦");return;}if ( i < 1 || i > PtrL->Last+2) { /*查看拔出位子的合法性*/printf("位子分歧法");return;}for ( j = PtrL->Last; j >= i-1; j-- )PtrL->Data[j+1] = PtrL->Data[j]; /*将ai~an 倒序背后移动*/PtrL->Data[i-1] = X; /*新元素拔出*/PtrL->Last++; /*Last仍指背末尾元素*/return;}7、简略算法void Delete( int i, List *PtrL ){ int j;if( i < 1 || i > PtrL->Last+1 ) { /*查看空表及简略位子的合法性*/printf (“不存留第%d个元素”, i );return ;}for ( j = i; j <= PtrL->Last; j++ )PtrL->Data[j-1] = PtrL->Data[j]; /*将ai+1~an 程序背前移动*/PtrL->Last--; /*Last仍指背末尾元素*/return;}8、供表少int Length ( List *PtrL ){ List *p = PtrL; /* p指背表的第一个结面*/ int j = 0;while ( p ) {p = p->Next;j++; /* 目前p指背的是第j 个结面*/}return j;}9、查找(1)顺次号查找: FindKth;List *FindKth( int K, List *PtrL ){ List *p = PtrL;int i = 1;while (p !=NULL && i < K ) {p = p->Next;i++;}if ( i == K ) return p;/* 找到第K个,返回指针*/else return NULL;/* 可则返回空*/}(2)按值查找: FindList *Find( ElementType X, List *PtrL ){List *p = PtrL;while ( p!=NULL && p->Data != X )p = p->Next;return p;}10、拔出(正在链表的第i-1(1≤i≤n+1)个结面后拔出一个值为X的新结面)List *Insert( ElementType X, int i, List *PtrL ){ List *p, *s;if ( i == 1 ) { /* 新结面拔出正在表头*/s = (List *)malloc(sizeof(List)); /*申请、挖拆结面*/s->Data = X;s->Next = PtrL;return s; /*返回新表头指针*/}p = FindKth( i-1, PtrL ); /* 查找第i-1个结面*/if ( p == NULL ) { /* 第i-1个不存留,不克不迭拔出*/printf("参数i错");return NULL;}else {s = (List *)malloc(sizeof(List)); /*申请、挖拆结面*/s->Data = X;s->Next = p->Next; /*新结面拔出正在第i-1个结面的后里*/p->Next = s;return PtrL;}}11、简略(简略链表的第i (1≤i≤n)个位子上的结面)List *Delete( int i, List *PtrL ){ List *p, *s;if ( i == 1 ) { /* 若要简略的是表的第一个结面*/s = PtrL; /*s指背第1个结面*/PtrL = PtrL->Next; /*从链表中简略*/free(s); /*释搁被简略结面*/return PtrL;}p = FindKth( i-1, PtrL ); /*查找第i-1个结面*/if ( p == NULL ) {printf(“第%d个结面不存留”, i-1); return NULL;} else if ( p->Next == NULL ){printf(“第%d个结面不存留”, i); return NULL;} else {s = p->Next; /*s指背第i个结面*/p->Next = s->Next; /*从链表中简略*/free(s); /*释搁被简略结面*/return PtrL;}}12、链表不具备的个性是 1 .①可随机考察任一节面②拔出简略不须要移动元素③不必预先预计保存空间④所需空间与其少度成正比13、戴头结面的单链表head为空的判决条件是 2 .①head==NULL ②head->next==NULL③head->next==head ④head!=NULL14、如果最时常使用的收配是与第i个结面及其前驱,则采与 4 保存办法最节省时间.①单链表②单链表③单循环链表④程序表第三章Chapter 3 栈(stacks)战行列(queues)1、栈是规定仅能正在表尾一端举止拔出、简略收配的线性表.2、栈的个性是“后进栈的元素先出栈”(last in, first out),故栈又称为后进先出表(LIFO).3、一个栈是一些元素的线形列表,其中元素的拔出战简略均正在表的共一端举止.拔出战简略爆收的一端称为栈顶(the top of the stack).4、第一个进栈的元素正在栈底,末尾一个进栈的元素正在栈顶,第一个出栈的元素为栈顶元素,末尾一个出栈的元素为栈底元素.5、连绝栈(Contiguous Stack)的典型定义#define MaxStack 50Typedef struct{datatype stack[MaxStack];int top;}Seqstack;Seqstack *s;6、推断栈是可已谦?viod Push(Seqstack *s, datatype x ){if (s->top>=MaxStack-1) printf(“ overflow” );else {s-> top++;s->stack[s->top]=x;}}7、推断栈是可为空?datatype pop(Seqstack *s ){ if (s->top<0){printf(“underflow”); return(NU LL);}return(s->stack[s->top]);s->top--;}8、返回栈顶元素的值,栈不爆收变更.datatype top(Seqstack *s ){ if (s->top<0){printf(“underflow”); return(NULL);}return(s->stack[s->top]);}9、链栈(Linked Stack)的典型定义栈的链式保存结构称为链栈,它是运算受限的单链表,拔出战简略收配仅节制正在表头位子上举止.由于只可正在链表头部举止收配,故链表不需要像单链表那样附加头结面.栈顶指针便是链表的头指针.链栈的典型证明如下:typedef struct stacknode {datatype datastruct stacknode *next}stacknode10、链式栈的个性:链式栈无栈谦问题;空间可扩充;拔出与简略仅正在栈顶处真止;链式栈的栈顶正在链头;切合于多栈收配.11、栈是规定仅能正在表的一端举止拔出、简略收配的线性表.12、栈的元素具备后进先出的个性.13、栈顶元素的位子由栈顶指针的指示, 进栈、出栈收配要建改栈顶指针.14、抽象数据典型行列的定义:行列(Queue)也是一种运算受限的线性表.它只允许正在表的一端举止拔出,而正在另一端举止简略.允许简略的一端称为队头(front),允许拔出的一端称为队尾(rear).15、行列亦称做进步先出(First In First Out)的线性表,简称FIFO表.16、单端行列:便是规定拔出战简略收配正在表的二端举止的线性表.17、链行列结面定义:typedef struct Qnode{ QElemType data;struct QNode *next;} QNode,*QueuPtr;18、行列的程序保存结构称为程序行列,正在行列的程序保存结构中,除了用一组天面连绝的储藏单元依次存搁从队头到队尾的元素除中,尚需要附设二个指针front战rear分别指示行列头元素战行列尾元素的位子.19、正在非空行列中,头指针末究指背队头元素,而尾指针末究指背队尾元素的下一位子.20、栈的个性是进步后出,行列的个性是进步后出.21、栈战行列的共共个性是只允许正在端面处拔出战简略元素.22、一个栈的进栈序列是a,b,c,d,e,则栈的不可能的输出序列是C .(A)edcba (B)decba (C)dceab (D)abcde23、若已知一个栈的进栈序列是p1,p2,p3,…,pn .其输出序列为1,2,3,…,n ,若p3=1,则p1为 C .(A)大概是2(B)一定是2(C)不可能是2 (D)不可能是324、设有一个空栈,栈顶指针为1000H(十六进制,下共),现有输进序列为1、2、3、4、5,通过PUSH,PUSH,POP,PUSH,POP,PUSH,PUSH后,输出序列是3,栈顶指针是8.①5、4、3、2、1 ②2、1 ③2、3④3、4 ⑤1002H ⑥1004H⑦1005H ⑧1003H24、一个行列的进队序列是若1,2,3,4,则行列的输出序列是 B .(A)4,3,2,1 (B)1,2,3,4(C)1,4,3,2 (D)3,2,4,1 25、若用一个大小为6的一维数组去真止循环行列,且目前rear战front的值分别为0战3.当从行列中简略一个元素,再加进二个元素后,rear战front的值分别是 B .(A)1战5 (B)2战4 (C)4战2 (D)5战126、有5个元素,其进栈序次为A、B、C、D、E,正在百般大概的出栈序次中,以元素C、D最先出栈(即C第一个且D第二个出栈)的序次有哪几个?C、D、B、A、E C、D、E、B、AC、D、B、E、A第六章树战二叉树1、树型结构是一类要害的非线性结构.2、树的定义:树是n(n>=0)个结面的有限集T,T为空时称为空树,可则它谦脚如下二个条件:(1)有且仅有一个特定的称为根的结面;(2)当n>1时,其余结面可分为m(m>0)个互不相接的有限集T1,T2,T3…Tm,其中每身材集又是一棵树,并称其为根的子树.3、基础术语结面——表示树中的元素,包罗数据项及若搞指背其子树的分收结面的度(degree)——结面拥有的子树数叶子(leaf)——度为0的结面孩子(child)——结面子树的根称为该结面的孩子单亲(parents)——孩子结面的表层结面喊该结面的~兄弟(sibling)——共一单亲的孩子树的度——一棵树中最大的结面度数结面的条理(level)——从根结面算起,根为第一层,它的孩子为第二层……深度(depth)——树中结面的最大条理数森林(forest)——m(m0)棵互不相接的树的集中例题:4、二叉树是由n(n>=0)个结面的有限集中形成,此集中大概者为空集,大概者由一个根结面及二棵互不相接的安排子树组成,而且安排子树皆是二叉树.二叉树不妨是空集中,根不妨有空的左子树大概空的左子树.本量1: 正在二叉树的第i层上至多有2i-1个结面(i>=1).本量2:深度为k的二叉树至多有2k-1个结面(k>=1).本量3:对付所有一棵二叉树T,如果其末端结面数为n0,度为2的结面数为n2,则n0=n2+1.本量4:具备n个结面的真足二叉树的深度为log2n+1.本量5:如果对付一棵有n个结面的真足二叉树的结面按层序编号(从第1层到第log2n +1层,每层从左到左),则对付任一结面i(1<=i<=n),有:(1)如果i=1,则结面i无单亲,是二叉树的根;如果i>1,则其单亲是结面i/2.(2)如果2i>n,则结面i为叶子结面,无左孩子;可则,其左孩子是结面2i.(3)如果2i+1>n,则结面i无左孩子;可则,其左孩子是结面2i+1.一棵深度为k且有2k-1个结面的二叉树称为谦二叉树.如:5、二叉树的保存结构●程序保存结构define MAX-TREE-SIZE 100Typedef TelemType SqBiTree[ MAX-TREE-SIZE];SqBitree bt;缺面是有大概对付保存空间制成极大的浪费.●链式保存结构二叉链式保存结构typedef struct BiTNode{ TElemType data;struct BiTNode *lchild, *rchild;}BiTNode,*BiTree;三叉链表typedef struct node{ datatype data;struct node *lchild, *rchild, *parent;}JD;6、遍历二叉树二叉树是由三个基础单元组成:根结面、左子树战左子树.若规定先左后左,则惟有前三种情况,分别称之为先(根)序遍历,中(根)序遍历战后(根)序遍历.(1)先序遍历算法若二叉树为空树,则空收配;可则,●考察根结面;●先序遍历左子树;●先序遍历左子树.void PreOrder(BiTree bt){/*先序遍历二叉树bt*/if (bt==NULL) return; /*递归调用的中断条件*/Visite(bt->data); /*(1)考察结面的数据域*/PreOrder(bt->lchild); /*(2)先序递归遍历bt的左子树*/ PreOrder(bt->rchild);/*(3)先序递归遍历bt的左子树*/}例题:先序遍历序列:A B D Cvoid preorder(JD *bt){ if(bt!=NULL){ printf("%d\t",bt->data);preorder(bt->lchild);preorder(bt->rchild);}}(2)中序遍历算法若二叉树为空树,则空收配;可则,●先序遍历左子树;●考察根结面;●先序遍历左子树.void InOrder(BiTree bt){/*先序遍历二叉树bt*/if (bt==NULL) return; /*递归调用的中断条件*/InOrder(bt->lchild); /*(2)先序递归遍历bt的左子树*/ Visite(bt->data); /*(1)考察结面的数据域*/InOrder(bt->rchild);/*(3)先序递归遍历bt的左子树*/}例题:中序遍历序列:B D A C(3)后序遍历算法若二叉树为空树,则空收配;可则,●先序遍历左子树;●先序遍历左子树;●考察根结面.void PostOrder(BiTree bt){/*后序遍历二叉树bt*/if (bt==NULL) return; /*递归调用的中断条件*/PostOrder(bt->lchild);/*(1)后序递归遍历bt的左子树*/ PostOrder(bt->rchild); /*(2)后序递归遍历bt的左子树Visite(bt->data); /*(3)考察结面的数据域*/}例题:后序遍历序列:D B C A(4)条理遍历所谓二叉树的条理遍历,是指从二叉树的第一层(根结面)启初,从上至下逐层遍历,正在共一层中,则按从左到左的程序对付结面逐个考察.条理遍历序列:1 2 3 4 5 67、例题:1、先序序列:A B C D E F G H K中序序列:B D C A E H G K F后序序列:D C B H K G F E K条理序列:A B E C F D G H K2、若先序遍历此二叉树,按考察结面的先后序次将结面排列起去,其先序序列为:-+a*b-cd/ef按中序遍历,其中序序列为:a+b*c-d-e/f按后序遍历,其后序序列为:abcd-*+ef/ -8、(1)查询二叉树中某个结面Status Preorder (BiTree T, ElemType x, BiTree &p) {// 若二叉树中存留战x 相共的元素,则p 指背该结面并//返回OK,// 可则返回FALSEif (T) {if (T->data= =x) { p = T; return OK,}else {if (Preorder(T->lchild, x, p))return OK;else (Preorder(T->rchild, x, p)) return OK;}//else}//ifelse return FALSE;}(2)预计二叉树中叶子结面的个数int CountLeaf (BiTree T){//返回指针T所指二叉树中所有叶子结面个数if (!T ) return 0;if (!T->lchild && !T->rchild) return 1;else{m = CountLeaf( T->lchild);n = CountLeaf( T->rchild);return (m+n);} //else } // CountLeaf(3)供二叉树的深度(后序遍历)int Depth (BiTree T ){ // 返回二叉树的深度if ( !T ) depthval = 0; else {depthLeft = Depth( T->lchild );depthRight= Depth( T->rchild );depthval = 1 + (depthLeft > depthRight ?depthLeft : depthRight);}return depthval;}(4)按先序遍历序列建坐二叉树Status CreateBiTree (BiTree &T ){ //按先序序次输进二叉树中结面的值(一个字符),空格字符表示空树,构制二叉链表表示的二叉树Tscanf (&ch);if ( ch==‘‘ ) T=NULL; else {if(!T=(BiTNode *)malloc(sizeof(BiTNode)))) exit (OVERFLOW);T->data=ch; //死成根结面CreateBiTree(T->lchild);//构制左子树CreateBiTree(T->rchild);//构制左子树}Return OK; }//CreateBiTree9、遍历二叉树的非递归算法(1)先序遍历二叉树的非递归算法void inorder(JD *r)//先序遍历二叉树非递归算法// { int i=0; JD *p,*s[M]; p=r;do {while(p!=NULL) {printf("%d\t",p->data);if (p->rc!=NULL)s[i++]=p->rc;p=p->lc;}if ( i > 0) p=s[--i];}while( i>0 || p!=NULL); }(2)中序遍历二叉树的非递归算法void inorder(JD *r)//先序遍历二叉树非递归算法// { int i=0; JD *p,*s[M]; p=r;do {while(p!=NULL) {{s[i++]=p; p=p->lc;}if (i>0){p=s[--i];printf("%d\t",p->data);p=p->lc;}if ( i > 0) p=s[--i];}while( i>0 || p!=NULL); }(3)后序遍历二叉树的非递归算法void inorder(JD *r)//先序遍历二叉树非递归算法// { int s2[M],b,i=0; JD *p,*s1[M]; p=r;do {while(p!=NULL) {{s1[i-1]=p;s2[i++]=0;p=p->lc;}while (i>0 && (s2[i-1]=1)){p=s1[--i]; printf(“%d\t”,p->data ); }if (i>0){p=s[--i];printf("%d\t",p->data);p=p->lc;}if ( i > 0){ s2[i-1]=1; p=s1[i-1]; p=p->rc; }}while( i>0); }11、线索二叉树:以二叉链表动做保存结构时,只可找到结面的安排孩子的疑息,而不克不迭正在结面的任一序列的前驱与后继疑息,那种疑息惟有正在遍历的动背历程中才搞得到,为了能保存所需的疑息,可减少标记域;Ltag=0 ,lchild 域指示结面的左孩子;Ltag=1,lchild 域指示结面的前驱.Rtag=0,rchild 域指示结面的左孩子;Rtag=1,rchild 域指示结面的后驱.以那种结构形成的二叉链表动做二叉树的保存结构,喊搞线索链表,其中指背结面前驱与后继的指针喊搞线索,加上线索的二叉树称之为线索二叉树.(1)先序线索二叉树(2)中序线索二叉树(3)后序线索二叉树12、树的保存结构○1单亲表示法#define MAX_TREE_SIZE 100typedef struct PTNode {//结面结构ElemType data;int parent; // 单亲位子域} PTNode;typedef struct {//树结构PTNode nodes[MAX_TREE_SIZE];int r, n; // 根结面的位子战结面个数} PTree;○2孩子表示法○3戴单亲的孩子链表○4孩子兄弟表示法链表中每个结面的二个指针域分别指背其第一个孩子结面战下一个兄弟结面.typedef struct node{ datatype data;struct node *fch, *nsib;}JD;13、树战森林与二叉树的变换加线:正在兄弟之间加一连线.抹线:对付每个结面,除了其左孩子中,去除其与其余孩子之间的闭系,转动:以树的根结面为轴心,将整树顺时针转45°.13、将二叉树变换成树加线:若p结面是单亲结面的左孩子,则将p的左孩子,左孩子的左孩子,……沿分收找到的所有左孩子,皆与p的单亲用线连起去.●抹线:抹掉本二叉树中单亲与左孩子之间的连线●安排:将结面按条理排列,产死树结构14、森林变换二叉树(1)将各棵树分别变换成二叉树.(2)将每棵树的根结面用线贯串.(3)以第一棵树根结面为二叉树的根,再以根结面为轴心,顺时针转动,形成二叉树型结构14、二叉树变换成森林抹线:将二叉树中根结面与其左孩子连线,及沿左分收搜索到的所有左孩子间连线局部抹掉,使之形成孤坐的二叉树.还本:将孤坐的二叉树还本成15、树战森林的遍历树的遍历二种序次遍历树的要收:一种是先根(序次)遍历树,即先考察树的根结面,而后依次先根遍历根的每棵子树;一种是后根(序次)遍历,即先依次后根遍历每棵子树,而后考察根结面.森林的遍历先序遍历:A B C D E F G H I J中序遍历:B C D A F E H J I G16、赫妇曼树及其应用例题:w={5, 29, 7, 8, 14, 23, 3, 11}习题:1、由于二叉树中每个结面的度最大为2,所以二叉树是一种特殊的树,那种道法B .(A)粗确(B)过得2、某二叉树的先序遍历序列战后序遍历序列正佳差异,则该二叉树一定是D .(A)空大概惟有一个结面(B)真足二叉树(C)二叉排序树(D)下度等于其节面数3、深度为5的二叉树至多有C 个结面.(A)16 (B)32 (C)31 (D)104、根据使用频次为5个字符安排的赫妇曼编码不可能是C .(A)111,110,10,01,00(B)000,001,010,011,1(C)100,11,10,1,0(D)001,000,01,11,105、树战二叉树的主要不共是(1)树的结面个数起码为1,而二叉树的结面个数不妨为0(2)树中结面的最漂亮数不节制,而二叉树结面的最漂亮数为2(3)树的结面无左、左之分,而二叉树的结面左左、左之分.6、深度为k的真足二叉树起码有个结面,至多有个结面,若按自上而下,从左到左序次给结面编号(从1启初),则编号最小的叶子结面的编号.7、一棵二叉树的第i(i1)层最多有个结面;一棵有n(n>0)个结面的谦二叉树公有个叶子结面战个非叶子结面.8、已知二叉树的先序、中序战后序序列分别如下,其中有一些瞅不浑的字母用*表示,请构制出一棵切合条件的二叉树并绘出该二叉树.●先序序列是:*BC**FG●中序序列是:CB*EAG*●后序序列是:*EDB*FA9、将左图所示的树转移为二叉树,并写出先序遍历,中序遍历战后序遍历的截止.解:先序:ABEFGCDHI中序:EFGBCHIDA后序:GFEIHDCBA10、设给定权集w={2,3,4,7,8,9},试构制闭于w的一棵赫妇曼树,并供其加权路径少度WPL.WPL=(9+7+8)*2+4*3+(2+3)*4=80第十章里里排序1、内排序大概可分为五类:拔出排序、接换排序、采用排序、归并排序战调配排序.2、间接拔出排序间接拔出的算法真止void sort(NODE array[],int n)//待排序元素用一个数组array[ ] 表示,数组有n个元素{ int i, j;NODE x; // x 为中间结面变量for ( i=1; i<n; i++) //i表示拔出次数,共举止n-1次拔出{ x=array[i]; //把待排序元素赋给xj=i-1;while ((j>=0)&& ( x.key<array[j].key)){array[j+1]=array[j]; j--; } // 程序比较战移动array[j+1]=x; }}比圆,n=6,数组R 的六个排序码分别为:17,3,25,14,20,9.它的间接拔出排序的真止历程如图7-1所示. 间接拔出排序的时间搀纯度为O (n2). 间接拔出算法的元素移动是程序的,该要收是宁静的. 3、希我排序 希我排序的时间搀纯性正在O (nlog2n )战O (n2 )之间,大概为O (n1.3).由于希我排序对付每身材序列单独比较,正在比较时举止元素移动,有大概改变相共排序码元素的本初程序,果此希我排序是不宁静的. 比圆,n=8,数组array[ ]的八个元素分别为:91,67,35,62,29,72,46,57.底下用图10-2给出希我排序算法的真止历程.4、 接换排序1)冒泡排序冒泡排序的算法真止void Bubblesort( NODE array[],int n){ int i, j, flag; //当flag 为0则停止排序NODE temp;for ( i=1; i<n; i++) // i 表示趟数,最多n-1趟 { flag=0; //启初时元素已接换0 1 2 3 4 5初始状态 (17 ) 3 25 14 20 9 第一次插入 (3 17 ) 25 14 20 9 第二次插入 (3 17 25 ) 14 20 9 第三次插入 (3 14 17 25 ) 20 9第四次插入 (3 14 17 20 25 ) 9第五次插入 (3 9 14 17 20 25)图10-1直接插入排序示例for ( j=n-1; j>=i; j--)if (array[j].key<array[j-1].key) //爆收顺序temp=array[j];array[j]=array[j-1];array[j-1]=temp;flag=1; } //接换,并标记表记标帜爆收了接换if(flag==0) break; }}比圆,n=6,数组R的六个排序码分别为:17,3,25,14,20,9.底下用图10-3给出冒泡排序算法的真止历程.冒泡排序算法的时间搀纯度为O(n2).由于其中的元素移动较多,所以属于内排序中速度较缓的一种.果为冒泡排序算法只举止元素间的程序移动,所以是一个宁静的算法.2)赶快排序赶快排序(Quick Sorting)是迄今为止所有内排序算法中速度最快的一种.赶快排序的算法真止void quicksort(NODE array[],int start , int end){ int i , j; NODE mid;if (start>=end) return;i=start;j=end;mid=array[i];while (i<j){ while (i<j && array[j].key>mid.key) j--;if (i<j) {array[i]=array[j]; i++; }while (i<j && array[i].key<=mid.key) i++;if (i<j) {array[j]=array[i]; j--; } } //一次区分得到基准值的粗确位子array[i]=mid;quicksort(array,start,i-1); //递归调用左子区间quicksort(array,i+1,end); }//递归调用左子区间比圆,给定排序码为:(46,55,13,42,94,05,17,70),简曲区分如图10-4所示.赶快排序所占用的辅帮空间为栈的深度,故最佳的空间搀纯度为O(log2n),最坏的空间搀纯度为O(n).赶快排序是一种不宁静的排序要收.5、采用排序1)间接采用排序比圆,给定n=8,数组R中的8个元素的排序码为:(8,3,2,1,7,4,6,5),则间接采用排序历程如图7-5所示.间接采用排序的时间搀纯度为O(n2)数量级2)树形采用排序比圆,给定排序码头50,37,66,98,75,12,26,49,树形采用排序历程睹图7-7.3)堆排序比圆,给定排序码49,38,65,97,76,13,27,70,建坐初初堆的历程如图7-8所示.按条理遍历真足二叉树,得到一个由大到小排列的有序序列:97,76,70,65,49,38,27,13屡屡筛选运算的时间搀纯度为O(log2n),故所有堆排序历程的时间搀纯度为O(nlog2n).5、归并排序比圆,给定排序码46,55,13,42,94,05,17,70,二路归并排序历程如图7-10所示.二路归并排序的时间搀纯度为O(nlog2n).6、百般内排序要收的比较战采用1)从时间搀纯度比较从仄衡时间搀纯度去思量,间接拔出排序、冒泡排序、间接采用排序是三种简朴的排序要收,时间搀纯度皆为O(n2),而赶快排序、堆排序、二路归并排序的时间搀纯度皆为O(nlog2n),希我排序的搀纯度介于那二者之间.若从最佳的时间搀纯度思量,则间接拔出排序战冒泡排序的时间搀纯度最佳,为O(n),其余的最佳情形共仄衡情形相共.若从最坏的时间搀纯度思量,则赶快排序的为O(n2),间接拔出排序、冒泡排序、希我排序共仄衡情形相共,但是系数约莫减少一倍,所以运止速度将落矮一半,最坏情形对付间接采用排序、堆排序战归并排序做用不大.2)从空间搀纯度比较归并排序的空间搀纯度最大,为O(n),赶快排序的空间搀纯度为O(log2n),其余排序的空间搀纯度为O(1).3)从宁静性比较间接拔出排序、冒泡排序、归并排序是宁静的排序要收,而间接采用排序、希我排序、赶快排序、堆排序是不宁静的排序要收.4)从算法简朴性比较间接拔出排序、冒泡排序、间接采用排序皆是简朴的排序要收,算法简朴,易于明白,而希我排序、赶快排序、堆排序、归并排序皆是矫正型的排序要收,算法比简朴排序要搀纯得多,也易于明白.8、百般内排序要收的采用1)从时间搀纯度采用对付元素个数较多的排序,不妨选赶快排序、堆排序、归并排序,元素个数较少时,不妨选简朴的排序要收.2)从空间搀纯度采用尽管选空间搀纯度为O(1)的排序要收,其次选空间搀纯度为O(log2n)的赶快排序要收,末尾才选空间搀纯度为。
数据结构考研参考书
数据结构是计算机科学和软件工程学科中的核心课程,也是考研的重要科目之一。
以下是一些建议的考研参考书:
1. 《数据结构(C语言版)》——严蔚敏、吴伟民编著,清华大学出版社。
这本书是国内最经典的数据结构教材之一,被广大考生认为是必备的参考书之一。
它涵盖了所有考研数据结构的知识点,并且讲解深入浅出,易于理解。
2. 《数据结构题集(C语言版)》——严蔚敏、吴伟民编著,清华大学出版社。
这本书是上述教材的配套题集,包含了大量的练习题和真题,对于考研生来说非常有价值。
通过练习这些题目,可以加深对数据结构的理解和掌握。
3. 《算法与数据结构考研试题精析(第二版)》——陈守孔、胡潇琨、李
玲编著,机械工业出版社。
这本书是一本经典的数据结构和算法考研辅导书,包含了大量的历年真题和解析。
通过做题和看解析,可以更好地理解考研的出题方式和解题技巧。
4. 《数据结构与算法分析(C语言版)》——殷人昆、田金兰编著,机械工业出版社。
这本书也是一本经典的数据结构和算法教材,内容深入浅出,易于理解。
它涵盖了考研数据结构的大部分知识点,并且有丰富的实例和练习题。
5. 《考研数学(一)历年真题详解与标准解答》——杨超主编,高等教育出版社。
虽然这本书不是专门针对数据结构的教材,但是它包含了大量的历年真题和标准答案,对于考研生来说非常有价值。
通过做真题和看标准答案,可以更好地了解考研的出题方式和评分标准。
以上是一些建议的考研参考书,希望能对你有所帮助。
同时,也要注意多做真题和模拟题,加强自己的实战能力。
祝你考试顺利!。
第一章绪论1、数据结构是计算机中存储、组织数据的方式。
精心选择的数据结构可以带来最优效率的算法。
2、程序设计= 算法+数据结构3、解决问题方法的效率:●跟数据的组织方式有关●跟空间的利用效率有关●跟算法的巧妙程度有关4、数据:所有能输入到计算机中,且被计算机处理的符号的集合,是计算机操作对象的总称;是计算机处理的信息的某种特定的符号表示形式。
5、数据元素:数据中的一个“个体”,数据结构中讨论的基本单位。
相当于“记录”,在计算机程序中通常作为一个整体考虑和处理。
6、数据项: 相当于记录的“域”, 是数据的不可分割的最小单位,如学号。
数据元素是数据项的集合。
7、数据对象:性质相同的数据元素的集合.例如: 所有运动员的记录集合8、数据结构:是相互间存在某种关系的数据元素集合。
9、数据结构是带结构的数据元素的集合。
10、不同的关系构成不同的结构。
11、次序关系:{<ai,ai+1>|i=1,2,3,4,5,6}12、对每种数据结构,主要讨论如下两方面的问题:1)数据的逻辑结构,数据结构的基本操作;2)数据的存储结构,数据结构基本操作的实现;13、数据的逻辑结构:数据之间的结构关系,是具体关系的抽象。
数据结构的基本操作:指对数据结构的加工处理。
14、数据的存储结构(物理结构):数据结构在计算机内存中的表示。
数据结构基本操作的实现:基本操作在计算机上的实现(方法)。
15、数据结构的有关概念16、数据元素的4类的基本结构:○1集合;○2线性结构:结构中数据元素之间存在一对一的关系;○3树形结构:结构中数据元素之间存在一对多的关系;○4图状结构或网状结构:结构中数据元素之间存在多对多的关系。
17、C语言的优点:C语言可以直接操作内存。
18、每个节点都由两部分组成:数据域和指针域。
19、链接存储结构特点:●比顺序存储结构的存储密度小(每个节点都由数据域和指针域组成)。
●逻辑上相邻的节点物理上不必相邻。
●插入、删除灵活(不必移动节点,只要改变节点中的指针)。
20、数据类型是一个值的集合和定义在此集合上的一组操作的总称。
21、ADT 有两个重要特征:数据抽象和数据封装。
22、抽象数据类型(Abstract Data Type 简称ADT):是指一个数学模型以及定义在此数学模型上的一组操作。
23、抽象数据类型有:数据对象〈数据对象的定义〉、数据关系〈数据关系的定义〉、基本操作〈基本操作的定义〉。
24、数据类型的定义和含义。
定义:数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
含义:将数据按一定次序与形式存放的结构。
24、算法空间复杂度S(n)算法的存储量包括:①输入数据所占的空间;②程序本身所占的空间;③辅助变量所占的空间。
25、算法具有有穷性、确定性、可行性、输入和输出五大特性。
26、抽象数据类型具有数据抽象、数据封装的特点。
27、数据的储存结构分为:顺序存储结构和链式存储结构。
第二章线性表1、线性结构的特点:在数据元素中的非空有限集中。
(1)存在唯一的一个被称作“第一”的数据元素;(2)存在唯一的一个被称作“最后一个”的数据元素;(3)除第一个外,集合中的每一个数据元素均只有一个前驱;(4)除最后一个外,集合中的每一个数据元素均只有一个后继。
2、线性表(Linear List) :一个线性表是n个数据元素的有限序列。
3、线性表的顺序存储实现:typedef struct {ElementType Data[MAXSIZE];int Last;} List;List L, *PtrL;4、初始化(建立空的顺序表)List *MakeEmpty( ){ List *PtrL;PtrL = (List *)malloc( sizeof(List) );PtrL->Last = -1;return PtrL;}5、查找int Find( ElementType X, List *PtrL ){ int i = 0;while( i <= PtrL->Last && PtrL->Data[i]!= X )i++;if (i > PtrL->Last) return -1; /* 如果没找到,返回-1 */else return i; /* 找到后返回的是存储位置*/}6、插入算法void Insert( ElementType X, int i, List *PtrL ){ int j;if ( PtrL->Last == MAXSIZE-1 ){ /* 表空间已满,不能插入*/printf("表满");return;}if ( i < 1 || i > PtrL->Last+2) { /*检查插入位置的合法性*/printf("位置不合法");return;}for ( j = PtrL->Last; j >= i-1; j-- )PtrL->Data[j+1] = PtrL->Data[j]; /*将ai~an倒序向后移动*/PtrL->Data[i-1] = X; /*新元素插入*/PtrL->Last++; /*Last仍指向最后元素*/return;}7、删除算法void Delete( int i, List *PtrL ){ int j;if( i < 1 || i > PtrL->Last+1 ) { /*检查空表及删除位置的合法性*/printf (“不存在第%d个元素”, i );return ;}for ( j = i; j <= PtrL->Last; j++ )PtrL->Data[j-1] = PtrL->Data[j]; /*将ai+1~an顺序向前移动*/PtrL->Last--; /*Last仍指向最后元素*/return;}8、求表长int Length ( List *PtrL ){ List *p = PtrL; /* p指向表的第一个结点*/int j = 0;while ( p ) {p = p->Next;j++; /* 当前p指向的是第j 个结点*/}return j;}9、查找(1)按序号查找: FindKth;List *FindKth( int K, List *PtrL ){ List *p = PtrL;int i = 1;while (p !=NULL && i < K ) {p = p->Next;i++;}if ( i == K ) return p;/* 找到第K个,返回指针*/else return NULL;/* 否则返回空*/}(2)按值查找: FindList *Find( ElementType X, List *PtrL ){List *p = PtrL;while ( p!=NULL && p->Data != X )p = p->Next;return p;}10、插入(在链表的第i-1(1≤i≤n+1)个结点后插入一个值为X的新结点)List *Insert( ElementType X, int i, List *PtrL ){ List *p, *s;if ( i == 1 ) { /* 新结点插入在表头*/s = (List *)malloc(sizeof(List)); /*申请、填装结点*/s->Data = X;s->Next = PtrL;return s; /*返回新表头指针*/}p = FindKth( i-1, PtrL ); /* 查找第i-1个结点*/if ( p == NULL ) { /* 第i-1个不存在,不能插入*/printf("参数i错");return NULL;}else {s = (List *)malloc(sizeof(List)); /*申请、填装结点*/s->Data = X;s->Next = p->Next; /*新结点插入在第i-1个结点的后面*/p->Next = s;return PtrL;}}11、删除(删除链表的第i (1≤i≤n)个位置上的结点)List *Delete( int i, List *PtrL ){ List *p, *s;if ( i == 1 ) { /* 若要删除的是表的第一个结点*/s = PtrL; /*s指向第1个结点*/PtrL = PtrL->Next; /*从链表中删除*/free(s); /*释放被删除结点*/return PtrL;}p = FindKth( i-1, PtrL ); /*查找第i-1个结点*/if ( p == NULL ) {printf(“第%d个结点不存在”, i-1); return NULL;} else if ( p->Next == NULL ){printf(“第%d个结点不存在”, i); return NULL;} else {s = p->Next; /*s指向第i个结点*/p->Next = s->Next; /*从链表中删除*/free(s); /*释放被删除结点*/return PtrL;}}12、链表不具备的特点是 1 。
①可随机访问任一节点②插入删除不须要移动元素③不必事先估计存储空间④所需空间与其长度成正比13、带头结点的单链表head为空的判定条件是 2 。
①head==NULL ②head->next==NULL③head->next==head ④head!=NULL14、如果最常用的操作是取第i个结点及其前驱,则采用 4 存储方式最节省时间。
①单链表②双链表③单循环链表④顺序表第三章Chapter 3 栈(stacks)和队列(queues)1、栈是限定仅能在表尾一端进行插入、删除操作的线性表。
2、栈的特点是“后进栈的元素先出栈”(last in, first out),故栈又称为后进先出表(LIFO)。
3、一个栈是一些元素的线形列表,其中元素的插入和删除均在表的同一端进行。
插入和删除发生的一端称为栈顶(the top of the stack)。
4、第一个进栈的元素在栈底,5、最后一个进栈的元素在栈顶,第一个出栈的元素为栈顶元素,最后一个出栈的元素为栈底元素。
6、连续栈(Contiguous Stack)的类型定义#define MaxStack 50Typedef struct{datatype stack[MaxStack];int top;}Seqstack;Seqstack *s;7、判断栈是否已满viod Push(Seqstack *s, datatype x ){if (s->top>=MaxStack-1) printf(“overflow”);else {s-> top++;s->stack[s->top]=x;}}8、判断栈是否为空datatype pop(Seqstack *s ){ if (s->top<0){printf(“underflow”); return(NULL);}return(s->stack[s->top]);s->top--;}9、返回栈顶元素的值,栈不发生变化。