
DataStructure(c)
BrownWong
None
展开
-
查找(一)静态表查找
静态表查找包括:顺序表查找、有序表查找、静态树表查找、索引表查找 具体原理这里不叙述,详见严蔚敏《数据结构》。1、顺序表查找//SequenceTableSearch.c#include <stdio.h>#include <stdlib.h>#include <string.h>typedef char KeyType;//定义关键字类型typedef struct{ KeyTyp原创 2015-07-06 21:47:13 · 1493 阅读 · 0 评论 -
Binary Sort Tree
二叉排序树简介 二叉排序树(Binary Sort Tree,简称BST),又称二叉查找树,是红黑树、AVL树等的基础。它或是一棵空树,或者是具有下列性质的一棵二叉树: 1、若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 2、若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 3、它的左右子树也分别为二叉排序树。 4、不存在key值相等转载 2015-05-30 11:45:18 · 713 阅读 · 0 评论 -
AVL Tree(平衡二叉树)
#include <stdio.h>#include <stdlib.h>/*-------------------------------------------------------------------------------------此间的过程阅读一定结合课本(严蔚敏数据结构)中的图示演示!!--------------------------------------------原创 2015-07-07 19:00:09 · 576 阅读 · 0 评论 -
排序算法稳定性
1. 稳定性定义假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rjr_i=r_j,且rir_i在rjr_j之前,而在排序后的序列中,rir_i仍在rjr_j之前,则称这种排序算法是稳定的;否则称为不稳定的。2. 常见排序算法稳定性分析不稳定排序算法:选择排序、快速排序、希尔排序、堆排序 稳定排序算法:基数排序、冒原创 2017-03-19 23:47:35 · 415 阅读 · 0 评论 -
各类排序算法复杂度、稳定性比较
如下图:Ref https://baike.baidu.com/pic/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E7%A8%B3%E5%AE%9A%E6%80%A7/9763250/0/96dda144ad345982dab0d4b00ef431adcbef84dd?fr=lemma&ct=single#aid=0&pic=96dda144ad345982dab0转载 2017-03-19 23:50:13 · 510 阅读 · 0 评论 -
字符串匹配算法
1. KMP算法建议先读这篇文章字符串匹配的KMP算法 再读这篇文章 从头到尾彻底理解KMP2. BM算法建议先读这篇文章字符串匹配的Boyer-Moore算法 再读这篇文章BM算法和Sunday快速字符串匹配算法转载 2017-04-02 20:22:38 · 514 阅读 · 0 评论 -
栈
Code Example:#include "stdio.h"#include "stdlib.h"#define STACK_SIZE 10typedef struct Stack { char items[STACK_SIZE]; // 栈中数据 int top; // 栈顶位置} Stack;int init_stack(Stack *stack) { /**原创 2015-05-03 21:05:17 · 480 阅读 · 0 评论 -
霍夫曼编码
霍夫曼树常处理符号编写工作。根据整组数据中符号出现的频率高低,决定如何给符号编码。如果符号出现的频率越高,则给符号的编码越短;如果符号出现的频率越低,则给的符号的编码越长。进行霍夫曼编码假设我们要给一个英文单字"F O R G E T"进行霍夫曼编码,而每个英文字母出现的频率如下: Step1:创建一个霍夫曼树 ⒈ 将每个英文字母依照出现频率由小排到大,最小在左。 ⒉ 每个字母都代表一个终端节原创 2017-03-20 11:52:19 · 781 阅读 · 0 评论 -
树和森林
这里的树并不特指二叉树。1. 树的存储结构树有三种常见的表示方法:双亲表示法、孩子表示法、孩子兄弟表示法。假设我们有这么一棵树: 接下来,我们用三种不同的方式表示它。(1)双亲表示法描述:用一组连续空间存储树的节点,每个节点中附加一个指示器,指向父节点所在位置。对于上面那棵树,我们可以表示为: 评价:这种存储方式很容易获取某个节点父节点,但是获取其子节点就得整个结构遍历一遍。(2)孩子表示法描述原创 2017-04-04 20:42:27 · 789 阅读 · 0 评论 -
LinkedList(链表)
线性表是一种简单的数据结构,其主要特点是元素之间存在“一对一”的关系,除去第一个元素,每个元素都存在唯一一个“前驱节点”,除去最后一个元素都存在唯一一个“后继节点”。简单的线性表有:数组、单链表、双向链表、静态链表等。顺序表(数组)优缺点: 数组不仅逻辑上,物理上位置也相邻,可随机存取,但删除或插入元素时需要移动大量元素,而且需要预先分配一个较大的空间。链表优缺点: 链表不要求物理位置上也相邻,原创 2015-05-03 21:08:37 · 543 阅读 · 0 评论 -
队列
Code Example:#include "stdio.h"#include "stdlib.h"/** * 此队列右边入队,左边出队。 * 队列空条件:queue->front == queue->rear * 队列满的条件:(queue->front + 1)%QUEUE_SIZE == queue->rear * (为了保证队空队满条件,少用一个存储空间) */#define原创 2017-03-31 19:54:06 · 297 阅读 · 0 评论 -
图
1. 图的表示图有两种标准的表示方法:邻接矩阵表示、邻接表表示。下面有两个例子: 无向图用两种方式表示: 有向图用两种方式表示: 注意无向图的邻接矩阵是对称矩阵,存储时可以只存上三角或下三角。带权图的表示对于邻接表链表结构节点增加一个域,表示权重对于邻接矩阵矩阵中元素不再只是用0,1表示,往往用∞表示不连通,其它值表示连接权值。结构选择邻接表在表示稀疏图时非常紧凑,而成为经常地选择;原创 2015-05-19 19:49:02 · 855 阅读 · 0 评论 -
动态存储管理
1.边界标识法//BoundaryTagMethod.c#include <stdio.h>#include <stdlib.h>//------------边界标识法---------------typedef char OtherType;typedef struct WORD{//WORD为内存字类型 union{ WORD *llink;//位于head区域,原创 2015-07-10 17:27:29 · 537 阅读 · 0 评论 -
查找(三)哈希表查找
概念部分不做介绍,具体见严蔚敏《数据结构》。代码://HashSearch.c#include <stdio.h>#include <stdlib.h>//--------------开放定址哈希表存储结构--------typedef char KeyType;//定义关键字类型typedef struct{ KeyType key;}ElemType;//定义元素类型int ha原创 2015-07-08 21:24:05 · 524 阅读 · 0 评论 -
查找(二)动态表查找
动态表查找的特点是:表结构本身在查找过程中动态生成。 包括: 二叉排序树(BinarySortTree)或二叉搜索树(BinarySearchTree),平衡二叉树、B-树和B+树,键树二叉排序树BinarySortTree平衡二叉树AVL TreeB-树//B-Tree.c#include #include #define TRUE 1#define FA原创 2015-07-08 10:56:21 · 545 阅读 · 0 评论 -
关于c中指针传参的问题
当指针作为参数进行传递时,实际参数赋值给形式参数,形式参数与实际参数指向同一块存储区域。此时,可以用形参去对对存储区域进行操作,但一旦形参出现malloc等重新分配存储空间,此时形参指向新分配的存储空间。此时,形参与实参指向不一致!。所以在c语言中,需要先在非主函数分配空间,并在非主函数进行操作时,不要传指针参数,只可以用返回。(见二叉树操作代码)http://blog.youkuaiyun.com/qq_16原创 2015-05-05 21:28:28 · 583 阅读 · 0 评论 -
内部排序(二)快速排序
快速排序是对冒泡排序的一种改进,故在介绍快速排序之前,我们先介绍冒泡排序。冒泡排序:原理:将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换(假设正序输出),然后比较第二个记录和第三个记录的关键字。以此类推,直至第n-1个记录和第n个记录的关键字进行比较,这是第一趟。然后第二趟,第三趟…… 过程演示: 算法代码:(算法很简单,双重循环)#include #原创 2015-06-18 09:25:43 · 698 阅读 · 0 评论 -
内部排序(四)归并排序
总述:归并排序(Merging Sort)中归并是将两个或两个以上的有序表组合成一个新的有序表。 归并排序我们主要探讨2-路归并排序。 2-路归并排序 过程:假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到ceil(n/2)个长度为2或1的有序子序列;再两两归并,……如此重复,直至得到一个长度为n的有序序列为止。 2-路归并排序 过程演示:原创 2015-06-20 00:28:09 · 741 阅读 · 0 评论 -
内部排序(五)基数排序
基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。实现的过程不需要之前的所有排序所需要的记录关键字比较,移动等操作。 多关键字排序: 多关键字排序通常有两种方法: 1、MSD(Most Significant Digit)法,最高为优先法 2、LSD(Least Significant Digit)法,最低位优先法过程借助分配,收集两种操作。数组基数排序:过程演示:第一步原创 2015-06-20 18:37:10 · 587 阅读 · 0 评论 -
内部排序(一)插入排序
插入排序分为5种: 直接插入排序、折半插入排序、2-路插入排序、表插入排序、希尔排序。下面我们来一一介绍:直接插入排序过程叙述:先将序列中的第1个记录看成是一个有序的子序列,然后从第二个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。第i趟直接插入排序的操作为:将记录r[i]插入到有序子序列{r[1],r[2]……r[i-1]}中(自i-1起往前搜索,同时后移记录,直至找到插入原创 2015-06-10 23:26:12 · 1238 阅读 · 1 评论 -
内部排序(三)选择排序
选择排序(SeclectionSort)的基本思想:每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中的第i个记录。包括三种:简单选择排序、树形选择排序、堆排序。1、简单选择排序 原理: 一趟简单选择排序的操作为:通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换之。 对L.r[1…n]中记录进行简单选择排序的算法为:令i从1至n-1,进行n-1趟原创 2015-06-19 09:21:38 · 700 阅读 · 0 评论 -
Graph(store and create)
图的存储结构 1、 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 看一个实例,下图左就是一个无向图。 从上面可以看出,无向图的边数组是一个对称矩阵。所谓对称矩阵就是n阶矩阵的元满足aij = aji。即从矩阵转载 2015-05-12 22:01:47 · 733 阅读 · 0 评论 -
二叉树
#include "stdio.h"#include "stdlib.h"#include "string.h"typedef struct BiNode { char data; struct BiNode *lchild, *rchild;} BiNode;BiNode *create_bitree(char *char_array, int pos, int node原创 2015-05-03 21:02:36 · 682 阅读 · 0 评论