![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 78
L_X_Y_HH
这个作者很懒,什么都没留下…
展开
-
基于C语言实现顺序栈
提到栈,首先想到的是栈中元素移动的方式为先进后出,下面基于顺序表来实现栈的一些操作。下图为入栈和出栈的操作操作,可以从图中看出,最先入栈的在最下面,而出栈的时候却正好相反,最后入栈的要先出来为了使栈的大小可以一直容纳栈中的元素,在这里在结构体中设定了一个最大长度的变量,当栈中元素充满栈时,栈能够自己扩展容量 3 typedef char SeqStactType; 4 typedef str...原创 2018-04-07 16:23:59 · 958 阅读 · 0 评论 -
基于C语言实现迷宫
说到迷宫,首先一定要有一个迷宫的地图,让后还要规定寻找迷宫出口的一些规则关于迷宫的地图,在这里我创建了一个二维数组来表示迷宫地图,并且约定(1)位置0为墙(即不能走的地方),位置1为路(2)走到边界点的位置,就为出路(3)按照上、右、下、左(顺时针)的顺序来探测下一步出路,若下一步路,就往下走(4)若当前点可以走,就将当前点标记为2,为了区分位置1,防止不知道自己走了重复的路首先先来创建迷宫地图并...原创 2018-04-21 11:44:58 · 11034 阅读 · 2 评论 -
基于C语言实现堆的一些操作
堆是一个完全二叉树,堆分两种,一种为小堆,一种为大堆小堆是指对于这个树的任意任意一个子树来说,子树的根节点都要小于左右孩子节点的值,小堆的根节点是这个树的最小元素大堆是指对于这个树的任意任意一个子树来说,子树的根节点都要大于左右孩子节点的值,大堆的根节点是这个树的最大元素1.对堆进行初始化操作其中有一个比较函数Compare,来比较确定是大堆还是小堆 16 //初始化,决定是大堆还是小堆 17 ...原创 2018-05-13 16:18:10 · 1036 阅读 · 0 评论 -
基于C语言实现二叉搜索树
二叉搜索树的特点是左子树<根节点<右子树,并且任何节点的左右子树的高度差不超过1,搜索二叉树与满二叉树无关,只要满足上面的条件即可1.初始化操作此时传入的为根节点的指针的指针 40 //初始化 41 void SearchTreeInit(SearchNode** pRoot) 42 { 43 if(pRoot == NULL) 44 { 45 ...原创 2018-05-13 16:48:44 · 232 阅读 · 0 评论 -
二叉树的一些常见基本面试题
1.使用非递归地方式来完成二叉树的先序、中序、后序遍历(1)使用非递归地方式来完成二叉树的先序遍历通过栈来实现首先先将根节点入栈,然后循环,取出栈顶元素为当前元素,并打印当前元素,再将当前元素的右子树和左子树先后入栈,再重复之前的操作,直到栈为空,循环结束,详细操作见图(竖向来看)340 //先序341 void TreePreOrderByLoop(TreeNode* root)342 {...原创 2018-05-13 18:30:03 · 343 阅读 · 0 评论 -
基于C语言实现哈希表(线性探测)
之前在写过的很多的结构中都实现过搜索功能,但是不论是顺序搜索还是搜索二叉树,由于元素的存储位置和元素各关键码之间没有对应的关系,所以在查找一个元素的时候必须要经过关键码的多次比较。因此搜索的时间复杂度很难能够达到O(1)。但是如果有一种存储结构,通过某种函数使元素的存储位置与他的关键码之间能够建立一一映射的关系,那么就能够直接地查找到需要地元素,时间复杂度就达到了O(1),那么这种结构就是哈希表。...原创 2018-05-28 17:24:26 · 3183 阅读 · 0 评论 -
基于C语言实现哈希表(开散列)
上一篇博客写了基于线性探测实现哈希表的一些方法,但若是负载因子较大时,哈希表的查找数据效率还是会很低,下面将使用开散列来实现哈希表的一些操作开散列又称为链地址法(开链法)首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个集合称为一个桶,桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中例如:数据集合{10,51,14,33,18,29},哈希函数Hash...原创 2018-05-29 10:38:21 · 2677 阅读 · 0 评论 -
基于C语言实现位图
之前写过哈希表的一些操作,下面来介绍哈希表的一种变形——位图位图是用来表示数字是否存在的情况位图的优点是能够节省很多空间,但是缺点就是只能够表示数字是否存在...原创 2018-06-15 14:26:28 · 3189 阅读 · 0 评论 -
布隆过滤器
1.初始化 8 void BloomFilterInit(BloomFilter* bf) 9 { 10 if(bf == NULL) 11 { 12 return ; 13 } 14 BitmapInit(&bf->bm,BitmapMaxSize); 15 bf->bl...原创 2018-06-15 14:35:17 · 146 阅读 · 0 评论 -
排序
下面写一些关于排序的一些基本方法:1.冒泡排序思路:就像“冒泡泡”一样,从头开始,两个两个数作比较,将两个数中较大(较小)的数向后移,再比较下面两个数,依次将较大(较小)的数向后移,最终,将一组数中最大(最小)的数,移动到最后面,再从头开始,移下一个数 14 /************************************* 15 * 16 *冒泡排序 17...原创 2018-06-15 15:02:06 · 202 阅读 · 0 评论 -
Java实现二叉树的一些操作
之前写过关于C语言实现二叉树的一些操作这段时间正好在看Java,就将一些常见的二叉树问题转换为Java语言实现1.二叉树的先序、中序、后序、层序遍历(递归与非递归)先序遍历:二叉树的先序遍历顺序为:先打印根节点,再遍历左子树,最后遍历右子树递归思路:若二叉树为空,则直接返回空若二叉树非空,先打印根节点,再先序遍历左子树,再先序遍历右子树import Demo.TreeNode;//递归实现/...原创 2018-07-12 19:59:24 · 811 阅读 · 0 评论 -
数据结构Java——几种查找方式(顺序查找,二分查找,插值查找,斐波那契查找)
顺序查找使用for循环来依次遍历,实现查找二分查找二分查找,又称为折半查找,查找的效率很高算法思想给定一串有序的序列,以这串序列的中间元素为基准, 若要查找元素 > 中间位置元素,说明要查找元素在序列前半部分 若要查找元素 < 中间位置元素,说明要查找元素在序列后半部分 这样使得每次查找的范围都将减少一半算法优缺点优点:查找的次数较少,查找速度快...原创 2018-08-15 19:31:45 · 1196 阅读 · 0 评论 -
Java——排序(冒泡排序,选择排序、插入排序,快速排序,堆排序)
冒泡排序排序思想就像“冒泡泡”一样,从头开始,两个两个数作比较,将两个数中较大(较小)的数向后移,再比较下面两个数,依次将较大(较小)的数向后移,最终,将一组数中最大(最小)的数,移动到最后面,再从头开始,移下一个数 下面是一个栗子: 要排序数组(升序):{4,2,7,3,1} ———————————— 第一趟(交换四次):第一次:4与2比较,4大于2,交换两个数——{2...原创 2018-08-18 20:25:45 · 2085 阅读 · 0 评论 -
基于C语言实现二叉树
树是一种数据结构,是由n (n>=1)个有限点组成一个具有层次关系的集合而二叉树是每个结点最多有两个子树的树结构下面是关于二叉树的一些简单操作在之前写过的链表中,是用链表的头节点的指针来表示一个链表,那么在二叉树中,同样是使用根节点的指针来表示一个二叉树 4 typedef struct TreeNode 5 { 6 TreeNodeType data; 7 s...原创 2018-05-02 21:20:54 · 624 阅读 · 0 评论 -
基于Java实现不带头节点的双向链表的操作
本文主要是基于Java来实现不带头节点的双向链表的一些操作首先要创建一个类Node来描述链表的节点其中data为链表节点的值,prev和next分别是当前节点的前一个节点和后一个节点 private class Node { private Object data; private Node prev; private Node next; private Node(Object...原创 2018-04-20 16:35:08 · 993 阅读 · 0 评论 -
基于C语言实现顺序队列
栈和队列的区别在于,栈是先进后出,而队列是先进先出下面为入队列的过程下面为出队列的操作下面是基于顺序表来实现队列的一些操作对于队列操作,为了操作方便,需要设立三个变量,分别为head,tail和size,分别表示,链表的头部、尾部和链表的长度 5 typedef struct SeqQueue 6 { 7 SeqQueueType data[SeqQueueMaxSize]; ...原创 2018-04-07 16:36:32 · 812 阅读 · 0 评论 -
基于C语言实现链式栈
之前写过通过顺序表来实现栈,这里就写下基于链表来实现栈的一些操作首先先要在头文件中创建一个结构体,里面要包含所需要的一些元素 4 typedef char LinkType; 5 typedef struct LinkStack 6 { 7 LinkType data; ...原创 2018-04-08 18:00:39 · 239 阅读 · 0 评论 -
基于C语言实现链式队列
之前写过基于顺序表来实现队列,这里就写下基于链表来实现队列的一些操作首先先要在头文件中定义两个结构体 3 typedef struct LinkNode 4 { 5 LinkType data; 6 struct LinkNode* next; 7 }LinkNode; 8 typedef struct LinkQueue 9 { 10 Link...原创 2018-04-08 18:29:29 · 360 阅读 · 0 评论 -
栈和队列的一些笔试题(2)
问题4:元素出栈、入栈顺序的合法性问题5:共享栈(一个数组实现两个栈)问题4:元素出栈、入栈顺序的合法性问题分析:首先先创建一个栈,有两个数组,分别为input和output,分别表示入栈的元素,和要出栈的元素,先将input的元素循环入栈,然后取栈顶元素与output_index做比较,若栈顶元素不等于output_index,则循环结束,让下一个input元素入栈,若output_index等...原创 2018-04-16 16:41:02 · 169 阅读 · 0 评论 -
带头节点带环双向链表的一些操作(1)
链表有很多种,有单项、双向链表,带环、不带环链表,带头节点、不带头节点链表,而这些链表又可以两两或者三个三个组成一种链表,下面主要是说带头节点带环双向链表的一些操作。带头节点的链表是指创建一个节点表示空链表,这个节点就是头节点,并且头节点的数据没有任何意义,只是一个形式。带环的双向链表的每一个节点都有两个指向,以头节点为例,head->next指向head节点的下一个节点,head->...原创 2018-04-03 23:22:47 · 268 阅读 · 0 评论 -
基于静态数组的顺序表的一些基本操作(2)
1.查找下标为Pos位置的值2.删除指定元素3.删除所有to_move的值4.冒泡排序5.选择排序查找下标为Pos位置的值216 //11.查找指定位置pos的值217 int SeqListGet(SeqList *seqlist,size_t pos,SeqListType *value)218 {219 if(seqlist ==NULL) ...原创 2018-04-01 14:26:52 · 244 阅读 · 0 评论 -
单链表的几道经典面试题(2)
1.判断单链表是否带环2.计算环的长度3.求环的入口4.判断两个链表是否相交,若相交求交点(默认链表不带环)5.判断两个链表是否相交,若相交求交点(链表可能带环)6.找两个已排序链表的相同部分7.复杂链表拷贝判断单链表是否带环方法一:将每个节点保存到顺序表中,再将每个节点遍历,看是否带环。但是这种方法的时间复杂度为O(n^2),所以,又想出了一种方法,来优化第一种方法,来使时间复杂度变为O(n)方...原创 2018-04-01 11:32:21 · 182 阅读 · 0 评论 -
单链表的几道经典面试题(1)
1.从尾到头打印单链表2.约瑟夫环问题3.单链表的逆置4.单链表的排序(冒泡法)5.合并两个有序单链表之后使新的单链表依旧有序6.查找单链表的中间节点,且只能遍历一次链表7.查找单链表的倒数第K个节点8.删除倒数第k个节点从尾到头打印单链表这道题的思路是要运用递归来实现 407 //逆置打印链表 408 #include <stdio.h> 409 void LinkL...原创 2018-03-29 20:17:46 · 207 阅读 · 0 评论 -
栈和队列的一些笔试题(1)
下面来写一些关于栈和队列的一些笔试题:问题1:实现一个栈,要求实现Push(入栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)问题2:使用两个栈实现一个队列问题3:使用两个队列实现一个栈问题1:实现一个栈,要求实现Push(入栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)问题分析:要实现返回栈的最小值的时间复杂度为O(1),就要使整个栈的最小元素一定要是在栈顶,那...原创 2018-04-11 22:49:09 · 597 阅读 · 0 评论 -
带头节点带环双向链表的一些操作(2)
删除pos位置的元素首先先要判断链表是否合法和链表是否为空链表。链表删除pos位置元素前后链表指向的变化主要是要删除的元素to_delete元素的下一个节点next和要删除的元素to_delete元素的上一个节点prev。在删除pos位置元素之前,链表指向为to_delete->next指向next,to_delete->prev指向prev,删除pos位置元素之后,prev->...原创 2018-04-04 23:18:02 · 136 阅读 · 0 评论 -
不带头节点不带环的单向链表的一些操作(1)
链表有很多种,有单项、双向链表,带环、不带环链表,带头节点、不带头节点链表,而这些链表又可以两两或者三个三个组成一种链表,下面主要是说带不头节点不带环单向链表的一些操作。链表初始化链表初始化有三种方法方法一: 4 //1.链表初始化 5 void LinkListInit(LinkNode** node) ...原创 2018-04-06 09:52:00 · 187 阅读 · 0 评论 -
不带头节点不带环的单向链表的一些操作(2)
判断链表是否为空可以用三目运算符来化简代码 329 //12.判断链表是否为空,若为空返回1,否则返回0 330 int LinkListEmpty(LinkNode* head) 331 { 332 // return head == NULL?1:0; 333 if(head == NULL) 334 { 335 //空链表 336 retu...原创 2018-04-06 10:14:35 · 211 阅读 · 0 评论 -
内部排序与外部排序
转载自:https://blog.csdn.net/hq942845204/article/details/80303762 本篇文章主要介绍内部排序与外部排序的知识,如果你和我一样还不知道内部排序和外部排序为何物的话,不妨看看我的理解正文由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:内部排序与外部排序。概念内部排序:待排序记录存放在计算...转载 2018-08-20 11:05:44 · 1444 阅读 · 0 评论