C语言
文章平均质量分 80
CodingGeek
屌丝一枚,喜编程,对C/C++,数据结构与算法,操作系统,平台移植,QT,设计模式,开发框架等一切有研究价值的东西感兴趣!
展开
-
数组越界导致局部变量修改
#include int main(){ int i = 1; int a[2]; a[0] = 2; a[1]= 1; a[2] = 4; printf("i = %d\n", i); return 0;}原创 2014-08-11 22:57:09 · 1320 阅读 · 0 评论 -
Hash函数经典用法
撰写这篇文章之前,先牢骚几句。程序员除了数据结构与算法,什么也不属于自己---记得哪个NB人物曾经说过这样的话。的确,程序员水平高低如何,很大程度上取决于基本功是否扎实。高级程序员与普通码农的区别在我看来就是对这些基础知识是否做到了运用自如。许多程序员开发程序也是简单地调用已有系统库,或者第三方组件,写写简单的hello world或者if...else之类的程序,这样下去其个人竞争优势逐渐散失,原创 2015-05-28 22:11:45 · 14240 阅读 · 1 评论 -
C语言实现C++面向对象语言多态特性
我们知道,C++语言演化过程中,加入了不少新特性,使其成为一门现代高级OO语言。当初C++在上个世纪七十年代末,80年代初时,C++发展刚刚起步,那时C++可以看作C with class,C++编写的代码是经过转换成C语言代码后,再经过C编译器来生成目标代码的。如今,C++语言已经自成一套体系,有自己语言书写风格和设计理念。C++整个语法体系中包括了C++基础(兼容C语言语法特性,OO特性)、模原创 2016-03-09 21:02:36 · 2605 阅读 · 0 评论 -
二元多项式同类项合并问题
编码习惯一定要养成好!编码过程中如果使用了全局变量的,在函数过程调用完了之后,切记一定要记得清零,不然可能会有想不到的异常! 测试用例最少要准备2个以上case,以防单个Case无法预料的问题。下面来一道多项式问题合并问题。有很多方法,来一种最为普通的做法,直接用大数组解决:#include #include #include #include using namespace std;原创 2015-05-07 00:36:26 · 967 阅读 · 0 评论 -
插入排序增强版
我们指定,排序算法按照其稳定性来说,分为非稳定性排序与稳定性排序算法。判断稳定性与非稳定性算法的依据一般在是否为相邻元素之间的数据交换,不然一般为非稳定排序。比如快速排序,Shell排序等都不是稳定排序,而像冒泡排序,插入排序,合并排序等都是稳定排序。C语言库函数中的qsort函数是基于快速排序的,因此排序之后,未参加排序的数据之间的顺序可能被打乱。又是我们又需要在某一类场景下利用到稳定排序算法。原创 2015-05-31 09:17:57 · 562 阅读 · 0 评论 -
分治法在算法设计中的运用
在算法设计中,常见的设计思想有分治法,分支定界,回溯,动态规划等等。其中分治法是算法设计中最为重要的思想之一。分治法思想的本质就是分而治之,将解决一个问题的解空间一分为二,每个子问题的解空间步骤与原问题解法上类似,分治法很多时候用递归这种方式来实现。算法设计相关教材一般将归并排序作为分治法的典型应用,归并排序思想是将一个待排序的序列一分为二,递归地对每个子序列排序,这样一直分解下去,直到不能分解为原创 2015-07-09 22:13:28 · 1986 阅读 · 0 评论 -
AVL树原理思想及其实现
AVL树,一种平衡搜索二叉树,是BST(Binary Search Tree)二叉查找树的一种,实际上是在BST搜索树上增加了平衡条件,所谓的平衡条件指的是树中的每个结点的左孩子与右孩子的高度之差不大于1。既然是一种BST树,那么它肯定满足BST的一般性质。在计算机科学领域,二叉搜索树(BST),有时也称作有序的或者排序好的二叉树,是一种特殊类型的容器。它允许快速的查找,增加,删除结点,可以被用作原创 2015-07-05 17:15:50 · 752 阅读 · 1 评论 -
堆排序算法原理及实现
堆排序是排序中一种比较重要的算法,和快速排序一样,其复杂度也是O(nlogn);同时也是一种原地排序算法:在任何时候,数组中只有常数个元素存储在输入数组以外。堆这种数据结构是处理海量数据比较常见的结构,海量数据的TOP K问题一般可以通过分治法+hash+堆这种数据结构解决。值得注意的是,这里将的“堆”准确的说是二叉堆,逻辑上是一棵类似完全二叉树的数据结构。原创 2015-06-09 22:20:28 · 8007 阅读 · 0 评论 -
链表操作常见技巧浅析
链表操作是程序设计中最常见的一类操作。在我们项目或面试中经常会用到,我们可以大致总结下链表操作的常见技巧。其实也没有什么难点,主要是操作列表时,注意异常边界值的考虑。一般在修改链表时,会用到辅助链表指针,其目的在我看来主要有2个作用:一是将当前结点保存起来,好让此时结点的指针指向下一结点(这里可以类似看做一个游标,向前或向后的结点移动。二是利用辅助链表指针的位置来实现特定的目的)。我们主要看到这里原创 2014-12-29 22:47:25 · 963 阅读 · 0 评论 -
字符串中删除特定的字符
1. 在字符串中删除特定的字符(字符串)。输入两个字符串,从第一字符串中删除第二个字符串中所有字符例如,输入"They are students." 和 "aeiou"。则删除之后的第一个字符串变成 "Thy r stdnts."#include #include #include //trimString函数//inputString:输入字符串//pattern:待删原创 2015-05-13 22:28:57 · 1872 阅读 · 0 评论 -
单链表归并排序
数组排序常见的有十几种排序算法,然而对于单链表来说,链表缺乏随机访问特点,导致一些排序算法在时间和空间复杂度上都比较负责,一般的冒泡排序与插入排序,其时间复杂度都是O(N^2)。链表中最优的排序算法应该为归并排序,归并排序是分治法的典型应用,主要思想是将一个大问题划分为N(一般取2)个等价的子问题,通过对子问题的解答来达到对原有问题的解决。下面对链表的归并排序用代码实现。归并排序思想可以参考数组归原创 2015-05-04 21:56:40 · 4786 阅读 · 0 评论 -
Redis双向链表浅析
Redis源码Adlist中实现了一个双向链表,该链表在设计数据结构及其操作上有许多不同的技巧!原创 2015-04-16 22:48:01 · 747 阅读 · 0 评论 -
线性表之链式表示
线性表链式表示方法线性表的链式存储特点是用一组任意的存储单元存储线性表的数据元素(这组存取单元很可能在物理上不是连续的)。因此为了表示每个数据元素,出了存储其本身的信息之外,还的存储一个指示其后继的信息。这两部分信息组成数据元素的存储映像,称为结点。包括了一个数据域和一个指针域(为什么可以包括自己类型的指针呢?因为指针在32位CPU上表示4字节大小,大小固定)。其原理及其实现都是比原创 2014-12-23 22:43:38 · 574 阅读 · 0 评论 -
几个经典算法研究
最近研究几个经典算法,比如二分查找,大数相加等。加强一下编码思路训练。原创 2015-01-05 22:38:53 · 690 阅读 · 1 评论 -
表驱动法在项目中的应用
在编码过程中,有一类场景往往是根据不同的输入或者条件,调用不同的函数。比如在通信设计领域,往往会有不同的消息到达,而不同的消息需要对应不同的处理函数。这样一来,如果我们采用常见的if....else或者switch......case等条件结构,分支会非常多,而且逻辑结果很混乱。那么此时把条件和对应的操作函数放入到一张表中,则可以简化代码,也便于后期维护拓展。当然最好的还是用状态机实现的,这个后面原创 2015-04-08 21:28:52 · 963 阅读 · 0 评论 -
二维指针的使用场景
实际上,指针作为参数,其目的有许多,一般来说,一维指针主要传给函数入参地址,或者通过其改变地址对应的值。而二维指针也比较类似,如果需要修改指针的值,则可以将函数出参修改为二维指针。若需要修改入参地址,如果实参是一级指针,则函数出参是二级指针,如果实参是二级指针,则函数出参是三级指针。原创 2015-04-02 00:46:33 · 3018 阅读 · 0 评论 -
BST算法原理及其实现
首先,我们先了解下递归。说到递归,数据结构中树介绍章节中有大量的实例用了,包括二叉树定义与遍历等。当然一般公司项目中很少用它,主要是效率低下,同时递归涉及到函数反复建栈,压栈,销毁栈的过程,开销较大。这里仅仅作为一种技术探讨来研究。递归,简单地说就是函数自己调用自己,网上也有不少解释了。这里我的看法是将整个递归过程看做一种函数映射关系,即 F(A) --> B,如果B与A具有相同的属性和操作,同时原创 2016-04-28 00:35:46 · 2810 阅读 · 0 评论