
数据结构基础
Zz8474
这个作者很懒,什么都没留下…
展开
-
栈的顺序存储结构及实现
栈是线性表的特例,栈只在栈顶进行插入及删除操作,因此数据是后进先出。栈的顺序存储其实也是线性表顺序存储的简化。栈的结构定义如下:typedef int SElemType;typedef Struct{ SElemType data[MAXSIZE]; int top; //栈顶指针}SqStack;进栈操作push,其代码如下:/*插入元素e为...原创 2019-05-30 21:03:11 · 323 阅读 · 0 评论 -
二叉树的存储结构
二叉树顺序存储结构二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系,比如双亲和孩子的关系,左右兄弟的关系等。一颗完全二叉树如下图所示:将这颗二叉树存入到数组中,相应的下标对应其同意的位置,如图所示:值得注意的是 ,顺序结构一般只用于完全二叉树。二叉链表二叉树每个结点最多有两个孩子,所以为它设计一个数...原创 2019-06-03 20:38:27 · 243 阅读 · 0 评论 -
二叉树的遍历
二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点仅被访问一次。这里有两个关键词,访问和次序。二叉树的遍历方法分为四种:1.前序遍历规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。如下图所示,遍历的顺序为:ABDGHCEIF2.中序遍历规则是若树为空,则空...原创 2019-06-03 21:52:44 · 157 阅读 · 0 评论 -
堆排序
堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆(下图左);或每个结点的值都小于等于其左右孩子结点的值,称为小顶堆(下图右)。这里需要从堆的定义可知,根结点一定是堆中所有结点最大(小)值。如果按照层序遍历的方式给结点从1开始编号,则结点之间满足如下关系:1.堆排序算法堆排序(Heap Sort)就是利用堆进行排序的方法。它的基本思想是,将...原创 2019-06-15 15:47:47 · 233 阅读 · 0 评论 -
线性索引查找
数据结构的最终目的是提高数据的处理速度,索引是为了加快查找速度而设计的一种数据结构。索引就是把一个关键字与它对应的记录相关联的过程。 一个索引由若干个索引项构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。所谓线性索引就是将索引项集合组织为线性结构,线性索引又分为:稠密索引、分块索引和倒排索引等。1.稠密索引稠密索引是指在线性索引中,将数据集中的每个记录对应一个索引...原创 2019-06-10 13:11:47 · 361 阅读 · 0 评论 -
二叉树遍历算法
二叉树的定义是采用递归的方式,因此,遍历算法也可以采用递归。1.前序遍历算法代码如下:/* 二叉树的前序遍历递归算法 */void PreOrderTraverse(BiTree T){ if(T == NULL) return; printf("%c", T->data); //显示结点数据,可以更改为其他对结点操作 PreOrde...原创 2019-06-04 10:10:58 · 182 阅读 · 0 评论 -
二叉排序树
二叉排序树(Binary sort tree),又称二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树:1.若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值2.若它的右子树不空,则右子树上所有结点的值均大于它的根结构的值3.它的左、右子树也分别为二叉排序树二叉排序树的结点间满足一定的次序关系,左子树结点一定比其双亲结点小,右子树结点一定比其双亲结点大。1.二叉...原创 2019-06-10 23:03:51 · 212 阅读 · 0 评论 -
二叉树的建立
如果要在内存中建立一个左图这样的树,为了能让每个结点确认是否有左右孩子,对其进行扩展,成为右图的样子。将二叉树中每个结点的空指针引出一个虚结点,其值为一个定值,比如“#”。这种处理后的二叉树为原二叉树的扩展二叉树。实现算法如下所示:/* 按前序输入二叉树中结点的值 *//* #表示空树,构造二叉链表表示二叉树T */void CreateBiTree(BiTree *T){ ...原创 2019-06-04 19:45:56 · 258 阅读 · 0 评论 -
归并排序算法
归并排序(Merging Sort)就是利用归并的思想实现的排序算法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,...,如此重复,直到得到一个长度为n的有序序列为止。这种排序方法称为2路归并排序。代码如下:/* 对顺序表L作归并排序*/void MergeSort(SqLi...原创 2019-06-16 19:51:20 · 268 阅读 · 0 评论 -
线索二叉树
在二叉链表中,我们只知道每个结点指向其左右孩子结点的地址,而不知道每个结点的前驱后继。要想知道,必须遍历一次。为了避免这种情况,我们可以创建指向前驱和后继的指针。这种指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就被称为线索二叉树。可以看出,其实线索二叉树等于是把一颗二叉树转变成了一个双向链表。然而这样又存在着问题,无法区分某一结点的lchild是指向它的左...原创 2019-06-04 21:32:34 · 231 阅读 · 0 评论 -
遍历线索二叉树
对线索二叉树进行遍历时,其实就是操作一个双向链表结构。遍历代码如下:/* T指向头结点,头结点左链lchild指向根结点,头结点右链rchild指向中序遍历的*//* 最后一个结点。中序遍历二叉线索链表表示的二叉树T */Status InOrderTraverse_Thr(BiThrTree T){ BiThrTree p; p = T->lchild...原创 2019-06-04 22:14:14 · 1832 阅读 · 0 评论 -
快速排序算法
1.快速排序算法快速排序算法由图灵奖获得者Tony Hoare设计出来,被列为20世纪十大算法之一。快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。假设现在需要对数组{50,10,90,30,70,40,80,60,20}进行排序,则代...原创 2019-06-17 10:52:54 · 278 阅读 · 0 评论 -
平衡二叉树(AVL树)
平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度至多等于1。平衡因子:将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子(Balance Factor)。距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,我们称为最小不平衡子树。如下图所示:1.平衡二叉树实现原理平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否...原创 2019-06-11 16:30:48 · 403 阅读 · 0 评论 -
归并排序的非递归实现
归并排序大量引用了递归,尽管在代码上比较清晰,易于理解,但是会造成时间和空间上的性能损耗。考虑将递归转化成迭代。/* 对顺序表L作归并非递归排序 */void MergeSort2(SqList *L){ int* TR=(int* )malloc(L->length*sizeof(int) ) //申请额外空间 int k =1; while(k<...原创 2019-06-17 14:51:05 · 458 阅读 · 0 评论 -
有序表查找
1.二分查找二分查找又叫折半查找,它的前提是线性表中的记录必须是关键码有序(通常从小到大有序,线性表必须采用顺序存储)。假设有一个有序表数组{0,1,16,24,35,47,59,62,73,88,99},共10个数字,对其进行查找是否存在62这个数。/* 二分查找 */int Binary_Search(int *a, int n, int Key){ int low,...原创 2019-06-10 09:30:09 · 541 阅读 · 0 评论 -
顺序表查找算法
顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个或最后一个记录开始,逐个进行关键字和给定值的比较,若某个记录的关键字和给定值相等则查找成功。顺序查找的实现算法如下:/* 顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字 */int Sequential_Search(int *a, int n, int Key){ int i; ...原创 2019-06-09 19:20:49 · 2486 阅读 · 0 评论 -
KMP模式匹配算法
算法原理:KMP模式匹配算法的思想是减少主串S下标i值的回溯,确定字串T下标j值的变化。next数组值推导:KMP模式匹配算法的代码如下:/* 通过计算返回子串T的next数组 */void get_next(String T, int *next){ int i,j; i = 1; j = 0; next[1] = 0; ...原创 2019-06-03 14:10:37 · 221 阅读 · 0 评论 -
栈共享空间
两栈共享空间的结构的代码如下:typedef struct{ SElemType data[MAXSIZE]; int top1; //栈1栈顶指针 int top2; //栈2栈顶指针}SqDoubleStack;对于两栈共享空间的push方法,我们除了要插入元素值共享参数外,还需要有一个判断是栈1还是栈2的栈号参数stackNumber,插入元素的代码如...原创 2019-05-31 11:04:57 · 242 阅读 · 0 评论 -
排序算法之冒泡排序
在讲排序算法之前,先提供一个顺序表结构。#define MAXSIZE 10 //用于要排序数组个数最大值,可修改typedef struct{ int r[MAXSIZE+1]; //存储要排序数组,r[0]用作哨兵或临时变量 int length; //记录顺序表的长度}SqList;定义一个函数swap:void swap(SqList *L, ...原创 2019-06-12 16:40:36 · 244 阅读 · 0 评论 -
栈的链式存储结构及实现
栈的链式存储结构,简称为链栈,如图所示:对于链栈来说,基本不存在栈满的情况,除非内存以没有存储空间。链栈的结构代码如下:typedef struct StackNode{ SElemType data; struct StackNode *next;}StackNode, *LinkStackPtr;typedef struct LinkStack{...原创 2019-05-31 19:20:57 · 419 阅读 · 0 评论 -
简单选择排序
简单选择排序(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换。代码如下:/* 简单选择排序 */void SelectSort(SqList *L){ int i,j,min; for(i=1;i<L->length;i++) { min = ...原创 2019-06-12 19:33:43 · 282 阅读 · 0 评论 -
直接插入排序算法
直接插入排序算法的基本操作是将一个记录表插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。/* 直接插入排序 */void InsertSort(SqList *L){ int i,j; for(i=2;i<=L->length;i++) { if (L->r[i]<L->r[i-1]) //需将L-...原创 2019-06-12 21:52:55 · 1063 阅读 · 0 评论 -
单链表创建之尾插法
实现算法如下:/*随机产生n个元素的值,建立带头结点的单链线性表L*/void CreateListHead(LinkList *L, int n){ LinkList p,r; int i; srand(time(0)); //初始化随机数种子 *L = (LinkList)malloc(sizeof(Node)); //创建线性表 ...原创 2019-05-29 16:09:28 · 352 阅读 · 0 评论 -
循环队列
循环队列的顺序存储结构如下:/* */typedef int QElemType;/* 循环队列的顺序存储结构 */typedef struct{ QElemType data[MAXSIZE]; int front; //头指针 int rear; //尾指针 }SqQueue;循环队列的初始化代码如下:/...原创 2019-06-01 16:23:56 · 292 阅读 · 0 评论 -
静态链表
用数组描述的链表叫做静态链表,这种描述方法还有起名叫做游标实现法。如下图所示: 图 1...原创 2019-05-29 21:49:34 · 189 阅读 · 0 评论 -
希尔排序算法
希尔排序的代码如下:/* 对顺序表L作希尔排序 */void ShellSort(SqList *L){ int i,j; int increment = L->length; do { increment = increment/3+1; //增量序列 for(i=increment+1; i<=L->...原创 2019-06-13 20:38:33 · 1343 阅读 · 0 评论 -
队列的链式存储结构及实现
队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,称之为链队列。为了操作上的方便,我们将队头指针指向链队列的头结点,将队尾指针指向终端结点,如下图所示:空队列时,头尾指针都指向头结点,如下图所示:链队列的结构为:typedef int QElemType; /* QElemType 类型根据实际情况而定 */typedef struct QNode...原创 2019-06-02 20:40:52 · 1399 阅读 · 0 评论 -
串的Index算法
代码如下:/* T为非空串。若主串S中第pos个字符之后存在与T相等的字串,则返回第一个这样的字串在S中的位置,否则返回0 */int Index( String S, String T, int pos){ int n,m,i; String sub; if(pos>0) { n = StrLength(S); //得到主串长度...原创 2019-06-02 21:27:53 · 3411 阅读 · 2 评论 -
串的存储结构
串的存储结构与线性表相同,分为两种。1.串的顺序存储结构串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的。按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。一般是用定长数值来定义。对于串的顺序存储,串值的存储空间可在程序执行过程中动态分配而得。比如在计算机中存在一个自由存储区,叫做“堆”,这个堆可有C语言的动态分配函数malloc()以及free()来管理。...原创 2019-06-02 22:03:26 · 3357 阅读 · 0 评论 -
串的朴素模式匹配算法
假设主串S为“goodgoole”,子串为“google”。简单的说,对主串的每一个字符作为子串开头,与要匹配的字符串进行匹配。对主串作大循环,每个字符开头作T的小循环,直到匹配成功或者遍历完为止。假设S和T的长度分别存与S[0]以及T[0]中。/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0 *//* T非空,1≤pos≤StrLength(S) */...原创 2019-06-03 09:38:31 · 1020 阅读 · 0 评论 -
散列表查找实现
1.散列表查找算法实现首先是需要定义一个散列表的结构和一些相关的函数。其中HashTable就是散列表结构,结构当中的elem为一个动态数组。#define SUCCESS 1#define UNSUCCESS 0#define HASHSIZE 12 //定义散列表长为数组的长度#define NULLKEY -32768typedef struct { int ...原创 2019-06-12 09:47:43 · 1376 阅读 · 0 评论