C/C++
文章平均质量分 68
zhumawinnner
这个作者很懒,什么都没留下…
展开
-
求两个链表的相交节点(算法)
遍历第一个链表 求长度M 遍历第二个链表 求长度N 选择M和N中较大的那个 将较长的链表遍历至第M-N个节点 然后在两个链表中同步遍历,比较next指针是否相等且不为NULL。 如果相等,则next指针所指的元素即为交点。 如果为NULL,说明两个链表都到了末端还没有相交。代码: Node* find(Node* head1,Node原创 2014-10-30 17:17:27 · 536 阅读 · 0 评论 -
POINTERS ON C
1.在声明一个指针时,一定要把*靠近变量,而不要靠近类型,如int *a;2. 一个变量的作为右值来用时就是分配给这个变量的内存位置所存储的数值。而作为左值(如果可以的话),就是内存位置。 解释:如int a; a本身是一个地址(也可以说是给a分配的内存位置),但是a的值不是一个地址,而是这个地址的内容(a表示的内存位置所存储的数值) *&a=25,&操作符产生变量a的地址,原创 2014-12-02 20:08:35 · 651 阅读 · 0 评论 -
多项式相乘(链表实现)
直接上代码,一个晚上的成果/******************************************************************多项式乘法链表实现*******************************************************************************/#define LIST_OK 1#defi原创 2014-12-23 21:13:20 · 1895 阅读 · 2 评论 -
二重指针的2个例子
1.b那块内存,已经不被任何变量占用,属于不被管理的内存。b被回收,那块内存的内容并不会立刻被改写。q is dirty after function'fun'!在执行完fun函数之后,q就变成了一个危险的指针。(p是二重指针,相当于&q,那么*p就相当于q了,是一个地址!) 2.(一道面试题,原博客地址http://blog.csdn.net/sdfgh2046/articl原创 2014-10-30 17:16:56 · 1116 阅读 · 0 评论 -
strcpy/strlen&&assert
断言assert是一个宏,该宏在<assert>中,,当使用assert时候,给他个参数,即一个判读为真的表达式。预处理器产生测试该断言的代码,如果断言不为真,则发出一个错误信息告诉断言是什么以及它失败一会,程序会终止。 我们一般可以用在判断某件操作是否成功上。摘录林锐博士高质量编程一书中相关内容。~~~~~~~~~~~~~~~~~~~~~~~~程序一般分为Debug版本和Release转载 2014-10-30 17:17:18 · 487 阅读 · 0 评论 -
shell排序和快速排序
直接上代码void shellsort1(int a[], int n){ int i, j, gap; for (gap = n / 2; gap > 0; gap /= 2) //步长,,,,分组的次数 for (i = 0; i < gap; i++) //每次分组的组数(要执行直接插入排序的次数等于分组的组数)==gap个(可以转载 2014-12-11 21:36:52 · 716 阅读 · 0 评论 -
函数的递归和getchar()的用法
1.例子#include#includeint main(void){ char c; char a; a=getchar(); printf("%c",a); while((c=getchar())!='\n')//c接收的值是输入第一个字符后按下的回车换行符'\n',c是不会显示的 { printf("%c",c); } g原创 2014-10-30 17:17:07 · 719 阅读 · 0 评论 -
指针强制转化(很有用的小技巧)
假定CPU是小端格式,求下面代码的输出结果.int main(int argc, char*argv[]) { int i; char Data[100]; short Out; for(i=0;i<100;i++) { Data[i]=i; } Out=*(short*)((int *)Data+1);原创 2014-10-30 17:17:15 · 1070 阅读 · 0 评论 -
高效率的取幂运算
用递归去求解,跟矩阵的幂运算是一回事。long ing Pow( long int x , unsigned int N ) { if(N==0){ return 1; //递归出口 } if(IsEven(N)){ //判断N是不是偶数 return Pow(x*x,N/2); } else{ return Pow(x,N-1)*x;//如果是奇原创 2015-03-27 11:54:03 · 945 阅读 · 0 评论 -
回溯法的分析及N皇后问题
1.递归法原创 2015-03-27 23:31:32 · 674 阅读 · 0 评论 -
数字转美分美元C实现
题目:pointer on c P190 T15/****把数字串(实质是字符串)'src'转换为美元和美分的格式*********并存储于'dst'****************************************/#includevoid dollars(register char *dst, register char const *src){原创 2014-12-13 18:44:38 · 1190 阅读 · 0 评论 -
结构体中数据的内存对齐
先看下面的例子:struct A{ char c1; int i; short s; int j;}a;struct B{ int i; intj; short s; char c1;}b;结构A没有遵守字节对齐原则(为了区分,我将它叫做对齐声明原则),结构B遵守了。我们来看转载 2014-10-30 17:16:42 · 458 阅读 · 0 评论 -
几道位操作的题目思路与实现
1.这个问题,有如下两种思路:1)将原创 2014-11-25 14:20:43 · 689 阅读 · 0 评论 -
希尔排序
增量版插入排序一张图看懂希尔算法:代码如下:void shellsort(int a[],int n){ int gap=n; while(gap!=0) { gap/=2; for(inti=0;i for(int j=i+gap;j if(a[j]原创 2014-10-30 17:17:46 · 353 阅读 · 0 评论 -
函数调用的相关注意点(栈)
通常使用内存是从低向高地址用,但栈是预留的空间,栈底在高地址,push时,数据是向低地址存放。局部变量寻址,要用到栈的访问。 调用函数时,计算机常用栈来存储传递给函数的参数。栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶)。用户可以在栈顶上方向栈中加入数据,这个操作被称为压栈(Push),压栈以后,栈顶自动变成新加入数据项的位置原创 2014-10-30 17:16:45 · 789 阅读 · 0 评论 -
统计二进制中1的个数
本来不想在新浪再写了的,无奈CSDN正在搬家审核,而我又急于表达想法和成果,在这里不得不再次动笔——位运算太神奇了!还是必须要说,无数学,不能学啊! 题目:统计一个无符号数中的二进制表示中1的个数。此算法名为平行计算法。基本思想如下:先两两(两个二进制位)分组统计每组出现的1的个数,而每组1的个数只可能是0个(00),1个(01)或2个(10),由(相加所得的)两位的二进制完全可以表示每原创 2014-10-30 17:17:40 · 781 阅读 · 0 评论 -
char str[] 和 cha *str 的区别
1.char* get_str(void){ char str[] = {"abcd"}; returnstr; //}char str[] ={"abcd"};定义了一个局部字符数组(放在堆栈中,函数调用完即销毁此段内存),尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址。此函数返回的转载 2014-10-30 17:16:53 · 599 阅读 · 0 评论 -
C的几个简答题
1.C++中有了malloc/free,为什么还需要new/delete?答:主要是除了控制内存还能执行其他编译器相关操作。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求——即对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析转载 2014-10-30 17:17:29 · 1059 阅读 · 0 评论 -
memset函数详解
memest原型 (please type "man memset" in your shell) void *memset(void *s, int c, size_t n); memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。常见的三种错误第一: 搞反了c 和 n的位置. 一定要记住 如果要把一个char a[20]清转载 2014-10-30 17:16:59 · 391 阅读 · 0 评论 -
函数调用的值传递和引用传递
函数调用的作用: ·用实参数向形式参数传递数据; ·为获得数据参数及在函数体中声明的变量分配存储空间; ·中断现行(调用)函数,把流程向被调用函数的入口处,开始执行被调函数。当参数表为空时,表示该函数不从调用函数接受数据。 函数参数传递机制:堆栈存储区是主调函数(过程)和被调用函数(过程)在调用发生时进行通信的主要区域。基本的参数传递机制有两种:值传递和引用传递。 值传递(pa转载 2014-10-30 17:16:48 · 950 阅读 · 0 评论 -
C语言学习笔记(持续更新)
1.定义与声明的区别(1)是否需要分配存储空间。(2)在一个作用域中可以重复声明,但不能重复定义。这是由(1)决定的,可以重复几次告诉编译器某个变量、函数已经在别处定义了,但不能重复多次地让编译器为同一个变量、函数分配不同的存储空间。extern inta; //声明一个全局变量ainta; //定义一个全局变量ae原创 2014-10-30 17:16:51 · 534 阅读 · 0 评论 -
冒泡法和选择法排序的比较
1.冒泡法:每一次排序过程,通过相邻元素的两两交换,将当前没有排好序中的最大数移到数组的最右端。代码如下:void bubble(int a[ ],int n){ int i,j,t; for(i=0;i<9;i++) //这里的i仅用作大循环的次数,大循环9次,因为最后一个数自动冒顶 for(j=0;j<9-i;原创 2014-10-30 17:17:04 · 1297 阅读 · 0 评论