数据结构
mignatian
这个作者很懒,什么都没留下…
展开
-
顺序表功能的模拟实现
今天学习了顺序表,对里面的知识有所了解,想通过自己的努力实现一下自己的顺序表首先我们要写一个头文件,包含我们所有要实现的功能#pragma once#define HEADER printf("\n------------%s-----------\n",__FUNCTION__)#include<stdio.h>#include<stdlib.h>#define ...原创 2018-03-15 09:55:24 · 305 阅读 · 0 评论 -
数据结构之栈和队列面试题(3)两个队列实现一个栈
我们知道队列是先进先出,而栈是后进先出的,所以要拿两个队列来实现一个栈,我们思路就应该这样: 每次总保持一个队列为空,对另一个队列进行操作。 入栈操作时,我们在那个有元素的队列后面直接用入队列操作,就相当于是栈的入栈操作。 在进行出栈操作的时候,我们将有元素的队列里面的元素依次出队列,并且入队列另一个队列,当出的还剩一个元素的时候,这个时候出队列的元素就是队尾元素,就相当于栈的出栈。正好就是...原创 2018-05-06 17:51:19 · 294 阅读 · 0 评论 -
数据结构之栈和队列面试题(4)一个数组实现两个栈
一个数组实现两个栈意思就是共享栈,怎么实现。具体大约有三种方法 方法一: 两个栈从数组的中间开始,分别向数组第一个元素,和数组最后一个元素方向入栈,到达边界就说明栈满了 方法二:两个栈分别从数组的开头和结尾开始向中间,当两个栈相遇,就说明栈满了 方法三:从第零个位置开始偶数是一个栈,奇数是一个栈,当到达数组最后一个元素的时候,说明栈满了 综合上面几个方法,我们可以知道,方法二是...原创 2018-05-06 20:07:29 · 315 阅读 · 0 评论 -
数据结构之哈希冲突解决方法(开放地址法)
首先我们来了解一下什么叫做哈希表 在顺序搜序偶以及二叉搜索树种,元素存储位置和元素个关键码之间没有对应关系,因此在查找一个元素时,必须要经过关键码的多次比较。 而我们理想的搜索方法:可以不经过任何比较,一次直接可以从表中得到想要的元素当向一个结构中 *插入元素时:根据待插入元素的关键码,以此桉树计算出钙元素的存储位置,并按该位置存放 *搜索元素时,根据元素的关键码进行同样的计算,把求得...原创 2018-05-21 17:44:22 · 1332 阅读 · 0 评论 -
数据结构之哈希冲突解决方法(链地址法)
上一篇我们了解了哈希表与哈希冲突的基本概念,并且展示了一种哈希冲突的解决方法,今天我们来了解第二种哈希冲突的解决方法 开散列法,又叫链地址法 开散列法:首先对关键码集合用散列函数计算出散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个无头结点的单链表连接起来,各链表的头结点存储在哈希表中,也就相当于,此时存储各个头结点的这个数组,是一个指针数组,这个数...原创 2018-05-21 17:54:13 · 2846 阅读 · 2 评论 -
数据结构之二叉树的基本操作
binarytree.h#pragma once#include<stdio.h>#include<stdlib.h>#include<stddef.h>#define HEADER printf("\n==============%s==============\n",__FUNCTION__)typedef char treenodetype;...原创 2018-05-16 00:05:20 · 860 阅读 · 0 评论 -
数据结构之二叉树常见面试题
按先序遍历创建一棵树treenode *_treecreat(treenodetype data[],size_t size,size_t *index,treenodetype null_node){ if(index == NULL) { return NULL;//非法输入 } if((*index) >= size) ...原创 2018-05-16 00:20:47 · 185 阅读 · 0 评论 -
数据结构之判断一棵树是不是完全二叉树
首先我们需要借助到队列 我们有两种思路 思路一:我们将所有节点都入队列,空节点入队列,当我们取队首元素,取到空的时候。我们查看队列里面size是不是0,不是0的话判断一下,如果是空这个标记,那么我们出队列,如果遇到还有不是空标记的元素,那么就一定不是完全二叉树。如果没有,那么就是完全二叉树。 具体实现看代码int iscompletetree(treenode *root){ ...原创 2018-05-16 00:55:13 · 264 阅读 · 0 评论 -
数据结构之堆的基本操作
堆说的堆,我们就知道有两种堆的方式 小堆(大堆)中:任意一个关键码均小于(大于)等于它的左右孩子的关键码,位于堆顶节点的关键码最小(最大),从根节点到每个节点的路径上手族元素组成的序列都是递增(递减)的堆存储在下标为0开始的数组中,因此在堆中给定下标为i的节点时如果i=0,节点i是根节点,没有双亲节点;否则节点i的双亲节点为(i-1)/2 如果2*i+1 &amp;lt;= n-1,则...原创 2018-05-27 00:16:11 · 509 阅读 · 0 评论 -
数据结构之哈希变形——位图
背景:海量数据处理 笔试题:给四十亿不重复的无符号,整形,没排过序。给一个无符号整数,如何快速判断一个数是否在这四十亿个数中在这里我们就可以用到我们的哈希思想。 位图:我们只需要表示这个数字存不存在的话,只需要一个比特位即可,所以我们用一个数组来装元素的个数,每个元素都有八个比特位,那么就可以表示八个数字【(用uint64_t的话),因为uint64_t不论在多少位机子下都是八字节】 这...原创 2018-05-23 11:51:06 · 265 阅读 · 0 评论 -
数据结构之哈希扩展——布隆过滤器
背景:在日常生活中,包括在设计计算机软件时,我们要经常判断一个字符串是否在一个集合中,一个英语单词是否拼写正确。最直接的办法就是将集合中的所有元素都存在计算机中,遇到一个新元素,将它和集合中的元素直接比较即可。一般来讲计算机中的集合是用哈希表来存储的,它的好处就是快速准确,缺点是费存储空间。以空间换时间。我们只需要看看所查的点是不是1就可以知道集合里面有没有它了。 但是因为哈希冲突的问题,所以我...原创 2018-05-23 14:29:50 · 354 阅读 · 0 评论 -
数据结构之动态通讯录的实现
动态通讯录包括了动态申请内存, **插入联系人; 删除联系人; 查找联系人; 排序联系人; 清空联系人; 修改联系人; 显示所有联系人;**下面来看代码 首先,我们要做好我们的准备工作 **adress.h**#pragma once#include &amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;gt;#include &amp;amp;amp;amp;amp;原创 2018-05-28 11:50:59 · 2676 阅读 · 2 评论 -
数据结构之二叉搜索树的基本操作
二叉查找树(Binary Search Tree)二叉搜索树(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树那么对一个二叉搜索树的操作就有: 初始化 销毁 插入 删除 查找 searchtr...原创 2018-05-24 15:47:29 · 318 阅读 · 0 评论 -
单链表的逆置(递归和非递归)
单链表的递归和非递归逆置#include <stdio.h>#include <stdlib.h>typedef char linktype;typedef struct linklist{ linktype data; struct linklist *next;}linklist;void linklistinit(linklist **...原创 2018-08-15 09:47:19 · 4095 阅读 · 1 评论 -
数据结构之栈和队列面试题(2)两个栈实现一个队列
我们怎么用两个栈来实现一个队列呢? 首先我们都知道,栈和队列的 出栈和出队列是不一样的,栈是后入先出,队列是先入先出。 所以我们的思路是,用两个栈,一个input,一个output, 我们每次想入栈的时候就先将output里面的元素依次出栈然后往input里面依次入栈,这个时候,input栈顶元素就是最后入栈的元素,我们可以在他后面进行入栈操作,也相当于入队列操作。 那么,我们每次想要...原创 2018-05-06 11:30:08 · 705 阅读 · 0 评论 -
数据结构之栈和队列面试题(1)最小栈的实现
我们对常见的一些栈和队列面试题进行了解 首先我们来看一下,实现一个最小栈,最小栈是什么? 就是不破坏栈的结构能保证每次出栈的元素都是当前栈内最小的元素,经过考虑,我们选择每次入栈两个元素,其中第二个元素就是当前最小的元素,这样就可以保证,在每一次出栈两个元素的时候,最小的元素都在栈顶。下面来看具体代码实现#include<stdio.h>#include"seqsta...原创 2018-05-05 11:32:59 · 243 阅读 · 0 评论 -
Linux进程(一)常见进程调度算法
一、先来先服务(FCFS)调度算法原理:系统将按照作业到达的先后次序进行作业调度工作。或者说它是优先考虑在系统中等待时间最长的作业,不管作业执行所需时间长短二、短作业优先(SJF)调度算法原理:SJF算法是以作业执行所需时间长短来计算优先级的,作业执行时间越短,那么他的优先级就会越高三、优先级调度算法原理:3.1非抢占式优先级调度算法:一旦把处理及分配给就绪队列中优先级最高的进程后,该进程就会一直...原创 2018-03-17 13:48:58 · 546 阅读 · 0 评论 -
单向不带头结点不带环的链表实现
链表有很多种类,单向,双向,不带头,带头,不带环,带环,结合起来一共可以有八种链表形式;今天我们来实现一种名字叫 单向不带头不带环的链表下面就是每一部分的代码实现首先我们要做的就是函数的声明,结构体的定义,头文件的引用#pragma once#define HEADER printf("\n----------%s------------\n",__FUNCTION__)#...原创 2018-03-25 17:38:40 · 212 阅读 · 0 评论 -
顺序表的实现
顺序表是计算机内存中以数组形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式就称之为顺序表。 要实现顺序表呢,首先就要定义结构体变量#define seqlistmaxsize 1000typedef char seqtype;typedef struct seqlist{ seqtype c[seqlistmaxsiz]; ...原创 2018-03-26 15:17:48 · 254 阅读 · 0 评论 -
僵尸进程,孤儿进程的实现
进程有很多种状态,其中有两种状态很有意思就是僵尸进程和孤儿进程。何为僵尸进程:僵尸进程就是子进程结束后没有告诉父进程返回信息,父进程得不到子进程的信息,于是子进程就变成了僵尸进程,下面我们来看下具体是如何实现的:#include<stdio.h>#include<stdlib.h>#include<unistd.h>int main(){ pi...原创 2018-03-15 23:00:08 · 216 阅读 · 0 评论 -
数据结构之顺序栈的实现
我们知道栈可以完成的基本操作是入栈,出栈,取栈顶元素,可以由顺序表形式实现,也可以由链表形式实现 今天我们就来实现一下顺序栈 首先来看下顺序栈的实现seqstack.h#pragma once#include<stdio.h>#include<stdlib.h>#include<stddef.h>#define HEADER printf("\...原创 2018-04-17 20:58:24 · 991 阅读 · 0 评论 -
数据结构之链式栈的实现
前面我们讲了顺序栈的实现,现在我们来看链式栈的实现#pragma once#include<stdio.h>#include<stddef.h>#include<stdlib.h>#define HEADER printf("\n============%s===========\n",__FUCTION__);typedef char li...原创 2018-04-17 21:47:22 · 385 阅读 · 0 评论 -
数据结构之顺序队列的实现
上一篇博客我们讲了顺序栈和链式栈的实现,今天我们来看一下顺序队列的实现#pragma once#include<stdio.h>#include<stdlib.h>#include<stddef.h>#define HEADER printf("\n==========%s==========\n",__FUNCTION__)#define M...原创 2018-04-18 10:30:02 · 316 阅读 · 2 评论 -
数据结构之链式队列
上一篇我们讲了,顺序队列,那我们如何用链表实现一个队列呢。 下面来看#pragma once#include<stdio.h>#include<stdlib.h>#include<stddef.h>#define HEADER printf("\n==========%s==========\n",__FUCTION__)typedef ch...原创 2018-04-18 11:42:06 · 162 阅读 · 0 评论 -
数据结构之单链表常见笔试题
头文件以及定义的节点都在上一篇的单链表功能实现里面有写逆序打印单链表递归方式简洁明了void linklist_reverseprintf(linklist *head){ if(head == NULL) { return;//空链表 } linklist_reverseprint(head->next); pr...原创 2018-04-07 00:17:50 · 513 阅读 · 0 评论 -
数据结构之单链表常见面试题2
判断两链表是否相交,返回交点(考虑带环)linklist *linklist_iscrossplus(linklist *head1,linklist *head2){ if(head1 == NULL) { return NULL; } if(head2 == NULL) { return NULL; }...原创 2018-04-07 10:28:26 · 174 阅读 · 0 评论 -
数据结构之带头结点带环的双向链表
1 #include <stdio.h> 2 #include"dlinklist.h" 3 void dlinklist_init(dlinklist **head)//初始化带头结点带环的双链表 4 { 5 if(head == NULL) 6 { 7 ...原创 2018-04-07 10:59:30 · 187 阅读 · 0 评论 -
数据结构之简单迷宫求解
迷宫问题我们都知道,在一张地图中寻找一条路可以走出去,所以我们可以建立这样一个地图 如图所示,我们的思路是这样的:我们可以规定0就是墙,而1 就是我们要走的路,可以落脚后,我们就将走过的点标记为2 然后顺时针递归探测下一个可以落脚的点,通过回溯法,我们就可以通过栈结构完成我们最简单的迷宫寻路 回溯法 我们从入口点进入,进行搜索路线,如果我们发现当前道路不通的时候,我们就会回溯到上一个点...原创 2018-05-17 00:23:51 · 1145 阅读 · 0 评论 -
数据结构之迷宫最短路径求解
上一篇我们讲了求解迷宫是否有出路的问题,这篇我们在迷宫有多条路的情况下怎么求出最短路径 我们的思路是建立两个栈,一个当前路径栈,一个最短路径栈,最开始的时候最短路径栈是空,我们把一条迷宫路径的所有节点都入栈,然后与最短路经比较,如果小于那么,就将当前路径的栈赋值给最短路径栈,其中包括重新申请大小等。 下面是具体代码实现#include "maze.h"#include "seqsta...原创 2018-05-17 01:09:54 · 3518 阅读 · 1 评论 -
合并两个有序链表(递归和非递归)
合并两个有序链表#include <stdio.h>#include <stdlib.h>typedef char linktype;typedef struct linklist{ linktype data; struct linklist *next;}linklist;void linklistinit(linklist **h...原创 2018-08-15 16:49:22 · 836 阅读 · 0 评论