数据结构
文章平均质量分 70
Core2048
这个作者很懒,什么都没留下…
展开
-
无向图邻表矩阵深度优先遍历(DFS)
头文件Graph.h#ifndef GRAPH_H#define GRAPH_H#define MAXVEX 10typedef char VertexType; //顶点的数据元素typedef int EdgeType; //边表节点的权值typedef struct Node{ VertexType Vertex[MAXVEX]; //顶点表 EdgeTyp原创 2011-11-15 13:42:54 · 1429 阅读 · 0 评论 -
快速排序算法
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。#ifndef QUICKSORT_H#define QUICKSORT_H原创 2011-12-18 20:29:40 · 2498 阅读 · 3 评论 -
B树的实现(不带删除)
在B-树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,kj查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查的关键字在某个Ki或Ki+1之间,于是取Pi所指的结点继续查找,直到找到,或指针Pi为空时查找失败 代码: 头文件:BTree.h #ifndef BTREE_H#de原创 2011-12-09 11:46:44 · 1101 阅读 · 0 评论 -
哈希表的地址链表法
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 下面的哈希表函数使用了(除留余数) 头文件:HashTable.h#ifndef HASHTABLE_H#define HASHTABLE_H原创 2011-12-12 15:04:01 · 5324 阅读 · 0 评论 -
线性表的顺序表示与实现
/* 线性表是有N个元素的非空有限序列 存在惟一的一个被称作“第一个”数据的元素 存在惟一的一个被称作“第后一个”数据的元素 除第一个与最后一个之外,其它元素都存在唯一的一个前驱和唯一的一个后续 复杂的线性表中的元素可以由多个数据项组成 同一个线性表中的元素类型必须相同 线性表的顺序表,是用一组地址连续的存储单元依次存储线性表的数据元素 算法复杂度:取表长与访问表中的原创 2011-12-20 11:06:41 · 4743 阅读 · 2 评论 -
单链表的实现
/* *******************************************************************************用链接存储方式存储的线性表——链表,可以克服顺序表的插入与删除时间复杂度为O(n)缺点。但其获知表长与访问元素的时间复杂度O(n)较顺序表O(1)比较变差了比较适合频繁进行插入与删除操作,访问操作较少的情况链表中的结点用原创 2011-12-20 14:44:26 · 2214 阅读 · 0 评论 -
静态链表
/* 静态链表用一维数组表示链表便于在不设指针的高级程序语言中实现链表结构 数组的一个分量表示一个结点,一个结点由两个域组成: 数据域:data,用于存储要处理的数据元素 游标域:cur,用于代替指针指示结点在数据中的位置 特殊处理数组的第一个位置与最后一个位置 最后一个位置的游标指标第一个有数据的结点(相当于链表的头结点) 第一个位置的游标指标一个未使用的结点 */原创 2011-12-21 11:21:21 · 5747 阅读 · 1 评论 -
优化冒泡排序算法
#ifndef BUBBLESORT_H#define BUBBLESORT_Htemplate inline void Swap(T *a,T *b) //交换两个数值{ T temp = *a; *a = *b; *b = temp;}template void BubbleSort(T *a,int len) //冒泡排序优化算法{ bool flag原创 2011-12-13 10:03:05 · 6202 阅读 · 0 评论 -
简单选择排序算法
在简单选择排序过程中,所需移动记录的次数比较少。最好情况下,即待排序记录初始状态就已经是正序排列了,则不需要移动记录。 最坏情况下,即待排序记录初始状态是按逆序排列的,则需要移动记录的次数最多为3(n-1)。简单选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关。当i=1时,需进行n-1次比较;当i=2时,需进行n-2次比较;依次类推,共需要进行的比较次数是(n-原创 2011-12-13 22:35:38 · 2507 阅读 · 0 评论 -
冒泡排序算法
冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),原创 2011-12-13 09:59:23 · 2123 阅读 · 0 评论 -
直接插入排序算法
插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。#ifndef INSERTSORT_H#define INSERTSORT_Htemplate void InsertSort(T *a,int len) //直插排序算法{ T temp; int j; for(int原创 2011-12-13 23:09:41 · 2159 阅读 · 0 评论 -
双向链表的实现
/* 单链式存储结构中,只有一个指向后继的指针,从某点出发,只能顺序的访 访问,如果想访问上一个结点必须从头开始,时间复杂度:访问下一个结点 为O(1),访问上一个结点为O(n)而双向链表可以克服这个问题 双向链表的结点存在一个数据域和两个指针域:一个指向前驱一个指向后继 */#ifndef DOUBLELINKLIST_H#define DOUBLELINKLIST_H原创 2011-12-22 08:47:39 · 2913 阅读 · 0 评论 -
顺序栈的实现
/* 栈是一种限定只在表尾进行插入或删除操作,栈也是线性表 表头称为栈的底部,表尾称为栈的顶部,表为空称为空栈,栈又 称为后进先出的线性表,栈也有两种表示:顺序栈与链式栈 顺序栈是利用一组地址连续的存储单元,依次存放从栈底到栈顶 的数据元素,附设一个指针指示栈顶的元素在栈中的位置....... */#ifndef STACK_H#define STACK_H#defin原创 2011-12-22 13:38:26 · 12125 阅读 · 1 评论 -
希尔排序算法
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因原创 2011-12-14 15:18:09 · 2602 阅读 · 0 评论 -
堆排序算法
堆排序是利用堆进行排序的算法将待排序的序列构造成一个大顶堆(或小顶堆),此时序列 的最大值就是堆顶的根结点将其与堆数组中的未尾元素交换,此时未尾元素就是最大 值,然后将剩余的n - 1个序列重新构造成一个大顶堆,如些反复便能得到一个有序的序列#ifndef HEAPSORT_H#define HEAPSORT_Htemplate void HeapAdjust(T *a,int n原创 2011-12-14 23:05:12 · 2119 阅读 · 0 评论 -
双栈的实现
/* 两顺序栈共享一个地址连续的存储单元,一个栈的栈底为起始位置 一个栈的栈底为末尾,压入数据时从两边向中间推进,如果指示栈 顶的指针top1 + 1 等于另一个栈顶的指针top2时两栈已满, 如果top1 == -1,top2 == MAXSIZE两栈为空 */#ifndef DOUBLESTACK_H#define DOUBLESTACK_H#define INFINIT原创 2011-12-22 21:56:17 · 5954 阅读 · 0 评论 -
链式队列的实现
/* 队列是一种先进先出线性表,队列是线性表的特化 也具有线性表的性质分为:顺序队列与链式队列 链式队列与线性表的单链表相似只不过链式队列只 允许从头部进行删除、尾部进行插入.需要为链式队列 创建一个头结点包括两个指针,指向队头的指针(front) 与指向队尾的指针(rear).当两个指针相等时队列为空*/#ifndef LINKQUEUE_H#define LINKQUEUE_H原创 2011-12-23 23:58:54 · 15200 阅读 · 1 评论 -
归并排序算法(递归实现)
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两原创 2011-12-16 10:22:45 · 7525 阅读 · 1 评论 -
无向图邻接表的深度优先遍历(DFS)
邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表) 头文件:Graph.h#ifndef GRAPH_H#define GRAPH_H#define MAXSIZE 50typedef char VertexType; //顶点数据类型typedef int EdgeType; //边权值类型typedef struct edge原创 2011-11-15 10:05:18 · 8309 阅读 · 1 评论 -
斐波那契查找算法
与二分查找相比,斐波那契查找算法的明显优点在于它只涉及加法和减法运算,而不用除法。因为除法比加减法要占去更多的机时,因此,斐波那契查找的平均性能要比折半查找好。 #include void fibonacci(int *f){ f[0] = 1; f[1] = 1; for(int i = 2;i < MAXSIZE;++i) f[i] = f[i - 2]原创 2011-12-01 10:22:48 · 8589 阅读 · 8 评论 -
图的最小生成树(prim算法)
最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),同时还要考虑使树的权最小!头文件Graph.h#ifndef GRAPH_H#define GRAPH_H#define MAXVEX 12#define INFINITY 65535typedef char VertexType; //顶点数据原创 2011-11-16 13:31:22 · 2222 阅读 · 0 评论 -
邻接表深度优先遍历和广度遍历
循环 队列头文件:Queue.h#ifndef QUEUE_H#define QUEUE_H#define MAXSIZE 20typedef struct Node{ int data[MAXSIZE]; int front; int order;}Queue;void InitQueue(Queue *q); //初始化队列bool IsEmpty(Qu原创 2011-11-15 20:58:22 · 9183 阅读 · 0 评论 -
最小生成树(kruskal算法)
克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个。这里面充分体现了贪心算法的精髓 头文件Graph.h#ifndef GRAPH_H#define GRAPH_H#define INFINITY 65535#define MAXVEX 20#define MAXEDGE 20typedef char Vertex原创 2011-11-17 13:35:25 · 1143 阅读 · 0 评论 -
最短路径(Dijkstra算法)
Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 头文件:Dijkstra.h#ifndef DIJKSTRA_H#define DIJKSTRA_H#define MAXVEX 20#define M原创 2011-11-18 13:10:55 · 2308 阅读 · 0 评论 -
最短路径(Floyd算法)
Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。 头文件:Floyd.h#ifndef FLOYD_H#define FLOYD_H#define INFINITY 65535#define MAXVEX 20#define MAXVEX 20typedef int ShortPathTable[MAXVEX][MAXVE原创 2011-11-19 22:29:38 · 2147 阅读 · 0 评论 -
拓扑排序算法
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。 头文件:TopoLogicalSort.h#ifndef TOPLOGICALSORT_H#define TOPLOGICALSORT_H#define MAXVEX 20 //原创 2011-11-20 14:24:37 · 1032 阅读 · 0 评论 -
图的关键路径算法
关键路径法(Critical Path Method, CPM)是一种基于数学计算的项目计划管理方法,是网络图计划方法的一种,属于肯定型的网络图。关键路径法将项目分解成为多个独立的活动并确定每个活动的工期,然后用逻辑关系(结束-开始、结束-结束、开始-开始和开始结束)将活动连接,从而能够计算项目的工期、各个活动时间特点(最早最晚时间、时差)等。 头文件:CriticalPath.h#i原创 2011-11-20 21:02:18 · 7839 阅读 · 0 评论 -
前序线索化二叉树
这段时间一直在复习数据结构,把做的练习贴出来,就当是留下的脚印吧 线索二叉树,就好像是给排列在不同地方的对象用一根无形的绳子穿起来了,变成了“线形”的,这样每个结点的前驱和后继就能直接得到或者容易找到了。线索化的过程需要用到遍历算法,一旦线索建立后,在此结构上遍历就可以不用递归、也不用栈了,实现更加容易了。 头文件BitTree.h#ifndef BITTREE_H#原创 2011-11-04 13:12:50 · 10922 阅读 · 4 评论 -
后序线索二叉树
线索二叉树,就好像是给排列在不同地方的对象用一根无形的绳子穿起来了,变成了“线形”的,这样每个结点的前驱和后继就能直接得到或者容易找到了。线索化的过程需要用到遍历算法,一旦线索建立后,在此结构上遍历就可以不用递归、也不用栈了,实现更加容易了 头文件 BitTree.h#ifndef BITTREE_H#define BITTREE_H#define OK 1#defin原创 2011-11-04 23:22:32 · 10842 阅读 · 0 评论 -
中序线索二叉树
线索二叉树,就好像是给排列在不同地方的对象用一根无形的绳子穿起来了,变成了“线形”的,这样每个结点的前驱和后继就能直接得到或者容易找到了。线索化的过程需要用到遍历算法,一旦线索建立后,在此结构上遍历就可以不用递归、也不用栈了,实现更加容易了。 头文件 BitTree.h#ifndef BITTREE_H#define BITTREE_H#define OK 1#def原创 2011-11-04 19:19:42 · 3184 阅读 · 0 评论 -
二叉搜索树实现
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值 头文件SearchTree.h#ifndef SEARCHTREE_H#define SEARCHTREE_Htypedef int Element;t原创 2011-11-07 17:41:49 · 848 阅读 · 0 评论 -
二分查找算法
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以原创 2011-11-29 11:23:26 · 1888 阅读 · 1 评论 -
平衡二叉树插入的实现
向AVL树插入可以通过如同它是未平衡的二叉查找树一样把给定的值插入树中,接着自底向上向根节点折回,于在插入期间成为不平衡的所有节点上进行旋转来完成 头文件AvlTree.h#ifndef AVLTREE_H#define AVLTREE_Htypedef int Element;typedef struct Node{ Element data; struct No原创 2011-11-08 11:43:21 · 1894 阅读 · 0 评论 -
KMP算法
kmp算法是一种改进的字符串匹配算法,KMP算法的关键是根据给定的模式串T,定义一个next函数。next函数包含了模式串本身局部匹配的信息。头文件KmpAlgorithm.h#ifndef KMPALGORITHM_H#define KMPALGORITHM_Hvoid Get_next(char *T,int *next);int Index_Kmp(char *s,cha原创 2011-11-08 22:04:02 · 746 阅读 · 0 评论 -
Kmp字符串匹配算法改进版
用于处理像:主串:aaaaaaabcdefh子串:aaaaaaaax 头文件:KmpAlgorithm.h#ifndef KMPALGORITHM_H#define KMPALGORITHM_Hvoid Get_Next(char *T,int *next); //求模式串T的next函数int Index_Kmp(char *s,char *t,int pos);原创 2011-11-08 22:49:14 · 863 阅读 · 0 评论 -
Kmp字符匹配算法优化C++实现
C++实现Kmp字符匹配算法的优化版 头文件:KmpAlgorithm.h#ifndef KMPALGORITHM_H#define KMPALGORITHM_H#include #include class KmpAlgorithm{ std::string s; //主串 std::string t; //子串 static const int MaxS原创 2011-11-09 10:25:48 · 1674 阅读 · 1 评论 -
插值查找算法
#include int Bin_Search(int *a,int key,int n){ int low,high,mid; low = 0; high = n - 1; while(low <= high) { mid = low + (high - low) * (key - a[low]) / (a[high] - a[low]); //此处于二分查找不原创 2011-12-01 09:40:58 · 4855 阅读 · 2 评论 -
循环队列的实现
/* 队列是一种先进先出的线性表,具有线性表的特性:分为链式队列与顺序队列 顺序队列:用一段地址连续的存储单元存储数据元素,定义两个游标:指向队头 的游标(front)、指向队尾的游标(rear),如果front == rear队列为空,如果 (rear + 1) % MAXSIZE == front队列满(此为循环队列),如普通队列rear==MAXSIZE队列满 */#ifndef原创 2011-12-25 21:04:45 · 6477 阅读 · 3 评论