- 博客(29)
- 收藏
- 关注
原创 链表创建为什么需要使用内存分配?
我们知道,在全局定义的结构体变量,存储全局数据区;在函数内定义的结构体变量,存储在栈区;使用malloc函数申请空间来存放结构体变量,则该结构体变量存储在堆空间中。那假如有1000个在函数内部(栈区)或者函数外部(全局数据区)定义好的结构体,能否直接创建链表?比如下面段代码,提前定义了结构体数组,然后串联成类似“链表”的形式,但假如节点数目大于6,则难以扩展。但是这样徒有链表的形式,不具备链表动态扩展的特点。我们说的链表,其节点数据一般放在堆空间中。...
2016-09-27 09:45:09 11334
原创 字符指针、字符串、字符数组、字符串数组
和charch[]={'a','b','c','d','e'};刚开始学习时,我以为有“字符串指针”的概念,也就是指向字符串的指针。其实没有这个概念,字符指针与字符串指针,都指向一个字符。比如代码char*ptr[]={"xxxxxxxx","bbbbbbbb","ccccccc"};这两个都是字符数组,数组元素都是字符,但第二种不会自动添加空字符。字符串数组,数组元素都是字符串。字符指针一般用来指向一个字符,或者指向一个字符串。字符指针p指向这个字符串的首字符'a'。......
2016-09-26 10:08:04 679
原创 257. Binary Tree Paths
1、问题描述2、代码(非本人所写,十分精彩的C代码)int pathsNum(struct TreeNode* root);void Traverse(struct TreeNode* root, char** array, char* spre, int* pindex);char* stringAdd(char* s, int val);char** binaryTreeP
2016-09-25 22:13:01 413
原创 my_atio()代码出错原因,完全代码
1、//不明白这么简单的代码为什么会出错#includeint my_atoi(char *str);int main(void){char a[]=" 12345";int b=0;b = my_atoi(a);printf("%d", b);getchar();return 0;}int my_atoi(char *str){char* p = str;//
2016-09-25 21:25:02 377
原创 atoi()函数:将字符串转换成整型数
atoi()函数会检查nptr所指向的字符串,跳过字符串开头的空格字符(单个或者连续多个空格都跳过),直到遇上数字或正负号才开始做转换。当再次再遇到非数字或者字符串结束标志('\0')时才结束转化,并将转换后的整型数返回。如果第一次遇到的就是字符,则返回一个0值。比如“a245”返回0,“45a2”返回45,“345a”返回345……C语言有atoi、atol、atof等库函数,可分别把ASCII编码的字符串转化为int、long、float类型的数字。这里讲述atoi()函数的内容,另外两个类似。...
2016-09-25 21:24:57 1479
原创 main函数的参数
摘自:http://bbs.csdn.net/topics/210046601前面介绍的main函数都是不带参数的,因此main后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为:main(argc,argv)。C语言还规定a
2016-09-25 21:24:54 1344 1
原创 C库中的输入函数、输出函数
关于这些C库输入函数、输出函数的用法,可以在命令行输入“man3xxx”来查询。把存储在计算机中的二进制格式的数值,按照转换说明,转换成一系列字符(一个字符串)以便于显示,如01001100(76),%d说明将之转换成字符7和6,并显示为76。函数返回所打印的字符的数目。它针对所有的打印字符,包括空格和不可见的换行字符。常见的转换说明有%d,%s(字符串),%c(字符);读取输入的字符,并将输入的字符按照格式说明进行转换。该函数使用指向变量的指针作为参数。这两个函数是面向字符。...
2016-09-25 21:24:52 1359
转载 VS2015的安装与使用
编写源文件:这是编程的主要工作,我们要保证代码的语法100%正确,不能有任何差错;编译:将源文件转换为目标文件;链接:将目标文件和系统库组合在一起,转换为可执行文件;运行:可以检验代码的正确性。不过 VS 提供了一种更加快捷的方式,可以一键完成编译、链接、运行三个动作,点击菜单栏中的“运行”按钮,或者按下F5键就能做到这一点。不过如果我们的代码中没有添加getchar();语句,点击“运行”按钮,或者按下F5键后程序依然会一闪而过,只能看到一个“黑影”。如果想让程序自动暂停,可以按下。
2016-09-25 21:24:49 42159 1
原创 位操作
#include#include#define SHIFT 5#define MASK 0x1Fvoid set(int n,int *arr){int index_loc,bit_loc;index_loc = n >> SHIFT;bit_loc = n & MASK;arr[index_loc] |=1}void clear(int n,int *arr){i
2016-09-25 21:24:47 464
原创 文件操作
1、main(){ int n; FILE *fp =fopen("C:\\Users\\Horrobo\\Desktop\\Algorithm\\data.txt","w"); assert(fp); for (n = 1; n <=size; n++) num[n] = n; srand((unsigned)time(NULL))
2016-09-25 21:24:44 297
原创 srand函数简介
srand函数是随机数发生器的初始化函数。原型:void srand(unsigned seed);用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会出现一样的随机数。如:srand(1); 直接使用1来初始化种子。不过为了防止随机数每次重复,常常使用系统时间来初始化,即使用time函数来获得系统时间,它的返回值为从 00:00:00 GM
2016-09-25 21:24:41 3448
原创 static和extern的用法总结
static用法见:1、http://www.cnblogs.com/yezhenhan/archive/2011/10/31/2229724.html2、http://www.52rd.com/Blog/Detail_RD.Blog_imjacob_5297.htmlextern用法:1、http://blog.csdn.net/cameracanon/article/details/
2016-09-25 21:24:38 550
转载 bitmap算法
http://www.cnblogs.com/dyllove98/archive/2013/07/26/3217741.html
2016-09-25 21:24:35 390
原创 关于scanf和&的问题
简单地说,如果使用scanf()把一个字符串读进一个字符数组中,不能使用&;读取其他基本变量类型时,在变量名之前添加&。如以下代码:int age;char pet[30];scanf("%s", pet);scanf("%d", &age);
2016-09-25 21:24:14 1139
原创 从0-1背包问题学习回溯法、分支界限法、动态规划
一、0-1背包问题的描述下面将使用回溯法、分支界限法、动态规划法来分析和解决此问题。二、算法分析以及代码1、回溯法(1)算法步骤2、分支界限法3、动态规划
2016-09-25 17:08:40 2336 6
原创 简单的深度优先遍历和广度优先遍历
代码来源于《啊哈!算法》。1、深度优先遍历:#includeint book[101],n, e[1001][1001], sum;void DFS(int cur){ int h; sum++; printf("%d ", cur); if (sum == n) return; for (h = 1; h <= n; h++) if (book[h] == 0 &
2016-09-25 15:35:13 972
原创 最小生成树和最短路径
一、概念的理清1、图分为连通图和非连通图,我们一般讨论连通图。带权的图叫做网。2、连通图的生成树:(1)包含图的所有的n个顶点;(2)只有n-1条边,且这n-1条边足以构成一棵树;3、最小生成树:构造连通网的生成树,且代价最小。简单理解,就是连通所有的点,而且权值总和最小的生成树。4、最短路径:两点之间权值总和最小的路径。二、最小生成树常用算法1、P算法:2、K
2016-09-24 11:09:44 1024
原创 树的遍历和图的遍历的异同
一、认识的理清1、 首先,应该认识到“深度优先”和“广度优先”是算法思想,而递归是实现“深度优先”的一种方法(深度优先可以非递归实现);2、 其次,深度优先搜索也叫深度优先遍历(DFS,Depth_Fisrt_Search,这么低级的概念也需要记录,不过我的确纠结过这两个称呼有啥区别)。3、 最后,遍历的目的是把节点按照一定的规则排成线性序列。二、图的遍历1、深度优先遍
2016-09-24 10:39:52 5220
转载 一段采用链地址法解决冲突的Hash代码
/*typedef struct linkList { int data; int index_nums; struct linkList *ptr;}linkList;void hashInsert(int i, int val, int hashSize, linkList *hashT) { int tmp_val; (val < 0) ? (tmp_val = (-1
2016-09-24 09:37:48 1225
原创 单链表的头插法和尾插法实现代码(无头结点)
/*头指针,可以发现head是赋值为NULL,而不是head->next*///-----------------头插法-------------------node *head, *p;head = NULL;while (……){ p = (node *)malloc(……); p->data = ……; p->next = head;//此时第一个p的next指针是NULL,
2016-09-22 22:17:54 2993
原创 位操作实现加减乘除
整理于1、http://www.cnblogs.com/sunchaosailor/archive/2012/04/02/2429657.html 2、http://blog.chinaunix.net/uid-28499588-id-3488112.html一、常见功能的位操作实现:(1)常用的等式:-n = ~(n-1) = ~n+1;(2)获
2016-09-21 17:34:21 1266
原创 “指针+1”的理解
对指针加1,等价于对指针的值加上它所指向的对象的数据类型的字节大小。比如:int num[3];int* p;p = &num[0];//假如 &num[0]=12,则p=12;p++;//此时p!=13,而是p = 12 + sizeof(int);struct node *p;p++;//假如原始p=12,则此时p!=13,而是p = 12 + sizeof(struct
2016-09-21 11:31:44 17835 2
原创 原码、反码、补码,以及负数的位操作
原码:将符号位数码化了的数,其中“+”用0表示,“-”用1表示。反码:正数的反码表示与原码表示一样;负数的反码表示是原码表示的符号位不变,数值位逐位取反。补码:正数的补码表示与原码表示一样;负数的补码表示是原码表示的符号位不变,数值位逐位取反后最低位加1(反码表示最低位加1)。例: [+63] 原=0011 1111 反=0011 1111
2016-09-20 22:15:43 2214
原创 异或运算交换两个整数
异或运算有两个特性:1、一个数异或本身恒等于0,如5^5恒等于0;2、一个数异或0恒等于本身,如5^0恒等于5。基于此,交换操作如下:a=a^b;b=b^a;a=b^a;
2016-09-20 11:31:00 707
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人