随笔分类 -  C语言

堆排序、快速排序、归并排序总结
摘要:二分查找及其扩展应用场景大端和小端的问题2012-09-21 11:33:41| 分类: 算法、数据结构 | 标签:算法数据结构 归并排序 内部排序 面试 |举报 |字号大中小订阅这三个排序以前都写过,快速排序还写了递归版和迭代版。现在在这里做一下总结。堆排序(Heap Sort)堆排序是一种树形选择排序,在排序过程中,将A[n]看成是完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。对N个元素从小到大排序建立大根堆,然后交换堆顶与最后一个元素,将剩下的N-1个元素调整为大根堆,执行N-1此这样的操作。 堆排序是不稳定的。算法时间复杂度O(nlogn. 阅读全文
posted @ 2014-02-24 09:06 思过崖 阅读(809) 评论(0) 推荐(0)
15-C语言结构体(转载)
摘要:目录:一、大型软件开发二、头文件和static三、结构体四、联合五、枚举回到顶部一、大型软件开发将一个代码中的内容,拆分成多个文件,最后的可执行文件只要一个。操作步骤:1 原来只有一个文件main.c输入函数 输出函数 声明2 多人开发 将原文件拆成三个文件,分别为*.h、*c、main.c3 编译时1)分别编译不同的源文件,生成相应的目标文件gcc -c input.cgcc -c main.c2)可以将多个目标文件链接生成同一个可执行文件gcc input.o main.o => a.out3)在main.c中,引入头文件4).h文件中的条件编译解决的是重复声明问题5)先xcode中 阅读全文
posted @ 2014-01-10 09:27 思过崖 阅读(249) 评论(0) 推荐(0)
标准IO缓冲详解全缓冲、行缓冲、不缓冲
摘要:标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数。他也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。不幸的是,标准I/O库最令人迷惑的也是他的缓冲。标准I/O提供了三种类型的缓冲:1、全缓冲。这种情况下,在填满标准I/O缓冲区后才进行实际I/O操作。对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲。一个流上执行第一次I/O操作时,相关标准I/O函数通常调用malloc获得需使用的缓冲区。术语冲洗说明I/O缓冲区的写操作。缓冲区可由标准I/O例程自动冲洗,或者可以调用函数fflush冲洗一个流。值得引起注意的是在UNIX环境中,fl 阅读全文
posted @ 2014-01-09 12:00 思过崖 阅读(1833) 评论(0) 推荐(0)
windows与unix/linux下输入回车换行的区别
摘要:windows与unix/linux下输入回车换行的区别2012-07-23 22:51:02| 分类: Linux | 标签:linux 缓冲区 |字号大中小订阅当在windows的编辑器中敲击回车进行换行的时候,实际的文件中输入的字符为回车字符‘\r’和换行符'\n',两者对应的ASCII码分别为13和10。这是因为windows遵从了英文打字机的传统模式,英文打字机是如何换行的呢?英文打字机是选择将小车退回至起点,这个过程称为回车(carriage return, CR),随后把小车调至下一行的位置,这个过程称为换行(line feed, LF),这样就完成了英文打字机中 阅读全文
posted @ 2014-01-09 11:54 思过崖 阅读(1290) 评论(0) 推荐(0)
strtok()的用法
摘要:strtok()函数 2009-09-03 18:55:33分类: LINUXstrtok()这个函数大家都应该碰到过,但好像总有些问题, 这里着重讲下它首先看下MSDN上的解释:char *strtok( char *strToken, const char *strDelimit );ParametersstrTokenString containing token or tokens.strDelimitSet of delimiter characters.Return ValueReturns a pointer to the next token found in strToken 阅读全文
posted @ 2013-12-19 15:05 思过崖 阅读(2058) 评论(0) 推荐(0)
头文件的处理
摘要://头文件的作用//1.存放标准头文件//2.宏定义//3.数据封装//4.函数的声明#ifndef#ifndef x#define x ... #endif 这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等 #ifndef x //先测试x是否被定义过 #define x//如果没有定义下面就定义x并执行下面的语句 ... #endif //如果已经定义了则执行#endif后面的语句 条件指示符#ifndef检查预编译常量在前面是否已经被定义。如果在前面没有被定义,则条件指示符的值为真,于是从#ifndef到#endif之间的所有语句... 阅读全文
posted @ 2013-12-19 10:59 思过崖 阅读(203) 评论(0) 推荐(0)
feof()出现的问题及解决办法
摘要:C语言feof()函数的使用正确的应该是feof返回0表示文件没有结束,返回1,表示结束。feof实际观察的是上次读操作的内容,也就是上次读操作fread返回的值,如果读操作的返回值表明读取的不是空,那feof就返回0,如果上次读操作失败了,则feof返回1,表示读取完了。而fread返回值是表示正确读取的块数,如果不够,则返回0。那么我们看一下下面的程序:while(1){ if(feof(fp1)) { break; } else { tmpint = fread(&(tmp[k]),1,1,fp1); k++; }}如果fp1指向的文件有256个字节,那么运... 阅读全文
posted @ 2013-12-19 10:37 思过崖 阅读(3972) 评论(0) 推荐(0)
测试题
摘要:一:填空(共28分)1.(2分)structAA{chara; charb[2];shortc;intd; };请问sizeof(structAA)是___12___。2.(2分)structBB{chara;shortb[2];charc;intd;};请问sizeof(structBB)是__12____。3.(6分)int*p=NULL;intmain(){inti=3;staticinta=5;int*p1=NULL;p=&a;*p=i;p1=(int*)malloc(5*sizeof(int));i++;printf(“%d,%d\n”,a,i);return0;}在32位系 阅读全文
posted @ 2013-12-10 17:22 思过崖 阅读(451) 评论(0) 推荐(0)
变量的作用域解析
摘要:原题为去掉count后面所带的的数字,不同的颜色代表同一变量的不同作用域#includeint count1= 3;int main(){ int i, sum, count2 = 2; //作用域为main里面 for(i = 0, sum = 0; i < count2; i += 2,count2++) { static int count3 = 4; //作用域为for循环里面除去if这一部分 count3++; if(i % 2 == 0) { extern int count1; //作用域if里面 count1++; ... 阅读全文
posted @ 2013-12-09 20:54 思过崖 阅读(166) 评论(0) 推荐(0)
小知识点
摘要:一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,动态局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、数据域(或静态区)(static)—,全局变量和静态变量的存储是放在一块的;初始化的全局变量和静态变量在一块区域.data段, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域.bss段。 - 程序结束后有系统释放4、文字常量区 —常量字符串就是放在这里的。.. 阅读全文
posted @ 2013-12-08 20:48 思过崖 阅读(311) 评论(1) 推荐(0)
宏的使用
摘要:一、宏定义1 宏是常用的预处理功能之一,是在编译之前进行宏替换,即将宏名替换成所定义的宏体。2 优点:可以使代码更简单,更容易,避免大量使用。3 宏定义定义在函数外面;格式:#define PI 3.14PI为宏的文件内容在编译前将PI的内容替换成3.144 宏与全局变量的区别宏相当于字符串的替换操作,内存中不存在全局变量在内存中是存在的。相同点:通常定义一个全局变量加上const修饰符,全局变量的值是不可以修改的。5 宏函数#define MianJi(r) PI*r*r宏函数只是文本,只是相当于做了内容替换的操作,注意参数是没有数据类型6 在声明数组时也可以使用宏#define SIZE 阅读全文
posted @ 2013-12-08 19:20 思过崖 阅读(591) 评论(0) 推荐(0)
结构体的房子模型解析
摘要:#includestruct Node{ char a; //0 short b;//2,3 char c;//4, int d;//8,9,10,11} name;int main(){ char Array[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; struct Node *p = (struct Node*)(void*)Array; printf("%#x, %#x, %#x, %#x", (int)(p->a), (int)(p->b), (int)(p->c),(int) 阅读全文
posted @ 2013-12-08 17:29 思过崖 阅读(580) 评论(1) 推荐(0)
调用函数时参数传递的单向性分析
摘要:解析:1 x, y, z被定义成全局变量,但是在调用函数void p(int *x, int y)时,传递过来的实参存在栈空间里,相当与从原来实参那里复制一份,在函数调用结束时要释放这些参数,所以不会改变原来的实参,这就是调用函数时参数的传递是单向的。2 由于z不是通过函数调用传递过来的参数,所以对z的操作就是对全局变量的操作,可以改变z的值。3 传递过来的指针也是一个参数,函数调用结束时也要被释放掉,但是释放的只是指针本身,在被调用的函数运行时指针参数改变的是指针所指向的变量本身,所以通过指针的传递可以让被调函数改变主调函数里面的的变量。 阅读全文
posted @ 2013-12-08 16:19 思过崖 阅读(801) 评论(0) 推荐(0)