数据结构学习之路
文章平均质量分 77
程序=算法+数据结构,学好数据结构非常有必要。此专栏记录c++语言描述数据结构的学习历程,你我共同进步。
GKHack
这个作者很懒,什么都没留下…
展开
-
数据结构实验4(排序算法的实现及性能分析)
实现了选择排序, 插入排序, 冒泡排序, 快速排序, 改进后的快速排序, 以及两路合并排序.通过随机函数随机生成100个数, 进行各种排序, 记录排序开始时间以及结束时间, 计算消耗的时间来比较算法的优略.实现代码:#include "iostream"#include "cstdio"#include "cstring"#include "algorithm"#include原创 2015-12-16 21:22:56 · 6607 阅读 · 1 评论 -
拓扑排序的实现_TopoSort
拓扑排序是求一个AOV网(顶点代表活动, 各条边表示活动之间的领先关系的有向图)中各活动的一个拓扑序列的运算, 可用于测试AOV网络的可行性.整个算法包括三步:1.计算每个顶点的入度, 存入InDegree数组中.2.检查InDegree数组中顶点的入度, 将入度为零的顶点进栈.3.不断从栈中弹出入度为0的顶点并输出, 并将该顶点为尾的所有邻接点的入度减1, 若此时某个邻接点的原创 2015-12-14 23:55:07 · 2678 阅读 · 0 评论 -
数据结构实验3(飞机最少环城次数问题)
使用图算法解决应用问题: 设有n个城市, 编号为0 ~ n - 1, m条航线的起点和终点由用户输入提供. 寻找一条换乘次数最少的线路方案.使用有向图表示城市间的航线, 只要两城市之间有航班, 则图中这两点间存在一条权为1的边. 用Dijkstra算法实现求最少换乘次数.在MGraph类中增加Choose函数以及Dijkstra函数即可.实现代码:#include "iostrea原创 2015-12-13 18:14:17 · 3772 阅读 · 0 评论 -
数据结构实验3(图的DFS和BFS实现)
实现邻接矩阵和邻接表两种不同存储结构上实现图的基本运算, 在MGraph类中扩充增加DFS()和BFS()函数.包含的运算: 插入一条边, 删除一条边, 查询边是否存在, 图的深度优先搜索和广度优先搜索.广度优先搜索利用队列作为辅助的数据结构, 元素类型是树的结点. 实现代码:#include "iostream"#include "cstdio"#include "cstri原创 2015-12-13 17:51:09 · 3448 阅读 · 0 评论 -
数据结构实验2(二叉链表实现二叉树的基本运算)
包含的二叉树运算: 删除一个二叉树, 求一颗二叉树的高度, 求一颗二叉树中叶子结点数, 复制一颗二叉树, 交换一颗二叉树的左右子树,自上到下, 自左到右层次遍历一颗二叉树.增加相关功能完善即可, 层次遍历利用队列作为辅助的数据结构, 元素类型是指向二叉树中结点的指针类型.实现代码:#include "iostream"#include "cstdio"#include "cst原创 2015-12-13 17:36:01 · 4310 阅读 · 1 评论 -
图的邻接表实现_LGraph
邻接表是图的另一种有效的存储表示方法. 每个顶点u建立一个单链表, 链表中每个结点代表一条边, 为边结点. 每个单链表相当于邻接矩阵的一行.adjVex域指示u的一个邻接点v, nxtArc指向u的下一个边结点. 如果是网, 增加一个w域存储边上的权值.构造函数完成对一维指针数组a的动态空间存储分配, 并对其每个元素赋初值NULL. 析构函数首先释放邻接表中所有结点, 最后释放一维原创 2015-12-08 09:48:31 · 4390 阅读 · 0 评论 -
图的邻接矩阵实现_MGraph
邻接矩阵有两种, 不带权图和网的邻接矩阵. 不带权图的邻接矩阵元素为0或1, 网的邻接矩阵中包含0, INF, 和边上的权值, 权值类型T可为整型, 实型. 三元组(u, v, w)代表一条边, u, v是边的两个定点, w表示u v的关系: a[u][u] = 0, 两种邻接矩阵的主对角元素都是0. a[u][v] = w, 若 在E中, 则w = 1(不带权图)或w = w(i, j)原创 2015-12-08 09:11:28 · 5033 阅读 · 0 评论 -
散列表ADT_HashTable
M为除留余数法的模数, ht是指向动态生成的一维数组指针, empty是标志数组的指针.成员函数Find()在散列表中搜索与x关键字相同的元素. 若表中存在与x关键字值相同的元素, 则将其复制给x, pos指示该位置, 函数返回Success. 若表已满, 函数返回Overflow. 若表未满, 函数返回NotPresent, pos指示首次遇到的空值位置.实现代码:#includ原创 2015-12-01 01:03:54 · 3492 阅读 · 0 评论 -
二叉搜索树ADT_BSTree
二叉搜索树或是一颗空二叉树, 或是具有以下性质的二叉树:1.若左子树不为空, 则左子树上所有结点的关键字值均小于根结点的关键字值.2.若右子树不为空, 则右子树上所有结点的关键字值均大于根结点的关键字值.3.左右子树也分别是二叉搜索树.性质: 若以中序遍历一颗二叉搜索树, 将得到一个以关键字值递增排列的有序序列.1.搜索实现: 若二叉树为空, 则搜索失败. 否则原创 2015-11-18 17:47:48 · 5735 阅读 · 1 评论 -
ListSet_对半搜索的迭代算法
递归函数效率低, 常使用相应的迭代算法.mid, left, right均为元素下标, 如果当前表不为空, 则令x与l[mid]比较. 若两者相等, 则搜索成功. 若前者小于后者, 则继续查找左半部分, 否则查找右半部分. 下标范围分别为[left, mid - 1], [mid + 1, right]. 如果当前搜索表为空表, 搜索失败返回NotPresent.实现代码:原创 2015-11-04 16:31:16 · 2350 阅读 · 0 评论 -
ListSet_对半搜索的递归算法
对半搜索是一种二分搜索, 将表划分为长度几乎相等的两个子表.共有函数Search()调用私有函数BSearch(). 而后递归调用BSearch()函数实现对有序表的对半搜索.mid, left, right均为元素下标, 如果当前表不为空, 则令x与l[mid]比较. 若两者相等, 则搜索成功. 若前者小于后者, 则继续查找左半部分, 否则查找右半部分. 下标范围分别为[left,原创 2015-11-04 16:29:37 · 2639 阅读 · 0 评论 -
ListSet_有序表搜索
一个有序表可以看成是一个已按关键字排序的有序集.表的最后添增设了一个被称作哨兵的元素, 关键字为INF. 若表长为n, 需要在l[n]位置存放哨兵元素. 增加哨兵元素以后, 在for循环中不再需要通过下标来判定是否已经查完整个表. 当表中l[i]的关键字值大于等于指定元素x的关键字时, for循环结束.搜索失败的平均搜索长度: n / 2 + 2.实现代码:#include "原创 2015-11-04 00:09:13 · 2083 阅读 · 0 评论 -
ListSet_无序表搜索
无序表搜索就是一个个的遍历, 从头开始逐个检查, 直到表中关键字值等于给定关键字值, 则查找成功. 或者查完整个表, 查找失败为止.实现代码:#include "iostream"#include "cstdio"#include "cstring"#include "algorithm"#include "assert.h"using namespace std;enu原创 2015-11-03 23:53:40 · 2230 阅读 · 0 评论 -
数据结构实验2(设计哈弗曼编码和译码系统)
设计一个哈弗曼编码和译码系统, 要求如下:B——建树:读入字符集和各字符频度,建立哈夫曼树。T——遍历:先序和中序遍历二叉树。E——生成编码:根据已建成的哈夫曼树,产生各个字符的哈夫曼编码。C——编码:输入由字符集中字符组成的任意字符串,利用已生成的哈夫曼编码进行编码,显示编码结果,并将输入的字符串及其编码结果分别保存在磁盘文件textfile.txt和code原创 2015-11-02 23:54:49 · 5496 阅读 · 0 评论 -
堆ADT_Heap
一个大小为n的堆是一棵包含n个结点的完全二叉树, 该树中每个结点的关键字值大于等于其双亲结点的关键字值. 堆顶: 二叉树的根, 它的关键字是整棵树上最小的.(最小堆)建堆运算时, CreatHeap()函数完成将一个以任意次序排列的元素排列, 通过向下调整建成最小堆.实现运算AdjustDown的方法是: 向下调整heap[r]. 设tmp = hear[r], 如果tmp大于原创 2015-10-27 11:37:47 · 3399 阅读 · 0 评论 -
优先队列ADT_PrioQueue
如果定义最小值为最高优先权, 使用最小堆为例. 每次入队新元素都要向上调整, 同理, 弹出优先权最高的元素时要向下调整, 使之成为堆.将新元素插入p[j]后的调整工作由AdjustUp()函数完成, 该函数按照与函数AdjustDown()相反的方向比较路径, 由下向上, 与双亲结点进行比较. 若双亲结点的元素值比孩子结点元素值大, 则调整之, 直到或者其双亲不大于待插入元素, 或者以原创 2015-10-25 22:24:38 · 4082 阅读 · 0 评论 -
二叉树ADT_BinaryTree
二叉树是结点的有限集合, 该集合或者为空集, 或者是由一个根和两棵互不相交的称为该根的左子树和右子树的二叉树组成.二叉树可以为空集, 可以有空二叉树, 也可以有空的左子树 或/和 又子树.二叉树的性质: 1.第i层至多有2^(i - 1)个结点. 2.高度为h的二叉树上至多有2*h - 1个结点. 3.包含n个元素的二叉树高度至少为>=log2(n + 1)取整. 3.任意一颗二叉树中原创 2015-10-25 10:03:32 · 6706 阅读 · 0 评论 -
数据结构实验1(一元多项式的相加和相乘)
实验要求:1.设计带表头的结点的单链表表示多项式类。2.在该类上增加成员函数void PolyMul(Polynominal &r),并重载*运算符。3.实现菜单驱动的main函数,测试多项式的各个运算:输入多项式,显示多项式,以及多项式加法和乘法运算。4.采用带表头的非循环链表存储多项式。大致结构以及加法的运算书上的代码已经给出。乘法运算:将乘数多项式的每一项与被乘数原创 2015-10-07 19:48:34 · 8328 阅读 · 0 评论 -
数据结构实验1(顺序表逆置以及删除)
在顺序表类SeqList中增加成员函数void Reverse(),实现顺序表的逆置。在顺序表类SeqList中增加成员函数bool DeleteX(const T &x),删除表中所有元素值等于x的元素。若表中存在这样的元素,则删除之,且函数返回true。否则函数返回false。直接在SeqList类增加两个成员函数完成相应功能,逆置的话用到了stl中的栈,原elements原创 2015-10-07 15:53:50 · 7498 阅读 · 0 评论 -
稀疏矩阵ADT_SeqTriple
压缩存储稀疏矩阵的非零元素,存储非零元素的行号,列号,值。用一个三元式(row, col, value)唯一表示,可以按行排序或者列排序,成为行三元组或列三元组。实现代码:#include "iostream"#include "cstdio"#include "cstring"#include "algorithm"using namespace std;templ原创 2015-10-01 19:50:23 · 3069 阅读 · 0 评论 -
一维数组ADT_Array1D
重载了运算符"=","[]",">>","构造函数中sz被赋初值0,缺省长度为0。为了能像高级程序语言中的数组一样获取给定下标I的值,重载了运算符[],还增加检查数组是否越界的功能,c++中不做数组越界检查。重载"="的函数中,防止了无意义的自我赋值,赋值前动态空间释放并且重新分配,就达到了整体赋值的目的。断言函数assert是c++提供的一种功能,若断言语句的条件满足则继原创 2015-10-01 11:15:49 · 2981 阅读 · 0 评论 -
循环队列ADT_SeqQueue
队列的顺序表示中,可能会出现队列有空位却产生溢出,这就是"假溢出"现象。解决方法是把队列从逻辑上看成是一个头尾相连的环,再有新元素需要入队时,就可以将新元素存入下标0的位置。队头指针进1:front = (front + 1) % maxSize队尾指针进1:rear = (rear + 1) % maxSize空队列:front == rear满队列:front == (re原创 2015-09-29 23:28:16 · 3919 阅读 · 0 评论 -
堆栈的顺序表示ADT_SeqStack
栈的实现,包含的函数有Top(), Push(), Pop().简单易懂的代码~实现代码:#include "iostream"#include "cstdio"#include "cstring"#include "algorithm"using namespace std;template class Stack{public: virtual bool原创 2015-09-27 22:26:39 · 3894 阅读 · 2 评论 -
带表头结点的单链表ADT_HeaderList
单链表的衍生,许多函数和单链表想同,多了一个first表头结点。带表头结点的数据域element不存放线性表中的元素,要么为空,要么存放辅助数据。有了表头结点以后,单链表中每个元素结点都有一个前驱结点,简化了插入和删除操作的描述。给出构造函数,插入函数以及删除函数的实现代码。实现代码:templateHeaderList::HeaderList(){ Node *原创 2015-09-27 21:08:26 · 3083 阅读 · 0 评论 -
结点类和单链表ADT_SingleList
包含的函数:IsEmpty(), Length(), Find(), Search(), Insert(), Delete(), Update(), Clear(),Output()。学完C语言后很少接触链表了,所以学起来有点吃力,需要想的地方已经加注释,觉的抽象可以画画图。实现代码:#include "iostream"#include "cstdio"#incl原创 2015-09-10 09:06:26 · 5005 阅读 · 0 评论 -
线性表的顺序表示:顺序表ADT_SeqList
包含的函数:Isempty(), Length(), Find(), Search(), Insert(), Delete(), Update(), Output()。实现代码:#include "iostream"#include "cstdio"#include "cstring"#include "algorithm"using namespace std;原创 2015-09-06 22:48:35 · 4747 阅读 · 0 评论