
Data Structure
文章平均质量分 79
JKay_Wong
一个对计算机有兴趣的菜鸟
展开
-
Hash表(C++实现)
哈希表的几个概念:映像:由哈希函数得到的哈希表是一个映像。冲突:如果两个关键字的哈希函数值相等,这种现象称为冲突。处理冲突的几个方法:1、开放地址法:用开放地址处理冲突就是当冲突发生时,形成一个地址序列,沿着这个序列逐个深测,直到找到一个“空”的开放地址,将发生冲突的关键字值存放到该地址中去。例如:hash(i)=(hash(key)+d(i)) MOD m (i=1,2,3,原创 2011-08-20 00:19:10 · 19463 阅读 · 9 评论 -
学生信息管理小程序(线索二叉树实现)
用线索二叉树结构来构建一个学生信息管理系统,支持的操作的代码中会看到,主要的难点是线索二叉树的删除和插入操作,在以前有写过一篇线索二叉树的博客,里面有介绍线索二叉树的几本操作,但是当时没有写删除操作,线索二叉树。这次的代码中,加入了删除操作,我觉得也是整个程序里面的一个难点。主要是情况较多,要分每一种情况进行讨论,而且操作过程中,需要定位待删除节点的父节点。下面的代码有交详细解释,上代码//S原创 2011-11-21 14:15:04 · 3681 阅读 · 1 评论 -
AVL平衡二叉树(二)
这是之前的AVL平衡二叉树的一个实现代码点击打开链接下面是看另一本书的实现的 没有了一重重的switch{case...},理解上不太一样,我觉得两种都可以。//"avltree.h"class AVL_Tree;class AVLNode { friend AVL_Tree;public: AVLNode() {LeftChild = RightChild =原创 2011-10-25 21:49:21 · 1664 阅读 · 2 评论 -
再写——Prim && Kruskal
重新写了最小生成树的两个经典算法—— prim 和 kruskal算法,之前写的Prim算法,是比较直接的 就是先让边的集合为空,然后在扫描最小边的过程中,也是根据该算法的定义来写的 是比较直接的写法 看这里 就是之前的Prim算法实现 ,这次实现的,个人比较喜欢。思想是这样的:(1)先在最小树的顶点集U={v},以和v相邻的所有边为候选边;(2)重复以下步骤n-1次,使得其他n-1个原创 2011-11-16 00:21:07 · 2005 阅读 · 1 评论 -
C++ 堆结构(数组实现)
要说最大堆和最小堆,就得先知道最大树和最小树。每个结点的值都大于(小于)或等于其子节点(如果有的话)值的树,就叫最大(最小)树。最大堆(最小堆)是最大(最小)完全树。由于堆是完全二叉树,所以可以用公式化描述,用一维数组来有效的描述堆结构。利用二叉树的性质:如果原创 2011-10-16 11:34:26 · 8196 阅读 · 0 评论 -
图书馆管理系统_DOS版
最近想写一个MFC版本的图书馆管理系统,设计好界面后 发现无重下手,所以还是先写一个DOS版的,作为类似内核的东西,这个写好了 要弄出MFC版本的其实就好弄多了,下面是代码://书籍类#ifndef _BOOK_H_#define _BOOK_H_#include原创 2011-10-10 23:19:31 · 2561 阅读 · 9 评论 -
循环双向链表类
明天开学了 暑假大概地过完了一遍基本的数据结构 现在也要开始复习 边学其他的东西了 大二开始了 加油 下面的循环双向链表作为链表类的第一个复习文件"dlist.h"#includeusing namespace std;templateclass DList;原创 2011-08-28 23:17:42 · 1070 阅读 · 0 评论 -
学生健康情况管理系统(单链表)
文件"sqlist.h"//学生健康情况管理系统内部变量以及类的声明文件class Stu_node;//学生信息类class student {public: char num[20]; //学号 char name[20]; //姓名 char bir原创 2011-09-20 12:25:26 · 3359 阅读 · 1 评论 -
归并排序的两种实现形式
下面是代码和示意图,一种是迭代一种是递归首先是迭代:#includeusing namespace std;void Merge(int a[],int b[],int l,int m,int n){ //将两个已经排好序的数组a[l,...,m]和b[m+1,原创 2011-08-21 16:43:59 · 1583 阅读 · 0 评论 -
Bucket_Sort and Radix_Sort
这个是原文地址 点此连接。 桶式排序桶式排序的原理是:利用待排序序列元素的值作为新序列的索引进行插入,完成新序列的建立后,只需对新序列进行遍历即可完成排序(具体遍历过程和新序列元素的值有关)假设有N个整数的序列,范围从0到M-1。现建立一个名为Count的桶序转载 2011-08-22 17:16:53 · 1470 阅读 · 0 评论 -
串的模式匹配——KMP && BF
BF算法匹配的话,确实是最容易想到和实现的,也难怪现在还是广泛应用中,一般情况下,BF算法的效率还是可以的,但是最坏情况下就不行了,KMP算法就解决了这个问题,相应地,当然比BF算法复杂了,一开始看KMP 真的不知道它在说啥,看了几遍才理清思路。 KMP的主要思想(有一些原创 2011-07-20 23:44:52 · 1074 阅读 · 0 评论 -
求AOE网的关键路径
以边表示活动,以顶点表示事件的有向网称为AOE(activity on edge)网.AOE网是一个有向无环图,权值表示活动持续的时间。可以用AOE网来估计工程完成的时间。由于工程只有一个开始点和一个完成点,所以在无环路的条件下,网中只有一个入度为0的点和一个出度为0原创 2011-08-18 00:03:27 · 12597 阅读 · 0 评论 -
再写 Huffman_Tree
之前写的huffman树的代码这次的只是对建树过程的代码做了一点改变,对比代码一看就知道了tree.h#includeusing namespace std;//栈模版templateclass My_stack;templateclass Node //结点类{private: T data; Node *next;public: Node() {原创 2011-11-06 15:21:12 · 901 阅读 · 0 评论 -
并查集
并查集,也叫不相交集的数据结构。具体的可以百度,有很多,这里不再说具体的定义,给出一种实现,包含了路径压缩。#include using namespace std;const int MAX_SIZE=100;int parent[MAX_SIZE];int rank[MAX_SIZE];int Find(int x){ int y,root,w; y=x; wh原创 2011-11-06 20:56:23 · 820 阅读 · 0 评论 -
次优查找树
在有序序列的查找中,如果各个元素的查找概率都是一样的,那么二分查找是最快的查找算法,但是如果查找元素的查找概率是不一样的,那么用二分查找就不一定是最快的查找方法了,可以通过计算ASL来得知。所以基于这种查找元素概率不想等的有序序列,可以通过构造最优二叉树的方法,使得该二叉树的带权路径长度最小,这样的二叉树的构造代价是非常大的,所以用一种近似的算法,构造次优查找树,该树的带权路径长度近似达到最小原创 2011-11-28 10:08:52 · 3392 阅读 · 2 评论 -
Heap_Sort,Shell_Sort and Quick_Sort
介绍三种排序,堆排序、希尔排序和快速排序。首先是堆排序:一个有n个记录的线性序列{R1,R2,R3,....Rn},其关键字序列{K1,K2,....,Kn} 满足{Ki 来表示堆的话,就是说该树中的非叶子结点的值均不大于(或不小于)其左右两个分支结点的值。堆排序有两个关键步骤: (1原创 2011-08-20 17:25:04 · 1673 阅读 · 3 评论 -
平衡二叉树(AVL树)的基本操作(附有示意图)
平衡二叉树关于树的深度是平衡的,具有较高的检索效率。平衡二叉树或是一棵空树,或是具有下列性质的二叉排序树:其左子树和右子树都是平衡二叉树,而且左右子树深度之差绝对值不超过1. 由此引出了平衡因子(balance factor)的概念,bf定义为该结点的左子树的深度减去右子树的深度(有些书是右子树深度减去左子树深度,我是按照左子树减去右子树来计算的,下面的代码也是这样定义的),所以平衡二叉树的结点的原创 2011-08-10 19:30:32 · 25011 阅读 · 15 评论 -
一个有趣的结构——Treap
如果将一个含有n个元素的集合插入到一课二叉查找树中,所得到的树可能会非常不平衡,从而导致查找时间过长。例如一个集合是一列逆序排列的有序序列,那么在按顺序将这个集合的元素插入到一棵空的二叉查找树时,就会导致这课二叉查找数是一棵只有左子树的树,查找起来的速度并没有像预想中的那样快。因此,一般来说,要为一组固定的元素建立一棵较为平衡的二叉排序树的话,可以采用一种策略就是先随机排列这些元素,然后再按照排列原创 2012-01-28 18:27:36 · 1541 阅读 · 0 评论 -
广义表_2(C风格实现)
就快考数据结构了 复习中,之前写过一篇广义表的 是用头尾结点表示法实现的,这次的是用兄弟孩子结点表示法实现的,相比之下,这种表示法的要简洁的。虽然考试这方面的应该不考多少,但是兴趣所在,以后学LISP的话 也有点基础。 之前写的广义表//头文件#include using namespace std;//广义表存储结构struct GL_Node{ int tag; un原创 2011-12-26 14:10:06 · 1460 阅读 · 0 评论 -
再写 Hash (C++)
之前写过的一篇hash表的文章——以前写的HASH表这次是因为想用一下链地址法处理冲突的方式来写一下,和图的邻接表很相似的一个结构,哈希函数依旧是用简单的取余法,下面是代码,有兴趣的朋友也看看以前写的那篇。文"hash.h"#include using namespace std;typedef int Keytype;const int NULLKEY=0; //表示该位置原创 2011-12-05 23:15:51 · 1509 阅读 · 0 评论 -
B-TREE
这里只用关键字来代替实际的外存文件。B树又叫平衡多路查找树,是一种组织和维护外存文件系统非常有效的数据结构一棵m阶的B树(m叉树)的特性如下:树中每个结点最多含有m个孩子(m>=2);除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]=(m-1)/2个孩子(其中ceil(x)是一个取上限的函数);若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点原创 2011-12-03 00:59:53 · 2361 阅读 · 4 评论 -
邻接多重表存储无向图以及有关操作
数据结构是编程里面最重要的一门基础课之一,所以学多少遍都不可以嫌多,算法的知识当然是融在其中,多练习,多思考,基础打好了,其他的东西学起来也就so easy了。邻接多重表,是对用邻接表存储无向图的一种压缩存储,当然也是链式存储,邻接多重表的相关概念,可以百度、谷歌、或者看有关书籍。大部分书都没有详细介绍这个结构的应用(至少我目前还没看到有书上有写),只是说 这个结构在对无向图的边进行操作的时候原创 2011-11-13 13:08:02 · 4350 阅读 · 3 评论 -
有向图的十字链表存储以及相关操作
以十字链表作为有向图的存储结构,将邻接表和逆邻接表结合起来,对统计结点的出入度很方便,这是之前的一篇日志,也是说图的存储的,有兴趣的也可以看看 图的几种存储结构下面是代码://graph.h#include #include #include #include using namespace std;bool visited[100]; //顶点是否已被访问的标志数原创 2011-11-10 18:34:59 · 8037 阅读 · 0 评论 -
再写_邻接表和邻接矩阵存储图
之前写的 在遍历那边有点问题 非连通图的时候 非递归的深度优先 和广度优先遍历 会出错 进行了改正 下面是代码#include#include#include#includeusing namespace std;//下面是循环队列模版templateclass My_queue;templateclass Node{private: T data; Node *原创 2011-11-10 00:06:44 · 3392 阅读 · 0 评论 -
模拟编码译码(huffman编码应用)
用huffman编码对一些字符进行编码,然后再将用户输入的桔子进行编码,还有译码等。一个huffman 编码的小应用文件"huffman.h"#include #include #include using namespace std;//栈模版templateclass My_stack;templateclass Node //结点类{private:原创 2011-11-28 13:39:02 · 1725 阅读 · 0 评论 -
循环队列模版(链表实现)
用链表实现循环队列,也是写几个常用功能,其实和循环列表大同小异 ,就是它的一个特殊形式而已。文件"myqueue.h"#includeusing namespace std;templateclass My_queue;templateclass N原创 2011-07-18 22:17:18 · 1047 阅读 · 0 评论 -
无向网的最小生成树(Kruskal算法)
最小生成树的Kruskal算法,适用于边较少的连通网,下面的算法中没有将其像上一篇日志一样转换为一棵树,要转换的话就像上一篇日志一样,进行建树就可以了,下面是代码"graph.h"文件#include#include#includeusing namespace s原创 2011-08-16 10:59:14 · 3215 阅读 · 4 评论 -
二叉树应用——计算表达式
由于时间比较匆忙,只实现了计算单个数字的,计算有十位或者更高位的还没去实现,之前用栈做的就可以,这里用二叉树做的,一开始把数据定为char类型,所以后来也就没去改它,就先实现了只有个位数的情况下的表达式的计算,更高位的表达式的计算,就是将数据的类型定位string类型,然后在数字原创 2011-07-29 16:00:03 · 1906 阅读 · 0 评论 -
栈的应用——计算表达式
挺久之前写的一个作业,ACM选修课的,用栈实现的计算表达式,有两种,一种是将表达式转换为后缀表达式再计算,一种是直接计算中缀表达式,下面是代码。(1)转后缀再计算:#include#includeusing namespace std;int main(){ s原创 2011-07-29 16:12:28 · 1388 阅读 · 0 评论 -
简单循环队列模版(数组实现)
用数组写的一个循环队列的模版,功能是常用的那几个功能。文件"myqueue.h"#define QUEUE_INIT_SIZE 100 //队列初始化时分配的最大容量#define QUEUE_INCREMENT 10 //队列满时,扩充的容量#includeusing原创 2011-07-18 17:48:53 · 1058 阅读 · 0 评论 -
稀疏矩阵(三元组顺序表实现)
定义了一个稀疏矩阵类,有转置和相乘两个功能,主要是熟悉稀疏矩阵的三元组顺序表存储的一些操作,和一般的矩阵不同的地方,两个转置的算法,第一个是较容易想到的,书上管它叫“按需点菜”法,就是按一开始列的顺序,一个个转为新矩阵中行的顺序。第二个叫作“按位就坐”法,就是条件两个辅助数组,确原创 2011-07-22 00:48:21 · 7406 阅读 · 0 评论 -
Huffman编码
仅仅是实现建立一个huffman 树的结构而已 暂时没应用文件"tree.h"#includeusing namespace std;class HuffmanTree;class HuffmanNode{ int data; int parent,lchild,原创 2011-07-27 15:27:39 · 2691 阅读 · 0 评论 -
C++线索二叉树
将二叉树线索化,实际上就是将其变为一个循环链表,下面的代码是采用中序的线索化,遍历也是中序遍历,都是基于中序的。在中序遍历序列中求某一结点的前驱和后继的方法:(1)求某一结点的后继:如果所考虑的结点有右孩子,那么就要从该右孩子开始,顺着右孩子的左孩子域找下去,一直到左孩子域为空为原创 2011-07-25 22:03:20 · 3677 阅读 · 0 评论 -
C++树(兄弟孩子结构实现)
树转换为二叉树,森林转换为二叉树,都是基于树的兄弟孩子结构实现的。树有三种遍历:先根遍历,后根遍历,层次遍历。前两种分别对应于二叉树的前序遍历和中序遍历。层次遍历和二叉树的层次遍历也很相似。下面是代码:文件"tree.h"#include#includeusing names原创 2011-07-26 21:38:30 · 8432 阅读 · 8 评论 -
二叉树遍历(非递归版)
在数据量较小时,和递归版本的时间是差不多的,额因为还没有去看算法的那个计算时间复杂度和空间复杂度的东西,所以对那个不懂,只能用最直观的测试时间来判断速度文件"trees.h"#includeusing namespace std;templateclass My_原创 2011-07-24 16:02:43 · 1223 阅读 · 0 评论 -
简易栈模版(链表实现)
一个用链表写的栈的模版,只写了几个最常用的功能,对象的比较没写,就是重载运算符而已。文件“mystack.h”#includeusing namespace std;templateclass My_stack;templateclass Node //结点类{原创 2011-07-18 11:30:40 · 899 阅读 · 0 评论 -
简易单链表模版(暂定最终版本)
自己写的一个单链表模版,模版的实现和定义是不可以分开两个文件写的 和平时写的类的不太一样 这个要注意,一开始没注意到这个 就出现了那个最讨厌的 unresplve external symbol 的错误 下面是代码 功能只是一些比较常见的功能 mylist.h文件#include原创 2011-07-16 18:11:36 · 983 阅读 · 1 评论 -
双向链表的一个简单的例子
以前写的 最近找出来 加上了逆置的功能 #include#include#define N 10using namespace std;struct ptnode{ char name[20]; ptnode *llink,*rlink;};原创 2011-07-17 22:22:34 · 1205 阅读 · 0 评论 -
邻接矩阵存储图的两种遍历方式
下面是用邻接矩阵存储一个无向图的深度优先遍历和广度优先遍历代码,深度优先遍历就是树的先根遍历的一种推广,而广度优先也是和树的层次遍历相似的,用邻接矩阵存储,进行这两种遍历的实现,是比较容易的。因为用了自己写的循环队列的模版,所以代码看起来有点冗长.#include#in原创 2011-08-05 17:20:55 · 3167 阅读 · 2 评论 -
邻接表存储有向图的两种遍历方式
用邻接表存储的有向图,因为在建立邻接表的时候,建的链表都是头插入的,所以遍历出来的顺序和原先设想的是相反的,就是从下往上的,下面是代码原创 2011-08-05 20:40:36 · 4744 阅读 · 2 评论