![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
_YKitty
这个作者很懒,什么都没留下…
展开
-
数据结构| |选择排序
选择排序基本思想:在待排序序列中选择最小的记录,然后将这个数据元素与第一个记录交换,第一个记录到位,这是第一趟排序,然后进行第二趟排序,以此类推,进行n-1趟,序列就排序完成了,接下来看看代码。代码如下:void Swap(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp;}void select_sort(int arr[], int...原创 2018-06-23 16:59:39 · 134 阅读 · 0 评论 -
数据结构| |链表的面试题之判断单链表是否带环,求环长度以及求环的入口点
对于头文件这里就不在写了,直接写思路以及代码实现! 头文件可以参考前面的博客。地址:https://blog.csdn.net/qq_40399012/article/details/81742603原创 2018-08-17 17:03:40 · 679 阅读 · 1 评论 -
数据结构| |链表面试题之判断两个链表是否相交,若相交求交点
对于两个链表相交,首先要搞清楚,两个链表怎样就相交了。 对于两个链表相交,如果两个链表是X形状的这就不是相交的,这是相遇,只是在某一个位置进行相遇了而已,只有是Y这种形状的才是相交的。 接下来就思考一下,如何来判断两个链表相交了呢。首先我们来看一下两个链表相交的样子。 这就是两个链表相交的样子。可以看出当两个链表相交的时候,最后一个结点是一样的,所以只需要对两个链表都进行遍历到最后一个结...原创 2018-08-17 18:20:55 · 365 阅读 · 0 评论 -
数据结构| |双向循环带头链表
双向链表:双向链表就是该节点具有一个指向下一个结点的指针又具有一个指向前一个节点的指针 如图: 这就是一个双向链表的结点。接下来基本实现双向循环带头结点链表的基本操作:重点:双向带头结点链表的接口实现最重要的是要把插入一个结点和删除一个结点要会写。这两个是基础。切记切记!头文件:#ifndef __LIST_H__#define __LIST_H__#includ...原创 2018-08-20 21:50:09 · 213 阅读 · 0 评论 -
数据结构| |二叉树的基本操作
该博客直接将代码都粘贴上来,有测试函数,所以大家可以下载测试一下,也可学习接口的实现以及递归思想,我已将所有接口实现的思想也写在代码中。 直接上代码:头文件:#ifndef __BINARYTREE_H__#define __BINARYTREE_H__#include <stdio.h>#include <assert.h>#include &amp原创 2018-08-20 22:28:09 · 875 阅读 · 0 评论 -
数据结构| |二叉搜索树基本操作(总概括,详细版, 非递归版本)
二叉搜索树也叫二叉排序树。 特点:每个根节点的左子树上的数据都小于该根节点的数据,每个根节点的右子树的数据都大于该根节点的数据。 对二叉搜索树进行中序遍历就可以得到一个递增的序列。主要接口: //对二叉搜索树的的插入 void BSTreeInsert(BSTreeNode** root, BSTDataType x); //对二叉搜索的删除一个数据 ...原创 2018-08-23 17:53:19 · 186 阅读 · 0 评论 -
数据结构| |二叉树的面试题之判断该二叉树是不是完全二叉树
判断方法: 采用层次遍历,即可对于一个二叉树将其进行层次遍历,如果是空节点的话也进行入队列,这个时候就可以判断了。 如果出队列的时候,出的元素是空的话,那么只需要判断该队列中是否还有非空元素,如果还有的话,那就说明该二叉树不是完全二叉树,否则就是完全二叉树。如图: 这就是一个完全二叉树对其入队操作,就将变成下面的样子,对其进行出队的时候,当遇到NULL(空)时,后面已经没有...原创 2018-08-23 23:12:39 · 287 阅读 · 0 评论 -
数据结构| |链表面试题之求两个链表的交集和差集
这个面试题简单看代码就可理解。//求两个链表的交集pList Intersection(pList pList1, pList pList2){ if (pList1 == NULL || pList2 == NULL) { return NULL; } pList newList = BuyNode(0);//添加头结点,这样就不用在后面进...原创 2018-08-21 15:19:56 · 1090 阅读 · 0 评论 -
数据结构| |二叉树的三种遍历方式(递归&&非递归)
首先来写一下递归的!对于递归要将大问题转化为小问题,并且要有一个结束的位置。 比如:要前序遍历一个二叉树,那就是先访问根节点,然后在访问根节点的左子树,在访问根节点的右子树,而左子树与右子树,又可以变成访问该节点和该结点的左子树和右子树。这就变成了一个递归的思想了。而终止条件就是:直到访问到叶子节点。//递归//前序遍历二叉树(根节点 左子树 右子树)void BinaryTre...原创 2018-08-21 16:38:50 · 2007 阅读 · 0 评论 -
数据结构| |二叉搜索树基本操作(递归)
接口实现 //对二叉搜索树插入一个数据 int BSTreeInsertR(BSTreeNode** root, BSTDataType x) //查找一个数据 BSTreeNode* BSTreeFindR(BStreeNode** root, BSTDataType x) //删除一个数据 int BStreeRemoveR(BStreeNode** ...原创 2018-08-24 22:49:29 · 212 阅读 · 0 评论 -
数据结构| |用二叉搜索树实现Key--Value模型
Key是关键字,Value是值。根据关键字取值对于这个模型只需要改变结构体类型就好了,使其在存储的时候,既可以储存Key又可以储存Value就好了。 可以用这个模型实现,记录你写的英语单词的次数,将其存储在二叉搜索树中结构体类型:typedef struct BSTreeNode{ struct BSTreeNode* _left; struct BSTreeNod...原创 2018-08-24 23:21:41 · 666 阅读 · 0 评论 -
数据结构| |位图
位图:也就是哈希表的变形,只是用一个bit位来存放一个数据。(准确来说是表示一个数据在该位置上存在不存在)对于一个bit位,只可以存放0和1两种状态,所以位图只能解决的问题就是判断一个数据存在或者不存在。代码实现://数据结构typedef struct bitset{ char* _bits; int _size;}bitset;//各种函数的实现//n代...原创 2018-09-10 23:37:54 · 307 阅读 · 0 评论 -
数据结构| |布隆过滤器
布隆过滤器(Bloom Filter):是位图的扩展。 对于位图的话,对于判断整形数据存在不存在的话,是非常的方便的,但是对于字符串就显得难以解决掉的,这个时候就出现了布隆过滤器。对于数据的话,除了整形数据的话也就是字符串的数据了,而布隆过滤器就是处理如何判断一个字符串是如何存在的。方法:对于字符串的话,还是采用位图的方式来储存,那这就出现了一个问题,如何将字符串储存到位图中呢,这就牵扯...原创 2018-09-13 21:52:10 · 376 阅读 · 0 评论 -
数据结构| |各类排序的时间复杂度以及稳定性
各类排序的时间复杂度以及稳定性插入排序: 直接插入排序:O(N^2) 稳定 希尔排序:O(N^1.3) 不稳定 选择排序: 选择排序:O(N^2) 不稳定 堆排序:O(NlogN) 稳定 交换排序: 冒泡排序:O(N^2) 稳定 快速排序:O(NlogN) 不稳定 归并排序: 归并排序:O(NlogN) 稳定 桶排序:...原创 2019-03-01 20:00:57 · 886 阅读 · 1 评论 -
数据结构| |时间复杂度与空间复杂度
时间复杂度:函数语句总的执行次数与问题规模n的函数表达式空间复杂度:函数中创建对象的个数关于问题的规模函数表达式 一般算法O(n)计算方法:- 用常数1取代运行时间中的所有加法常数- 在修改后的运行次数函数中,只保留最高阶项- 如果最高阶项系数存在且不是1,则去除与这个项相乘的常数 递归算法:时间复杂度:递归总次数 * 每次递归次数空间复杂度:递归深度 * 每...原创 2018-08-17 16:04:53 · 178 阅读 · 0 评论 -
数据结构| |堆排序
堆排序:也是选择排序的一种,只不是利用树形结构来进行排序 优点:时间复杂度为O(nlogn) 分为两种: 一:从小到大 二:从大到小对于从小到大采用大顶堆来进行排序。 每次取大顶堆的堆顶,将堆顶与最后一个元素进行交换,然后在对堆进行排序调整使其变为大顶堆,然后再取堆顶元素,让堆顶元素再和倒数第二个元素进行交换,一直这样循环,知道只剩下一个元素没有进行交换,那么该...原创 2018-08-22 23:06:41 · 1654 阅读 · 0 评论 -
数据结构| |直接插入排序
直接插入排序思想:对于一个给定数组,将数组的第一个元素当做已经排好序的序列,然后每次讲数组元素的一个元素插入到该有序序列中,直到插完思想:对于一个数组,先将第一个元素当做有序的序列,然后依次将后面的元素插入到这个序列中。方法:每次用前一个数和要放入的元素进行比较,如果大于的话就将其向后移动,最后找到要插入的位置,在进行插入。代码如下;void insert_sort(int ar...原创 2018-06-23 21:37:17 · 171 阅读 · 0 评论 -
数据结构| |希尔排序
希尔排序思想:又称“缩小增量排序”,先将整个待排记录序列分割成为若干个子序列,对每个子序列分别直接插入排序,待整个序列记录“基本有序”时,再对全体记录进行一次直接插入排序。代码如下:void shell_sort(int arr[], int sz){ //自己定义一个增量数组 int add[MAX] = { 0 }; int sz_d = 0; int ret = sz; whil...原创 2018-06-24 21:29:45 · 125 阅读 · 0 评论 -
数据结构| |冒泡排序
冒泡排序:也叫作起泡排序对于n个数据,进行n-1次冒泡,每一次冒泡将最大的或者最小的放到序列的第n个,然后在进行下一次冒泡,下次冒泡将前n-1个数据的最小的,放到n-1的位置上,一次冒泡,知道n-1结束,那么该序列也就有有序了。代码如下:1.基础版(没有进行任何优化)void bubble_sort(int arr[], int sz){ int i = 0; int j = 0; for...原创 2018-06-24 22:00:27 · 500 阅读 · 0 评论 -
数据结构| |快速排序
代码如下:void quick_sort(int arr[], int left, int right){ //保存枢轴 int head = left; int tail = right; int pivotkey = arr[left]; if (left < right) { while (left != right) { while (left < ...原创 2018-06-26 06:54:15 · 204 阅读 · 0 评论 -
剑指offer| |从尾到头打印链表
有三种方法:第一种:采用设置一个标志结点的的方法。先将标志放在NULL,遍历链表如果cur->next==flag,那么就将cur->data打印出来,然后将标志前移,再次遍历就可以打印倒数第二个数据,然后再将标志前移,知道标志,在头结点plist位置第二种:采用递归将其打印出来但三种:采用栈的思想。因为栈是先进后出,这刚好与这道题的思想一样,最先的最后打印,那么就可以用栈来进行编写了...原创 2018-07-02 18:27:20 · 100 阅读 · 0 评论 -
数据结构| |栈和队列(基本接口的实现)
栈和队列注意:对于栈和队列要深入学习,这两个数据结构可以说是数据结构中的基础,对于后面的许多数据结构都要用到,而且面试考这一部分的也特别多,因此要对于栈和队列不能有一点马虎,切记切记!本文写的栈是顺序栈,队列是链式队列。为什么要写顺序栈和链式队列呢?可以看下一篇博客:链接地址:https://blog.csdn.net/qq_40399012/article/details/81835...原创 2018-08-14 13:02:45 · 689 阅读 · 0 评论 -
数据结构| |栈和队列面试题(总概括)
栈和队列面试题里面包含了全部的代码哟!大家可以下载下来测试哦!1.实现一个出栈,进栈,求最小值,时间复杂度为O(1)的栈2.用两个栈实现队列3.用两个队列实现栈4.元素出栈顺序,入栈顺序的合法性5.一个数组实现两个栈注意:对于代码中出现的头文件“Stack.h”与"Queue.h"可以参考上一篇博客链接:https://blog.csdn.net/qq_403990...原创 2018-08-14 23:07:01 · 260 阅读 · 0 评论 -
数据结构| |链表的基本操作以及链表的面试题(总概括)
这是链表的基本操作以及链表的面试题的全部内容,可供大家下载哟!里面也写好了测试函数,大家可以看一下,测试一下!直接上代码:头文件:#ifndef __LINKLIST_H__#define __LINKLIST_H__#include <stdio.h>#include <assert.h>#include <stdlib.h>#i...原创 2018-08-16 15:34:44 · 224 阅读 · 0 评论 -
数据结构| |为什么要写顺序栈和链式队列呢?(原因剖析)
要知道为什么要写顺序栈和链式队列的前提,首先大家要理解栈和队列的结构栈:是一种特殊的线性表,只可以在一端进行插入和删除的操作!具有先进先出的特性。队列:是只允许在一端进行插入操作,在另一端进行删除操作。进行插入操作的一端叫做队尾,进行删除操作的一端叫做队头。首先来介绍队列为什么要用链式存储: 要介绍链式队列我们就先用顺序存储来实现一下队列看会变什么样子。 这就是顺序队列! ...原创 2018-08-19 10:20:41 · 1460 阅读 · 2 评论 -
数据结构| |链表面试题之复杂链表的复制
首先来给大家介绍一下什么是复杂链表: 一个链表的每个节点,有一个指向next指针指向下一个节点, 还有一个random指针指向这个链表中的一个随机结点或者NULL 现在要求实现复制这个链表,返回复制后的新链表 结点如图: 这里只写对复杂链表如何复制,对于复杂链表的遍历,可以看一下以前的博客,里面代码全都有复制,打印,测试函数都有。链接地址:https://blog.csdn.net/...原创 2018-08-19 12:01:38 · 195 阅读 · 0 评论 -
数据结构| |浅谈工程中头文件与源文件
最近在学习数据结构的时候,创建一个工程之后,一个工程里面出现好几个源文件和头文件,一下子就不理解这是啥意思,如何来将这些东西连接在一起,代码测试的时候是如何实现的。一般都是一个头文件和两个源文件。一个源文件是写头文件里面声明的函数的定义的部分的,而另外一个源文件就是对于该工程的测试。 通常在一个c程序中,只包含两类文件.c文件和.h文件。其中,.c文件被称作是源文件,...原创 2018-08-16 23:04:05 · 1690 阅读 · 0 评论 -
数据结构| |哈希表(基本操作)
附上代码: 头文件#ifndef __HASHTABLE_H__#define __HASHTABLE_H__#include <stdio.h>#include <assert.h>#include <stdlib.h>enum State{ EMPTY, EXIST, DELETE};typedef...原创 2018-08-26 17:33:35 · 413 阅读 · 0 评论 -
数据结构| |对于堆的基本操作(总概括)
堆:就是完全二叉树,所以对于堆的存储可以用顺序存储来储存堆。这样便于对堆的便利与操作。 对于具有n个结点的完全二叉树,如果按照从上至下,从左至右的顺序对所有节点从0开始编号,则对于序号为i的节点有: 若i &gt; 0,双亲序号:(i - 1) / 2; i = 0, i为根节点编号,无双亲结点 若2i + 1 &lt; n,左孩子序号:2i + 1,否则无左孩子结点 若...原创 2018-08-22 17:28:42 · 195 阅读 · 0 评论 -
数据结构| |快速排序,二路快排,三路快排
快速排序、二路快排、三路快排1. 快速排序1. 概念快速排序采用分治的思想对数据进行排序 选择一个基准值 将比基准值小的放在基准值的左边,其余的(大于或者等于)放在右边 然后再对左边和右边继续进行划分,直到划分的区间长度为1 2. 时间复杂度快速排序划分区间的时候为O(logN),每次都需要时间复杂度为O(N)进行排序所以快排的时间复杂度是O(Nl...原创 2019-04-06 18:55:27 · 4396 阅读 · 0 评论