
C语言
夏夕阳
这个作者很懒,什么都没留下…
展开
-
求一个数字二进制中1的个数
1.一个很简单的思路,把每一位与1相与如果结果是1,就代表这一位是1,相反是0 int BinaryNumOne1(int num) { int count = 0; while (num) { if (num & 1) { count++; } num = num >> 1; } return count; }原创 2017-03-21 21:09:25 · 387 阅读 · 0 评论 -
二叉树后序遍历
递归版本: void _PostOrderR(Node* pRoot) { //递归出口 if (NULL == pRoot) return; //遍历左子树 _PostOrderR(pRoot->LC); //遍历右子树 _PostOrderR(pRoot->RC); cout data << " "; } 非递归版本: void _PostOrd原创 2017-05-06 00:37:33 · 394 阅读 · 0 评论 -
求两个单链表的交点(可能带环)
先简单分析: 两个单链表相交分如图几种情况: 实现如下:原创 2017-03-15 21:38:01 · 725 阅读 · 0 评论 -
C语言编译连接过程和宏
C语言代码到二进制代码中间的四个转换: 1.预处理(宏替换、取注释、头文件展开、条件编译) 对应的linux指令(gcc -E test.c -o test.i)//E预处理指令,在预处理之后停止,生成test.i文件 2.编译 (C语言代码 转换为 汇编代码) (gcc -S test.i -o test.s)//S编译指令,在编译之后停止,生成test.s文件原创 2016-11-02 20:41:15 · 821 阅读 · 0 评论 -
浮点数在内存中的存储方式
浮点数类型包括float、double、long double 在这里以float为例。 先看一段代码: #include #include int main() { int a = 9; float *pa = (float *)&a; printf("a = %d\n", a); printf("*pa = %f\n", *pa); *pa = 9.0; printf("a原创 2016-11-05 17:53:49 · 10327 阅读 · 3 评论 -
一组数字中,有两个数字出现一次,剩下数字出现两次,求这两个数
两个数不相同,则说明这两个数字的异或结果肯定不为0 把两个数异或结果从低位到高位第一次不同的位置1,其他位置0,就有一个000...01000...的结果 如果数组中有数字 & 这个数为0,则说明这个数有可能为单独出现的数字中的一个 相反如果不为0,则说明有可能是另一个单独出现的数字 然后把两组分出来的结果分别异或就得到了俩个不同的数字。 #include #include void F原创 2016-11-14 14:45:23 · 750 阅读 · 0 评论 -
函数调用原理——栈帧
函数调用原理————栈帧 1.栈 栈是向下生长的,也就是由内存高地址-》低地址的。栈有自己的栈顶指针和栈底指针。 ebp : 称为“基址指针”,在未改变之前一直指向栈底 esp : 称为“栈指针” , 随着数据的入栈和出栈移动,也就是说一直指向的是栈顶 2.了解一些简单的汇编指令 call(函数调用) : 先将当前指令的下一条指令地址压栈,然后跳转到被调用的函数处。 ret原创 2016-11-18 16:55:57 · 658 阅读 · 0 评论 -
可变参数列表
有一些函数希望能在不同的情况下接受一些数量不同的变量,比如说printf。 为了解决这样的问题,C语言引入了可变参数列表的概念! 可变参数的实现: 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h头文件中。在这个头文件中,声明了一个类型va_list,和三个宏,va_start、va_arg、va_end。 ①首先在函数里定义一具va_list型的变量,这个变量是指向原创 2016-11-26 21:58:44 · 370 阅读 · 0 评论 -
链表实现
////////////////////////////////////////////////// //初始化 #include #include #include void InitList(PNode *pHead) { *pHead = NULL; } //创建新节点 PNode BuyNode(DataType data) { PNode pCur = (PNo原创 2017-03-12 21:54:17 · 301 阅读 · 0 评论 -
求带环单链表的入口点
我们可以设置两个指针,pFast和pSlow开始时都指向头结点,然后pFast一次向后移动两个节点,pSlow一次向后移动一个节点直到他们相遇 这样我们就得到了一个相遇点,如上图所示: 我们可以得到这样一个结论: 2(L+x) = L + nR + x L + x = nR 取极值n=1可得: L = R - x; 也就是说从相遇点到交点的距离和头结点到交点的距离相等 然后把原创 2017-03-15 16:14:03 · 507 阅读 · 0 评论 -
用冒泡排序模拟实现qsort
在学习使用过qsort之后,一直在想是否能用其他的排序算法去模拟实现它的功能,把自己的实现写出来,也是对自己的一种总结吧。 因为模拟是实现qsort,实现原理与qsort基本相同所以,给出和它一样的参数列表。 void BubbleSortNoType(void *arr, int dataNum, int typeSize, Fun fun)//数组地址,元素个数,元素类型大小,比较原创 2017-03-22 22:05:18 · 505 阅读 · 0 评论 -
字符串替换空格: 请实现一个函数,把字符数组中的每个空格替换成“%20”。 例如输入“we are happy.”,则输出“we are happy.”
#include #include #include #pragma warning(disable:4996) void str_switch(char *start, char *end) { assert(start); assert(end); while (start < end) { *start ^= *end;原创 2016-11-06 14:23:21 · 1247 阅读 · 0 评论