C语言
小栩栩
这个作者很懒,什么都没留下…
展开
-
将空格转换成%20
字符串替换空格:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“we are happy.”,则输出“we%20are%20happy.”。方法一:用数组,从前往后复制,遇到空格变成 ,旧数组下标加1,新数组下标加3;#includevoid transfer(char old[]){char ne[20]={' '}原创 2015-09-09 20:58:04 · 2926 阅读 · 0 评论 -
优化后的冒泡排序
如果不需要经过n-1趟排序就可以把数据排好,那么一个简单的冒泡排序可能有很多次排序都是不需要的。排序完成的标志是在一趟排序中没有发生数据交换,那么我们可以设置一个标志位,它的初始值是0,如果发生了数据交换它的值就为1,在一趟排序完成后检查标志位,如果是0就直接返回。代码如下:void Bullsort(int *s,int n) //优化后的冒泡排序{int i,j原创 2015-11-14 11:22:19 · 377 阅读 · 0 评论 -
选择排序的优化算法
思路是在一次排序中找到最大的和最小的数的下标。void select(int *array,int n){int min,max;int left = 0,right = n-1;int i;for(;left {min = left;max = right;for(i = left;i {if(array[i] min = i;if(arr原创 2015-11-15 11:32:02 · 248 阅读 · 0 评论 -
复杂链表的复制
一个复杂链表中有两个指针,一个指针指向下一个结点,另一个指针指向链表中任意一个结点,要实现next的指向很简单,关键问题是指向任意位置的指向如何实现,这里的思路是将要复制的新节点都插入复制的那个结点的后面,那么新节点的rand就是原结点的rand的next。具体代码如下:List* Create_node(DataType x) //开辟一个新的结点{List* tmp;原创 2015-11-27 20:38:34 · 308 阅读 · 0 评论 -
从尾到头打印链表
这里考虑用递归的方法:void PrintTailToHead(List *head) {if(head){PrintTailToHead(head->next); printf("%d ",head->data);}}因为递归会有压栈的过程,会保存现场。原创 2015-11-27 20:49:39 · 264 阅读 · 0 评论 -
链表的一些基本操作
#include#includetypedef int DataType;typedef struct List{ //定义一个结点DataType data;struct List *next;}List;List* Create_node(DataType x) //开辟一个新的结点{List* tmp;tmp = (Lis原创 2015-11-27 20:44:27 · 225 阅读 · 0 评论 -
判断一个单链表是否有环,如果有环求出环的入口点和环的长度
#include#includetypedef struct List{int data;struct List *next;}List;List* Create_node(int x){List* tmp;tmp = (List *)malloc(sizeof(int));tmp->data = x;tmp->next = NULL;return原创 2015-12-01 17:56:52 · 481 阅读 · 0 评论 -
判断两个链表是否交叉,不考虑有环的情况
#include#includetypedef struct List{int data;struct List *next;}List;List* Create_node(int x){List* tmp;tmp = (List *)malloc(sizeof(int));tmp->data = x;tmp->next = NULL;return原创 2015-12-01 17:59:45 · 315 阅读 · 0 评论 -
进程调度算法的总结
1)先来先服务算法(FCFS):是一种最简单的调度算法,每次调度都是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或者发生某事件而被阻塞后才放弃处理机。该算法有利于长作业,而不利于短作业。 2)短进程优先算法(SPF):从就绪队列中选出估计运行时间最短的进程,将处理机分配给它,使它一直执行到结束,或发生某事件的阻塞而放弃处理机时再被调度。 3)优先权原创 2016-06-12 15:44:40 · 2042 阅读 · 0 评论 -
C语言中野指针与内存泄漏
内存泄漏 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,不能被任何程序再次使用,直到程序结束。即所谓内存泄漏。 注意:内存泄漏是指堆内存的泄漏。 简单的说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这转载 2016-07-25 20:46:57 · 739 阅读 · 0 评论 -
C函数调用过程原理及函数栈帧分析
转载地址:http://blog.csdn.net/zsy2020314/article/details/9429707 今天突然想分析一下函数在相互调用过程中栈帧的变化,还是想尽量以比较清晰的思路把这一过程描述出来,关于c函数调用原理的理解是很重要的。1.关于栈 首先必须明确一点也是非常重要的一点,栈是向下生长转载 2016-07-21 11:12:04 · 378 阅读 · 0 评论 -
关于main()函数参数的问题
使用main函数的参数,实现一个整数计算机,“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法。实现的函数如下:#include#includeint main(int argc,char *argv[]){ int i=0; int num1,num2; int ret; printf("请输入两个操作原创 2015-09-22 10:00:08 · 398 阅读 · 0 评论 -
给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数。
#include#include#includeint find_one_alone(int *arr,int len){ int ret=0; int i=0; for(;i { ret^=arr[i]; } return ret;}int find_flag(int num){ int n=0; while(nu原创 2015-09-22 10:15:25 · 393 阅读 · 0 评论 -
一个简单的猜拳游戏的实现
#include#include#include#include#define NAME_SIZE 20#define PASSWD_SIZE 20#define TURE 1#define MFLUSH {int ch = 0;\ while((ch = getchar()) != '\n'\ &&原创 2015-11-05 18:38:33 · 1738 阅读 · 0 评论 -
用冒泡,选择,快速排序的方法排序
冒泡排序法#includevoid swap(int *a,int *b){ int temp; temp=*a; *a=*b; *b=temp;}void sort(int x[],int n){ int i,j; for(i=0;i { for(j=0;j { if(x[j]>x[j+1]) swap原创 2015-09-08 22:33:37 · 333 阅读 · 0 评论 -
判断是否为回文数或回文字符
判断一个数是否为回文数:#includeint fun(int num){int old = num; //必须要保存原数,后面要进行比较int newnum = 0;while(num){newnum = ret* 10 + num % 10;num /= 10;}return newnum == old;}int main()原创 2015-09-09 21:18:10 · 541 阅读 · 0 评论 -
用三种方式实现strlen
//用递归实现#includeint my_strlen(char *string){ if(*string=='\0') return 0; else return 1+my_strlen(string+1);}int main(){ char a[]="abcdefg"; printf("%d\n",my_strlen(a));原创 2015-09-05 16:11:42 · 303 阅读 · 0 评论 -
实现 strcmp
#include#includeint my_strcmp(const char *stra,const char *strb){ assert(stra); assert(strb); while(*stra==*strb) { if(*stra=='\0') return 0; stra++; strb++; } if原创 2015-09-06 13:55:53 · 533 阅读 · 0 评论 -
不用条件和循环语句打印出1~1000
#includeint print(int n){ (n-1)&&print(n-1); printf("%d ",n);}int main(){ print(1000); return 0;}原创 2015-09-06 14:12:01 · 565 阅读 · 0 评论 -
将数组中奇数都放前面,偶数都放在后面
void adjust(int *arr,int left,int right){ int temp; while(left { if(1==left%2) left++; if(0==right%2) right--; temp=arr[left]; arr[left]=arr[right]; arr[right]=temp;原创 2015-09-28 14:23:25 · 4230 阅读 · 0 评论 -
实现memmove函数
#includevoid *my_mememove(void *dest,void *src,size_t count){ char *pdest=(char *)dest; char *psrc=(char *)src; char *ret=(char *)pdest; if(pdest>psrc && pdest { while(count--)原创 2015-09-12 12:33:30 · 381 阅读 · 0 评论 -
用递归实现字符串翻转
#include#includechar *reverse_str(char *str){ int len=0; char temp; int len=strlen(str); if(!str) return NULL; if(len>1) { temp=str[0]; str[0]=str[len-1]; str[原创 2015-09-06 14:02:05 · 371 阅读 · 0 评论 -
对可变参数列表的使用
求平均数:#include#includeint average(int val,...){ int sum=0; int i=0; va_list arg; va_start(arg,val); for(i=0;i { sum+=va_arg(arg,int); } va_end(arg); return sum/val;原创 2015-09-08 18:27:45 · 302 阅读 · 0 评论 -
实现strcat
#include#includechar *my_strcat(char *str,const char *ptr){ char *temp=str; assert(str); assert(ptr); while(*str!='\0') { str++; } while(ptr!='\0') { *str=*ptr; str+原创 2015-09-06 13:57:43 · 277 阅读 · 0 评论 -
判断一个字符是否是另一个字符的旋转字符串
方法一:将字符串1与字符串1连接,再判断字符串2是否为连接后的字符串1的子字符串,可以使用库函数实现。#include#include#includevoid revovle(char *str1,char *str2){ int len1=strlen(str1); int len2=strlen(str2); strncat(str1,str1,6);原创 2015-09-15 16:58:57 · 787 阅读 · 0 评论 -
static在C和C++中的用法和区别
转自:http://blog.csdn.net/skyereeee/article/details/8000512static主要有三个作用:(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数前两种C和C++都有,第三种仅在C++中有,下面分别作以下介绍:一、局部静态变量在C/C++中, 局部变量按照存储形式可转载 2016-08-16 16:55:00 · 360 阅读 · 0 评论