第1章 绪论
1.数据结构是一门……的学科
数据、数据元素、数据项、数据对象、数据结构、四种基本的数据结构
数据的逻辑结构、 数据的存储结构(包括数据元素的表示、关系的表示)、两种不同的存储结构
逻辑结构主要有两大类:
(1)线性结构
(2)非线性结构:
1)树形结构
2)图形结构
2.抽象数据类型
抽象数据类型(Abstract Data Type简写为ADT)指的是用户进行软件系统设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不考虑计算机的具体存储结构和运算的具体实现算法。
3.什么是算法
算法是对特定问题求解步骤的一种描述,它是指令的有限序列 。
算法的五个重要的特性 :
(1)有穷性 (2)确定性 (3)可行性 (4)有输入 (5)有输出
4.算法分析
(1)算法的时间复杂度:是指其基本运算在算法中重复执行的次数。
算法中基本运算次数T(n)是问题规模n的某个函数f(n),记作:
T(n)=O(f(n))
记号“O”读作“大O”,它表示随问题规模n的增大算法执行时间的增长率和f(n)的增长率相同。
(2)算法空间复杂度:是对一个算法在运行过程中临时占用的存储空间大小的量度 。
对于空间复杂度为O(1)的算法称为原地工作或就地工作算法。
第2章 线性表
1.线性结构的的特点
线性表的定义
线性表是具有相同特性的数据元素的一个有限序列。该序列中所含元素的个数叫做线性表的长度,用n表示,n≥0。当n=0时,表示线性表是一个空表,即表中不包含任何元素。
1.线性表的顺序存储结构—顺序表
typedef struct
{ ElemType elem[MaxSize]; /*存放顺序表元素*/
int length; /*存放顺序表的长度*/
} SqList;
顺序表基本运算的实现
插入数据元素算法:元素移动的次数不仅与表长n有关 ;插入一个元素时所需移动元素的平均次数 n/2。平均时间复杂度为O(n)。
删除数据元素算法:元素移动的次数也与表长n有关 。删除一个元素时所需移动元素的平均次数为(n-1)/2。删除算法的平均时间复杂度为O(n)。
2.线性表的链式存储结构—链表
定义单链表结点类型:
typedef struct LNode
{ ElemType data;
struct LNode *next; /*指向后继结点*/
} LinkList;
定义双链表结点类型:
typedef struct DNode
{ ElemType data;
struct DNode *prior; /*指向前驱结点*/
struct DNode *next; /*指向后继结点*/
} DLinkList;
(1)单链表基本运算的实现
重点:头插法建表和尾插法建表算法,它是很多算法设计的基础。
重点:插入和删除结点的基本操作及算法。
(2)双链表基本运算的实现重点:
插入和删除结点的基本操作及算法。
(3)循环链表基本运算的实现
重点:判断最后一个结点。
第3章 栈和队列
3.1 栈
1.栈的定义
栈是一种只能在一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的另一端称为栈底。当栈中没有数据元素时,称为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。
2.栈的顺序存储结构及其基本运算实现
栈空条件:s->top==0
栈满条件:s->top==MaxSize
3.栈的链式存储结构及其基本运算的实现
typedef struct linknode
{
ElemType data; /*数据域*/
struct linknode *next; /*指针域*/
} LiStack;
|
带头结点的单链表来实现(也可不带头结点)
栈空条件:s->next==NULL
栈满条件:?
3.2 队列
1.队列的定义
队列简称队,它也是一种运算受限的线性表,其限制仅允许在表的一端进行插入,而在表的另一端进行删除。进行插入的一端称做队尾(rear),进行删除的一端称做队首(front)。
2.队列的顺序存储结构及其基本运算的实现
typedef struct
{ ElemType elem[MaxSize];
int front,rear;/*队首和队尾指针*/
} SqQueue;
把数组的前端和后端连接起来,形成一个环形的顺序表,即把存储队列元素的表从逻辑上看成一个环,称为循环队列。
循环队列首尾相连,当队首指针front=MaxSize-1后,再前进一个位置就自动到0,这可以利用除法取余的运算(%)来实现:
队首指针进1:front=(front+1)%MaxSize
队尾指针进1:rear=(rear+1)%MaxSize
队空条件:q->rear==q->front
队满条件:(q->rear+1) % MaxSize==q->front
队列中的元素个数
3.队列的链式存储结构及其基本运算的实现
struct qnode
{ ElemType data;
struct qnode *next;
} QNode;
typedef struct
{ QNode *front;
QNode *rear;
} LiQueue;
第4章 串
1.串的定义
串(或字符串),是由零个或多个字符组成的有穷序列。含零个字符的串称为空串,用Ф表示。串中所含字符的个数称为该串的长度(或串长)。
串的基本操作
2.串的顺序存储结构-顺序串
3.串的链式存储结构-链串
第6章 树和二叉树
6.1 树
1.树的定义
树是由n(n≥0)个结点组成的有限集合(记为T)。其中,
如果n=0,它是一棵空树,这是树的特例;
如果n>0,这n个结点中存在(有仅存在)一个结点作为树的根结点,简称为根(root),其余结点可分为m (m>0)个互不相交的有限集T1,,T2,…,Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树。
6.2 二叉树
1.二叉树的定义
二叉树也称为二次树或二分树,它是有限的结点集合,这个集合或者是空,或者由一个根结点和两棵互不相交的称为左子树和右子树的二叉树组成。
完全二叉树,满二叉树的定义
2.二叉树性质
性质1 非空二叉树上叶结点数等于双分支结点数加1。即n0=n2+1.
性质2 非空二叉树上第i层上至多有2i-1个结点(i≥1)。
性质3 高度为h的二叉树至多有2h-1个结点(h≥1) 。
性质4 完全二叉树的性质 。
答:相同满度时满二叉树结点最多,h=5的满二叉树结点个数=25-1=31。本题答案应为C。
3.二叉树存储结构
(1)二叉树的顺序存储结构
(2)二叉链存储结构
4.二叉树的遍历
(1) 先序遍历
void preorder(BTNode *t)
{ printf(“%d”,t->data);
preorder(t->lchild);
preorder(t->rchild); }
(2) 中序遍历
void inorder(BTNode *t)
{ inorder(t->lchild);
printf(“%d”,t->data);
inorder(t->rchild); }
(3)后序遍历
void postorder(BTNode *t)
{ postorder(t->lchild);
postorder(t->rchild);
printf(“%d”,t->data); }
注意:重点掌握基于遍历的递归算法设计。
5.二叉树的构造
任何n(n≥0)个不同结点的二又树,都可由它的中序序列和先序序列惟一地确定。
任何n(n≥0)个不同结点的二又树,都可由它的中序序列和后序序列惟一地确定。
掌握它们的构造方法。
6.树(森林)与二叉树之间的相互转换
6.3 哈夫曼树
1.哈夫曼树的定义
在n个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树称为哈夫曼树(或最优二叉树) 。
2.哈夫曼树的构造过程
3.哈夫曼编码的构造过程
第8章 图
1.图的基本概念
(1)顶点的度、入度和出度
(2)完全图
(3)子图
(4)路径和路径长度
(5)连通、连通图和连通分量
(6)强连通图和强连通分量
(7)权和网
2.图的存储结构
(1)邻接矩阵存储方法
(2)邻接表存储方法
掌握两种存储方法的优缺点,同一种功能在不同存储结构上的实现算法。
3.图的遍历
(1)深度优先搜索遍历
(2)广度优先搜索遍历
(3)非连通图的遍历
【例7.1】 试以邻接表为存储结构,分别写出基于DFS和BPS遍历的生成树
4.最小生成树
(1)普里姆算法过程 不要求编写算法。
(2)克鲁斯卡尔算法过程 不要求编写算法。
5. 拓扑排序和关键路径 不要求编写算法。
6.最短路径
不要求掌握算法。
第9章 查找
1.线性表的查找 在顺序表上进行。
(1)顺序查找 (过程和算法)
(2)二分查找 (过程和算法)
(3)分块查找 (只需过程)
2. 树表的查找 二叉排序树
(1)定义
(2)查找(过程和算法)
3.哈希表查找
(1) 哈希函数(除留余数法 )
(2) 哈希冲突解决方法 ( )
第10章 内 排 序
各种排序方法的过程。 外排序和文件部分不作要求。