C
宁静的银杏树
这个作者很懒,什么都没留下…
展开
-
指针函数与函数指针的区别
一、 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变转载 2014-02-17 21:30:30 · 377 阅读 · 0 评论 -
找出有环链表中环的起始节点
给定一个有环的链表,写一个算法,找出环的起点。 例如: 输入:A->B->C->D->E->C[与前面的C是同一个节点] 输出:C 判断一个链表是否存在环有一个简单的方法,就是使用一个快指针、和一个慢指针,快指针每次走两步,慢指针每次走一步,则如果有环,它们最后必然会相遇的。本题的难点在于要找出环的起点。其实也不难,与判断是否有环类似,用两个步长分别为1和2的指针遍历链表,直到两者原创 2014-04-17 14:27:55 · 1820 阅读 · 0 评论 -
B-树和B+树的应用:数据搜索和数据库索引
B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用。 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树; ⑵若根结点不是叶子结点,则至少有两棵子树; ⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树; ⑷所有的非终端结点中包含以下信息数据: (n,A0,K1,A1,K2,…,Kn,An)转载 2014-04-27 14:48:51 · 455 阅读 · 0 评论 -
typedef和define具体的详细区别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如: #define PI 3.1415926 程序中的:area=PI*r*r 会替换为3.1415926*r*r 如果你把#define语句中的数字9 写成字母g 预处理也照样带入。 2)typedef是在编译时转载 2014-05-18 20:10:34 · 558 阅读 · 0 评论 -
leetcode:Reorder List
题目思路比较直接: 1)把整个链表划分成2个等长的子链表,如果原链表长度为奇数,那么第一个子链表的长度多1。 2)翻转第二个子链表; 3)将两个子链表合并。 代码里有些变量可以省去,为了看起来逻辑清晰,还是保留了。整个链表遍历了3次,但是没有使用额外空间。原创 2014-04-22 14:16:03 · 477 阅读 · 0 评论 -
leetcode:Copy List with Random Pointer
比起标准的链表深拷贝,还需要了解一个random pointer的信息。需要建立起新的链表单元和旧的链表单元之间的一一对应关系,然后将所有旧的random pointer更换为新的random pointer。这样就要求两次扫描,O(2n)。原创 2014-04-27 17:35:23 · 446 阅读 · 0 评论 -
二叉树的非递归遍历
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序转载 2014-04-17 22:27:30 · 489 阅读 · 0 评论 -
leetcode:Binary Tree Postorder Traversal
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Soluti原创 2014-04-17 22:23:06 · 510 阅读 · 0 评论 -
void及void指针含义的深刻解析
void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。 void指针使用规范 ①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如: int * pint; void *pvoid; pvoid = pint; /* 不过不能 pint= pvoid; */ 如果要将pvoid赋给其他类型指针,则需转载 2014-04-17 11:09:08 · 420 阅读 · 0 评论 -
void*指针
指针有两个属性:指向变量/对象的地址和长度 但是指针只存储地址,长度则取决于指针的类型 编译器根据指针的类型从指针指向的地址向后寻址 指针类型不同则寻址范围也不同,比如: int*从指定地址向后寻找4字节作为变量的存储单元 double*从指定地址向后寻找8字节作为变量的存储单元 void指针则不知道他所指向的变量的大小,,他只知道他所指的空间的起始地址, 因此不能引用所指向的内转载 2014-04-17 11:11:33 · 964 阅读 · 0 评论 -
leetcode:Remove Nth Node From End of List
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *re原创 2014-04-30 15:10:05 · 525 阅读 · 0 评论 -
C语言函数指针参数也是传值调用
先看看下面一段代码: #include #include void F(int *pi) { pi = (int *)malloc(sizeof(int)); } main() { int *pi = NULL; F(pi); printf("%d/n", pi == NULL); } 如果你指望函数F能帮你改变pi的值,那你就错了,运转载 2014-03-10 17:00:06 · 746 阅读 · 0 评论 -
#pragma pack(push,1) & #pragma pack(pop)
1 引子 在程序中,有的时候我们定义结构体的时候,要用#pragma pack(push,1) & #pragma pack(pop)类似代码将结构体包起来。 一般形式如下: #pragma pack(push,1); struct A { } ; #pragma pack(pop); 这么做有什么目的呢? 注:下列内容来自网络。 2 #pragma pa转载 2015-04-29 11:08:00 · 482 阅读 · 0 评论