- 博客(70)
- 资源 (22)
- 收藏
- 关注
原创 红黑树删除本质 与 伪代码分析
性质1. 节点是红色或黑色。性质2. 根是黑色。性质3. 所有叶子都是黑色(叶子是NIL节点)。性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)性质5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点红黑树的删除操作是在二叉树删除操作后(加入Nil[T]节点,并修改NULL判断逻辑),加入调整函数,使得
2014-03-28 15:44:47 2489
原创 红黑树的插入操作--伪代码详细分析
学习的时候,最好把性质copy到记事本中,当别人提到性质1,2,3,4,不用翻来翻去。下面的是我学习《算法导论》的笔记。性质1. 节点是红色或黑色。性质2. 根是黑色。性质3. 所有叶子都是黑色(叶子是NIL节点)。性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)性质5. 从任一节点到其每个叶子的所有简单路径都包含相同数
2014-03-28 12:23:50 2944
转载 Makefile自动化变量与模式规则
转自http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:%E9%9A%90%E5%90%AB%E8%A7%84%E5%88%993、自动化变量在上述的模式规则中,目标和依赖文件都是一系例的文件,那么我们如何书写一个命令来完成从不同的依赖文件生成相应的目标?因为在每一次的对模式规则
2014-03-26 15:43:34 2302
原创 Makefile编写实例——(.text+0x15): undefined reference to `init_queue'
/tmp/ccNOjiLG.o: In function `main':test_for_print_tree.c:(.text+0x15): undefined reference to `init_queue'test_for_print_tree.c:(.text+0x25): undefined reference to `ifEmpty'test_for_print_tree
2014-03-26 13:38:12 2921
原创 expected specifier-qualifier-list before ‘QNode’——宏定义ifndef避免重复include头文件.h
编译时候遇到这两个错误 error: storage class specified for parameter ‘TNode’ error:expected specifier-qualifier-list before ‘QNode’原因是我很多个文件都#include tree.h,因为#是编译前原地展开的,多个#include tree.h就会冲突,解决办法是给tree.h
2014-03-26 11:59:06 1530
转载 vim分屏总结
转自http://www.cnblogs.com/floatedclouds/archive/2011/11/10/2245008.htmlvim的分屏功能总结起来,基本都是ctrl+w然后加上某一个按键字母,触发一个功能。(1)在shell里打开几个文件并且分屏: vim -On file1 file2 ... vim -on file1 file2 ...大O
2014-03-26 09:58:38 991
原创 C语言打印二叉树
基于上一篇,加入了树枝,看起来更直观,不过加这个树枝,算那个横线和空格花了我不少时间,不过最后能写出来,挺爽。上一篇http://blog.csdn.net/xzongyuan/article/details/21945749 C语言打印二叉树在广度遍历的时候,有非常繁杂的计算符号的方法,要看懂可能得花时间。(1)整个设计的难点在sprintf函数运用。sprint
2014-03-25 16:42:51 7969 3
原创 段错误解决办法
血的教训昨天调试遇到两个段错误0x00007ffff7ade419 in memcpy () from /lib/libc.so.60x00007ffff7acd3c9 in _IO_default_xsputn () from /lib/libc.so.6过去一直对指针初始化没什么概念,经过昨天血淋淋的教训(调试时候,产生各种奇怪的预想不到的错误),终于知道,如果要对字符
2014-03-25 11:19:02 2754
原创 0x00007ffff7ade419 in memcpy () from /lib/libc.so.6
先看gdb跟踪过程Hardware watchpoint 3: pad_frontOld value = 4New value = 15breath_travel (pRoot=0x603030, pQueue=0x603010) at print_tree_final.c:206206 if((qNode->blank == 1))(gdb) n
2014-03-25 10:19:17 6118
转载 Linux调试工具strace和gdb常用命令小结
转自http://www.cnblogs.com/panfeng412/archive/2011/10/24/2222413.htmlstrace和gdb是Linux环境下的两个常用调试工具,这里是个人在使用过程中对这两个工具常用参数的总结,留作日后查看使用。strace调试工具strace工具用于跟踪进程执行时的系统调用和所接收的信号,包括参数、返回值、执行时间。在Linux
2014-03-25 10:08:27 875
转载 段错误调试经验
http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.htmlLinux环境下段错误的产生原因及调试方法小结最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fault)
2014-03-25 10:05:41 1032
原创 0x00007ffff7acd3c9 in _IO_default_xsputn () from /lib/libc.so.6
在打印的时候,遇到Segmentation fault. 经过跟踪,发现是字符指针访问越界了。如下面的实例,本来old_buf只是一个换行符"\n",包括结束符,应该是2个字符,但是gdb跟踪发现sizeof返回的是8.我之所以转化为int,是因为直接用sizeof会报这个错误:print_tree_final.c: In function ‘breath_travel’:print_tr
2014-03-24 17:10:05 3847
原创 C语言打印树基础
相信二叉树是学算法很重要的一门课,但是网上的实现都不好找,于是自己写来玩玩,造福后人。基于前一篇http://blog.csdn.net/xzongyuan/article/details/21880013(实现广度遍历)实现了二叉树的打印,要点:1.要使得二叉树节点排列对齐,首先以个位数作为模型,计算出每个字符之间的间距是多少// ***************0****
2014-03-24 13:53:09 5581 1
原创 C语言队列实现广度优先遍历
上一篇只是定义了数据结构。基于上一篇http://blog.csdn.net/xzongyuan/article/details/21832237增加了队列操作。打印出来的结果是这样的,没有分层打印,分层打印要计算几个参数,比较麻烦,所以我打算以一个正确的广度遍历为基础,对原先的数据结构和算法进行修改。代码比较繁杂,后续打算整理出头文件和多个c文件,脉络会更清晰,水平有限,仅供参考。
2014-03-23 18:15:25 4064 1
原创 C语言二叉树与队列实现基础代码
http://blog.csdn.net/xzongyuan/article/details/21830097c语言队列基本操作代码基于是上一篇做了修改,主要修改结构提,因为准备加入树的操作,代码会越来越繁杂,为了还原整个改写过程,分步显示,#include#includetypedef struct _node{ int value; struct
2014-03-22 22:58:37 1295 1
原创 c语言队列基本操作代码
为了打印binary tree,要使用队列,所以先写个程序测试下#include#includetypedef struct _node{ int value; struct _node *next;}Node;typedef struct _Queue{ Node *head; Node *tail;}Queue;Queue* init_qu
2014-03-22 22:15:26 7093
转载 sprintf用法——把结果打印到打印字符串而不是终端
sprintf用法简介选自《CSDN 社区电子杂志——C/C++杂志》在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。sprintf 是个变参函数,定义如下:
2014-03-21 15:59:47 3957 1
转载 广度优先遍历代码
广度优先周游二叉树(层序遍历)是用队列来实现的,从二叉树的第一层(根结点)开始,自上至下逐层遍历;在同一层中,按照从左到右的顺序对结点逐一访问。按照从根结点至叶结点、从左子树至右子树的次序访问二叉树的结点。算法: 1初始化一个队列,并把根结点入列; 2根节点入队 3循环直到队列空 3.1 q=队列头元素出队 3.2 访问q的数据域
2014-03-21 15:41:30 885
转载 C语言堆栈入门——堆和栈的区别
转自http://www.cnblogs.com/TonyEwsn/archive/2010/01/29/1659496.html原文:http://student.csdn.net/link.php?url=http://www.top-e.org%2Fjiaoshi%2Fhtml%2F427.html格式和部分内容稍作修改。在计算机领域,堆栈是一个不容忽视的概念,我
2014-03-21 15:39:05 617
转载 c语言自定义堆栈
c语言没有堆栈,要自定义。转百度知道的,稍后要研究struct Stack{ int mData[100]; int mLen;};//初始化栈void InitStack(Stack &S){ S.mLen = 0;}//元素进栈void Push(Stack &S,int item){ S.mData[S.mLen++] = item;}//删除栈顶元素int
2014-03-21 15:08:28 1298
转载 sys-queue.h源码——参考实现stack
/** $NetBSD: queue.h,v 1.45.14.1 2007/07/18 20:13:24 liamjfoy Exp $ */002 003 /**004 * Qemu version: Copy from netbsd, removed debug code, removed some of005 * the implementations. Left i
2014-03-21 14:48:22 1203
原创 运行时输入的char转int
写了一个.o程序,想运行时输入一个数字,表示数量大小,但是输入的是char串的指针,要转化为int。方法是使用atoi函数,main获取到的就是输入参数是char字符串指针。所以所以直接把argv的数组元素给atoi就行了。不用进行类型转换。int main(int argc , char **argv){int quantity; if(argc == 1){
2014-03-20 17:11:45 709
原创 C语言打印字符串实例
#include#includevoid main(){ char a[5]="____\0"; printf("%s %s\n",a,a); printf(" \n"); printf(" %s\n",a);}注意加了结束符\0,如果不加这个会乱码,还要注意字符是5,包括结束符。
2014-03-20 12:15:17 1522
转载 Vim实现批量注释的方法
调试代码的时候,免不了要批量注释/取消代码注释,很多IDE都有快捷键将你选中的代码块批量注释/取消注释的功能,那么在Vim里面如何完成这个功能呢?方法一 块选择模式 批量注释:Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的I进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,Vim会自动将你选中的所有行首都加上注释取消注释:Ctrl + v
2014-03-20 09:53:36 783
原创 C语言register关键字—最快的关键字
register作用是把变量存入寄存器,这是C语言早期声明符号,现在的C语言已经能比人更好地判断什么时候存入寄存器,所以一般会把你代码里的register去掉,不过你写上也不会报错。该声明符号是在红黑树的插入代码中看到的,因为红黑树在插入数据时候,会有大量的数据搬移工作,同一个变量会被多次访问,所以需要把变量存入寄存器以提高效率。参考:http://blog.sina.com.cn
2014-03-18 13:34:30 750
原创 二叉树统计节点
上篇讲了遍历:http://blog.csdn.net/xzongyuan/article/details/21391775遍历主要利用了递归函数的思想,因此,写统计节点信息的函数时,也要用递归函数的办法去写。如统计叶子节点数:int leaf_num(tree_node *node,int *count){ if(!node) { return 1; //have one
2014-03-17 17:30:59 717
原创 遍历二叉树——非线性数据 到 线性数据
遍历二叉树,有6种可能,主要是根、左子树、右子树的先后排序。其中三种是先右后左,不符合人类习惯,排除这种方式,只采取从左到右的排序。因此,剩下的三种排序方式是常见的:1.先序遍历——“先”访问根节点,然后到左子树,最后右子树。2.中序遍历——先遍历左子树,“中”访问根,后遍历右子树。3.后序遍历——先遍历左,再遍历右,“后”访问根节点。可见,先、中、后描述的是根节点被访问的位置,而
2014-03-17 15:48:05 1253
原创 构建二叉树实例
注意结构体中的_tree_node成员,如果写成tree_node会报错:binary_tree.c: In function ‘construct’:binary_tree.c:39: warning: passing argument 1 of ‘tree_init’ from incompatible pointer typebinary_tree.c:13: note: expec
2014-03-17 15:12:18 2086
原创 链表常见操作-嵌入式C语言
嵌入式笔记1.单链表组织与存储typedef struct _link_node{ elem_type data; struct _link_node *next;} link_node , *link_list;2单链表常见操作(1)初始化int init_link(link_list *list) //注意,这里是指针的指针,相当于**l
2014-03-17 12:10:29 1436
转载 C语言单链表常见操作
转自 http://www.2cto.com/kf/201403/282824.html#include#include //定义单链表结构体typedef int ElemType;typedef struct Node{ElemType data;struct Node *next;}LNode,*LinkList; //创建单链表void Build(
2014-03-17 10:55:43 1098
原创 程序的可移植性——字长/不透明数据/数据对齐/大小端
字长能被系统一次处理完的数据就是字,而字长根据不同系统而不同,32位系统字长就是32bit,4个字节。不透明数据为了方便移植,需要屏蔽底层数据字长对系统上层的设计的影响,因此用typedef对不同数据进行重命名。被typedef重命名的数据就是不透明数据。例如进程标识符pid_t,实际上是int型。定义在include/linux/types.h/* bsd *
2014-03-14 17:21:19 1259
转载 堆和栈区别
一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(stati
2014-03-14 15:46:17 545
转载 预定义符号
C语言编译器的预定义符号 __LINE__ 当前(源代码文件)行号 [整数] __FILE__ 当前正在编译的文件的文件名 [字符串] __FUNCTION__ 当前所在函数 __DATE__ 当前日期,以“月月 日日 年年年年”的形式给出 [字符串] __TIME__ 当前时间,以“HH:mm:ss”的格式
2014-03-14 15:33:08 1014
原创 从main函数学指针数组和指针的指针
指针数组格式定义如下int *p[10];再看看main函数写法,argv定义为指针数组int main(int argc,char *argv[]){}因为char是字符的基本单位,而main函数输入的函数都是字符串,因此要用字符指针去指向字符串;又因为输入的参数不指一个,所以要用数组存储。两个因素结合起来,就该使用指针数组。假设输入如下命
2014-03-14 13:18:23 666
原创 数组与指针关系
在编译器中,数组a[i]是按照*(a+i)来处理的。其中i根据数据类型大小取不同字节,例如int类型,一个i偏移4个字节,short类型,一个i偏移2个字节。所以a+i不是简单的+i个字节,而是+sizeof(type)个字节。
2014-03-14 12:20:29 584
原创 malloc简单实例
什么时候用到malloc?先看例子1:int a , *p = &a;定义a变量时,系统已经调用malloc分配4个字节内存给a。这时,&a可能会得到一个固定地址0x00020010(所有地址都是32位,即8个字节的,一个字节=2个16进制位数)例子2:int a, *p;a = 2;if(p = (int *)malloc(
2014-03-14 12:11:34 4175 1
原创 struct 结构体定义方式汇总
结构体变量定义方法多样,统计一下直接定义"结构体变量"——如果结构体只在局部使用(函数或.c文件),则可直接定义变量struct person{char name[8];int age;} p1;先定义"结构体类型",再利用"结构体类型"名定义"变量"——主要是为了重用该数据类型,有时候还用typedef重命名一个结构体。目的:如果某个结构体变量很常用,多个文件共用,就该先定义
2014-03-14 11:43:02 1702
原创 全局和局部静态变量(static)解析
static声明主要特性是两点:生命周期和作用域。我们决定使用静态局部变量还是静态全局变量所考虑的就是该变量是否需要一直存在,或者该变量是否应该被限制在某个作用域,例如某个函数或者某个源文件内。生命周期如上图,静态变量是在编译完,程序还没运行就已经分配存储空间的。而自动变量(非静态的普通变量)是运行时分配的,程序还没跑就没有对应的地址空间。生命周期与作用域
2014-03-14 10:31:56 1067
原创 定义与声明的区别
定义:内存会开辟存储区域,同一个变量只能定义一次,否则系统会发现重名。声明:使用已经开辟的内存区域,可以被声明多次,意思是已经被定义的区域可以被多次赋值。
2014-03-14 10:08:11 674
C语言打印二叉树 重构版
2014-03-26
TinyHttpd源码
2013-09-01
GNU C Library Manual
2013-08-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人