数据结构之C语言
文章平均质量分 71
MISSyingying
如果有一天我变得很有钱..............
展开
-
带头结点的双向链表
双向链表:每个数据节点中都有两个指针,分别指向该节点的前一个节点和后一个节点,所以在进行操作时就比较方便。在这里,我写的是带头节点的双向链表,所谓的头结点,它仅仅只是一个标志,并不保存任何数据。上面就说一个简单的双向链表。下面是我的代码:基本操作有:①双向链表的头插,尾插,头删,尾删,查找;②双向链表的任意位置之前插入元素,任意位置之后插入元素;依据元素的值进行元素的删除,依据元素的位置进行删除;...原创 2018-02-02 16:25:19 · 1589 阅读 · 0 评论 -
对于大数据的一些处理方法
问题:数据太大,在内存中无法一次性装入。题1:给定一个大小超过100亿的文件,该文件是用来存储IP地址,找到出现次数最多的IP地址。 分析:100亿就是大约就是10G,对于现在的计算机而言,内存中无法容纳这么大的文件。 解决:将一个大文件切分为多个小文件,例如:我们可以将该100亿的大文件切分为1000个文件,即每个文件的大小大约就是10M,那么就可以在内存中容纳得下了。 那么,我们要怎...原创 2018-08-02 16:17:55 · 4525 阅读 · 0 评论 -
位图&&布隆过滤器
经典题【给40亿个无符号的且无序的不重复的整数,如何判断一个数是否存在于这40亿个整数之中。】 分析:40亿整数:也就是40*4 = 160亿字节,也就是需要16G的内存才可以将这40亿的整数存储。显然当代我们的计算机并不能达到这样的要求,为了解决这样的问题,我们就要想其它的方法。我们的目的是为了判断一个数是否存在,所以,我们就可以将问题简化,只需要1位表示0和1就可以判断一个数是否真正的存在。...原创 2018-08-04 20:49:48 · 286 阅读 · 0 评论 -
堆的相关操作以及堆排序
堆:它的物理结构可以看做是数组,而逻辑结构可以看做一颗完全二叉树. 堆有大堆和小堆之分:大堆:根节点是当前所有元素中的最大值,而对于每一个子树,其子树也是一个大堆.小堆:根节点是当前所有元素中的最小值,而对于每一个子树,其子树也是一个小堆.堆的应用: 堆还可用来表示优先级队列.队列:即只允许队列的队首进行删除,而队尾进行插入.而优先级队列就是一组有序的队列.在堆中,进行插入和...原创 2018-07-06 14:44:38 · 364 阅读 · 0 评论 -
选择排序
原理: 比如现在是升序排序:那么每次都是在寻找当前剩余元素中的最小值,找到后与当前元素交换. 如下图所示: 代码实现: 是一个升序的代码: 3 void swap(int* a,int* b) 4 { 5 int tmp = *a; 6 *a = *b; 7 *b = tmp; 8 } 9 void SelectSort(int...原创 2018-07-03 20:24:47 · 182 阅读 · 0 评论 -
插入排序
对于插入排序,我理解的原理是这样的(假设是升序): 第一个元素不用排序,从第二个元素开始,与前面的元素比较,如果小于前面的元素就把前面的元素赋值给后面的元素. 前两个元素排好序以后,紧接着与第三个元素进行比较将这三个元素进行排序. …….. 如下图所示: 代码如下:void InsertSort(int arr[],int size){ if(size <= ...原创 2018-07-04 23:31:31 · 240 阅读 · 0 评论 -
归并排序(递归与非递归实现)
归并排序:采用的是一种分而治之的思想. 过程:将一个数组进行二分,直到有每组有一个元素为止.然后进行合并元素,按照一定的顺序进行排序. 代码实现: ①:递归实现void Merge(int arr[],int left,int mid,int right,int tmp[]){ if(right - left <= 1) { return; ...原创 2018-07-08 23:57:30 · 260 阅读 · 0 评论 -
快速排序算法(快排)
基本思想:快排也是一种分治的思想.从一个数组中选择一个数作为基准值(基准值一般为数组的最后一个元素或者第一个元素).遍历数组,如果大于基准值的放在基准值的右边,小于基准值的放在基准值的左边.对左右两个部分再执行第二步,直至每个区间只有一个元素为止.方法1:交换法遍历数组,找到第一个大于基准值的元素停下来;然后从数组的后面从前遍历,找到第一个小于基准值的元素停下来;然后交换找...原创 2018-07-10 11:37:33 · 359 阅读 · 0 评论 -
堆栈面试题之共享栈,最小栈,判断一个序列是否由一个栈进行基本的入出栈操作而得到
1.共享栈:方法:用数组实现,定义一个结构体,结构体中包含2个栈,其中一个栈的栈底数组中下标为0处,而两外一个栈的栈底为数组的最大值处。当两个栈的栈顶相遇时,即栈满。2.最小栈:即:每次取栈顶元素取出来当前栈中最小的元素。方法1:使用2个栈来实现,一个栈用来保存入栈的所有元素,另外一个栈用来保存当前栈中最小的元素。所以在取栈顶元素时就从保存较小元素的那个栈中取。可能讲的不是很清楚,看下图所示:方法...原创 2018-02-08 15:42:57 · 1046 阅读 · 0 评论 -
C语言:数据结构之队列
队列:生活中也会经常遇到的场景。即只允许在一端进行数据的插入操作,另一端进行数据的删除操作的特殊线性表。插入的一端一般为队尾(即为入队);删除的一端则为队首(即出队)。具有先进先出(FIFO)的特性。在这儿,我写了2种队列:顺序队和链式队。先来说说顺序队:出队的方法:①队头不变,出队后所有元素向前移动;②不移动元素,每删除一个元素,队头就向后移动一个元素。①队头位置不变:如下图所示:缺点:如果元素...原创 2018-03-08 11:46:11 · 336 阅读 · 0 评论 -
单链表的面试题---找到链表的中间节点--找到链表的倒数第K个节点
第一题:找到单链表的中间节点(且时间复杂度为O(1))快慢指针的方法:两个指针同时从头结点出发,快指针一次走2步,慢指针一次走1步,当快指针走完所有节点时,慢指针就恰好是该单链表的中间节点。(要注意单链表的长度是奇数还是偶数)第二题:找到链表的倒数第K个节点(时间复杂度为O(1))同样使用两个指针:让其中一个指针先走K步,然后让两个指针一起走。当先走的那个指针走完链表是,后出发的那个指针就是倒数第...原创 2018-02-05 19:06:49 · 487 阅读 · 0 评论 -
C语言版的单链表常见面试题:判断单链表是否带环,求环的长度,求环的入口
今天主要来解决一下以下几个面试题:1.判断单链表是否带环,若带环,则返回1;如何判断单链表是否带环:在这里,我们可以使用快慢指针。慢指针一次走一步,快指针一次走两步。如果带环,一定会在某个节点处快慢指针相遇;不带环,就会一直遍历到链表结束。(注意:快指针并非可以一次走任意步数,但是若带环每次走两步就一定会相遇);2.若单链表带环,求出环的长度;这个就比较easy了,在上一题的基础上,当快慢指针相遇...原创 2018-02-04 20:16:45 · 719 阅读 · 0 评论 -
单链表的逆置和从尾到头打印单链表
从尾到头打印单链表:递归法。先声明一个节点为头结点(cur = *head),当cur->next为空时,输出打印cur节点。否则,就一直调用该节点。单链表逆置:头插法。即删掉头结点的下一个节点,然后把删掉的节点进行该链表的头插。例如:这样,就可以把节点b插到a的前面。以此类推,知道cur->next==NULL为止。单链表逆置还有一种方法:初始化3个节点,然后按照顺序以此进行交换赋值...原创 2018-02-04 12:10:57 · 689 阅读 · 0 评论 -
哈希之开散列和闭散列
目的:实现一种结构,不经过任何比较,一次直接得到想要的元素。通过某种函数使元素的存储位置与它的关键码之间建立一种一一映射的关系。那么就可以在查找时快速的找到需要的元素。哈希概念哈希之散列方法:插入元素时:根据需要插入元素的值,通过某种计算得出元素的存储位置,将该元素插入到其对应的位置。查找元素时:根据需要查找的元素进行某种计算得到其存储位置,将该位置的元素与查找的元素进行比...原创 2018-08-03 15:36:28 · 8320 阅读 · 0 评论