c
lei19950206
明明是个强人,天生一副熊样。。
展开
-
判断链表是否带环,以及环的入口
给出一个链表,先判断链表是否带环,如果带环,求出环的入口。判断是否带环:用快慢指针。快指针每走两步,慢指针走一步,如果两者在某个点处相遇,则链表带环。下边给出函数的实现代码:typedef struct LinkNode{ DataType data; struct LinkNode *next;}LinkNode,*pLinkNode;typedef struct原创 2017-07-15 13:09:57 · 268 阅读 · 0 评论 -
模拟实现strncmp
int my_strncmp(char *str1, char *str2,int len){ assert(str1); assert(str2); while (*str1 && *str2&&len--) { if (str1 == str2) { str1++; str2++; } else break; } //return *str1-原创 2017-05-08 12:52:43 · 280 阅读 · 0 评论 -
模拟strcmp
int my_strcmp(char *str1, char *str2){ assert(str1); assert(str2); while (*str1 && *str2) { if (str1 == str2) { str1++; str2++; } else break; } //return *str1-*str2; if (*str原创 2017-05-08 12:48:43 · 266 阅读 · 0 评论 -
模拟实现strstr
char* my_strstr(const char*dest, const char*src){ char *pdest = dest; char* psrc = src; while (*psrc&*pdest) { if (*psrc == *pdest) { psrc++; pdest++; } else break; } if ((*psr原创 2017-05-08 12:40:40 · 270 阅读 · 0 评论 -
模拟memcpy
void my_memcpy(void *dest, const void *src,int num){ assert(dest&&src); assert(num>0); char*Pdest = (char*)dest; char*Psrc = (char*)src; while (num--&&Pdest&&Psrc) { *Pdest++ = *Psrc++; }}原创 2017-05-08 12:04:59 · 230 阅读 · 0 评论 -
实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。 例如:输入t
int main(){ printf("Please input number\n"); char input[5]; int i; int j; scanf("%s", &input); scanf("%d", &i); scanf("%d", &j); int sum = 0; int num = 0; if (strcmp("-a", input)==0) num原创 2017-05-07 22:44:43 · 631 阅读 · 0 评论 -
联合体,位域, 结构体对齐
联合体union 当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构; 2)它的所有成员相对于基地址的偏移量都为0; 3)此结构空间要大到足够容纳最"宽"的成员;1下面解释这四条描述: 由于联合体中的所有成原创 2017-05-07 23:58:29 · 1808 阅读 · 0 评论 -
模拟itoa
char* itoa(int num, char*str, int radix){/*索引表*/ char index[] = "0123456789ABCDEF"; unsigned unum;/*中间变量*/ int i = 0, j, k; /*确定unum的值*/ if (radix == 10 && num<0)/*十进制负数*/ { unum = (unsigned)原创 2017-05-08 00:04:14 · 313 阅读 · 0 评论 -
模拟atoi
typedef enum state{ VAILD, INVAILD}STATE;STATE state = VAILD;int my_atoi(const char* str){ assert(str); long long ret = 0; int flag = 1; while (isspace(*str)) { str++; } if (*str == '-原创 2017-05-08 00:02:40 · 238 阅读 · 0 评论 -
实现一个通讯录; 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定
#define LEN 3struct people{ char name[10]; char sex[3]; char number[12]; int age;}; struct contact{ struct people *human; int capacity; size_t size;}; void Init(struct contact *con)原创 2017-05-07 23:54:15 · 2334 阅读 · 0 评论 -
使用qsort排序一个整型数组,一个浮点型数组,一个字符串数组
void show(const int *arr, int elems){ assert(arr != NULL && elems > 0); int i = 0; for (; i < elems; i++){ printf("%d ", arr[i]); } printf("\n");}int cmp(void *a, void*b){ return *((int *)a原创 2017-05-07 23:49:49 · 913 阅读 · 0 评论 -
模拟实现strcat与strncat
void my_strcat(char* dest, const char* src){ assert(dest != NULL); assert(src != NULL); //找目标的‘\0’ while (*dest != '\0') { dest++; } //拷贝 while (*dest++ = *src++) { ; } return ret;原创 2017-05-08 12:55:11 · 276 阅读 · 0 评论 -
模拟strcpy与strncpy
void my_strcpy(char *dest, char *src){ assert(dest); assert(src); while ((*dest++ = *src++))//连同‘\0’一起拷贝了 { ; } *dest = '\0';}void my_strncpy(char*dest, const char*src, int n){ asser原创 2017-05-08 13:04:07 · 379 阅读 · 0 评论 -
单链表的基本实现
单链表是方向单一的链表,即就是只能从前向后访问,不能从后向前访问。这篇文章,我将整理出单链表的一些基本功能。1.尾插 2.尾删 3.头插 4.头删5.打印 6.插入7.删除指定元素 8.删除指定元素的全部9.删除指定位置的元素10.排序(此文先给出基本的冒泡排序,其他排序算法之后再给出)下边,我就这些功能一个一个进行说明,尽量配图~~(这里的单链表不带头结点)原创 2017-05-08 13:21:10 · 284 阅读 · 0 评论 -
约瑟夫环问题
约瑟夫环问题就是从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;计算出最后留下来的那个人的编号。下边给出两种方法,顺序表实现和链表实现。链表的代码:typedef struct LinkNode{ DataType data; struct LinkNode *next;}LinkNode,*pLinkNode;typed原创 2017-07-15 13:06:09 · 205 阅读 · 0 评论 -
百度笔试题:malloc/free与new/delete的区别
相同点:都可用于申请动态内存和释放内存不同点:(1)操作对象有所不同。malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不转载 2017-06-07 18:42:10 · 426 阅读 · 0 评论 -
动态分配,结构,联合
(一)动态内存分配:1.为什么要动态内存分配呢?比如,我要做一个学生成绩管理系统,这里可能需要存储每个班级所有学生的信息,但是,我们到底要分配多大的空间呢??每个班的人数有可能并不相等,按多分配 ,那样多浪费;按少分配,不够。所以动态内存分配就有自己的作用了~~2.动态内存分配函数:(1)void *malloc(unsigned int size);-------size是需原创 2017-06-07 14:00:05 · 343 阅读 · 0 评论 -
指针重难、易错点
(一)函数指针在前边的blog中,已经整理归纳了数组和初级指针,接下来,我来继续整理高级指针和如何正确使用指针。我们说过,指针数组是一个数组,每个元素是指针;数组指针是个指针,指向的是数组。所以:函数指针就是指向函数的指针。我们先看以下代码:void fun(){}int main(){printf("%p",fun);printf("%p",&fun);printf原创 2017-06-07 13:57:46 · 268 阅读 · 0 评论 -
找出一个数组中只出现一个的数
已知一个数组中,除了一个数字出现一次外,其他数字都出现两次,试找出这个数~~思路分析:当看到这个题目,我就想,既然只有一个数出现一次,那么我们可以遍历这个数组,只要遇到相同的两 个数,就把它们置为一个比较大的数,最后输出那个没有被改变的数。[objc] view plain copy #de原创 2017-05-09 13:41:11 · 546 阅读 · 0 评论 -
判断机器是大端还是小端
数据在计算机中是以其补码形式存储。当数据的低字节放在低地址,高字节放在高地址,我们称其为小端字节序;相反的,当数据的低字节放在高地址,高字节放在低地址,我们称其为大端字节序。举例:比如,int a = -2; -2的原码:10000000 00000000 00000000 00000010 反码:11111111 11111111 1111111原创 2017-05-08 15:44:46 · 546 阅读 · 0 评论 -
const与static归纳总结
static与const都是C语言中的关键字,他们都可以修饰变量,函数等。1.const const与 变量 int x = 5; // 变量 const int x = 5;//在c++中,x是常量,在c语言中,x是不可改变的变量 const与指针类型[objc] view plain copy原创 2017-05-08 16:25:53 · 359 阅读 · 0 评论 -
猜数字(c语言实现)
猜数字小游戏:系统随机产生一个100以内的正数,要求参与者猜出系统产生的数,要是利用2分法,7次就足够了。如果参与者不知道使用2分法,如果9次猜不对,就算游戏失败。游戏可以一直进行,只要参与者不点退出键。[objc] view plain copy#define _CRT_SECURE_NO_WARNINGS #include #in原创 2017-05-08 16:14:39 · 6894 阅读 · 1 评论 -
多版本通讯录
开始写通讯录已经好久了,才把通讯录的多个版本整理完,下边我来谈谈实现通讯录过程中的一些问题,以及自己的心得,另外附加代码。通讯录要求: 1.增加信息 2.删除信息 3.查找信息 4.修改信息 5.显示信息 6.清除信息 7.按姓名排序 0.退出我觉得,写代码之前一定要想清楚自己要实现的功能,应该怎么实现,大致应原创 2017-05-08 13:28:47 · 441 阅读 · 0 评论 -
顺序表的基本实现
线性表是一种最简单、最基础的数据结构,线性表中的元素都是一对一的,除了第一个元素和最后一个元素之外,其他元素都是首尾相接。通俗地讲,线性表中的元素都是连在一条线中的,不管是直线还是曲线。如果是直线,我们称这个线性表为顺序表;如果是曲线,我们称其为链表。本篇文章,我来主要整理出关于顺序表的内容。在通讯录的多版本实现这篇博客中,我们 知道,根据顺序表的容量大小是原创 2017-05-08 13:24:32 · 381 阅读 · 0 评论 -
实现一个选择排序程序,排序整型数组
void select(int *arr,int len){ assert(arr); for (int i = 0; i < len; i++) { int k = i; for (int j = i + 1; j < len; j++) { if (arr[k]>arr[j]) { k = j; } } swap(arr[i],arr[原创 2017-05-07 23:40:16 · 272 阅读 · 0 评论 -
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19。
int sum(int num){ if (num / 10 == 0) return num%10; return num % 10+sum(num/10);}int main(){ printf("%d",sum(123456)); system("pause");}原创 2017-05-07 23:39:11 · 284 阅读 · 0 评论 -
编写一个函数实现n^k,使用递归实现
int sum(int num,int n){ if (n == 1) return num; return num*sum(num, n - 1);}int main(){ int ret=sum(8,3); printf("%d",ret); system("pause");}原创 2017-05-07 23:37:16 · 187 阅读 · 0 评论 -
每瓶汽水1元,两个空瓶可以置换一瓶汽水, 现在有20元,最多能喝多少瓶汽水。(编程实现)。
int huanshui(int bottle){ int number = bottle; int num = 0; while (number>1) { num += number/2; number = number / 2+number%2; } return num;}int main(){ int ret=huanshui(20); printf(原创 2017-05-05 18:59:02 · 343 阅读 · 0 评论 -
写一个宏可以将一个数字的奇数位和偶数位交换。
#define CHANG(x)((x&0x55555555)>1)int main(){ printf("%u\n", CHANG(5)); system("pause");}原创 2017-05-05 17:54:03 · 209 阅读 · 0 评论 -
字符串替换空格: 请实现一个函数,把字符数组中的每个空格替换成“%20”。 例如输入“we are happy.”,则输出“we%20are%20happy.”。
char *replace(char *str){ assert(str); char *start = str; int space_num=0; int len = 0; while (*start ) { if (*start == ' ') space_num++; start++; len++; } char*next = str + len + sp原创 2017-05-05 17:40:21 · 385 阅读 · 0 评论 -
求两个数之间有多少个比特位不同
#pragma warning(disable:4996)int main(){int data1;int data2;printf("Please input number\n");scanf("%d%d",&data1,&data2);data1 ^= data2;data2 = 0;while (data1){if (data1 & 1 == 1)原创 2017-05-05 16:48:19 · 900 阅读 · 0 评论 -
编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回 值value的二进制位模式从左到右翻转后的值。 如: 在32位机器上25
unsigned int reverse_bit(unsigned int value){int value1 = 0;int count = 31;while (count){int ret=value & 1;value1 ^= ret;value1 value >>= 1;count--;}return value1;}int mai原创 2017-05-05 17:10:15 · 302 阅读 · 0 评论 -
有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student". 要求: 不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
#includevoid Swap(char*start,char*end){ while (start < end) { *start ^= *end; *end ^= *start; *start ^= *end; start++; end--; }}void reverse(char *start, char*end){ /*while (start原创 2017-05-05 17:21:09 · 236 阅读 · 0 评论 -
1.求第n个斐波那契数(非递归实现)。 2.一个数组中只有两个数字是出现一次,其他所有数字都出现 了两次。 找出这两个数字,编程实现。
1.求第n个斐波那契数(非递归实现)。2.一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。//100010010代码1:斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,41原创 2017-05-05 17:00:34 · 466 阅读 · 0 评论 -
模拟memmove
void *my_memmove(void*dest, const void*src, size_t n) { assert(dest); assert(src); char*Pdest = (char*)dest; const char*Psrc = (const char*)src;if ((Pdest + n) <= Psrc) { while (n–) {原创 2017-05-11 12:40:37 · 247 阅读 · 0 评论 -
.实现一个函数翻转字符串(将一个字符串的内容,逆序存储)。
//第一种方法void left_reverse(char *str,int k){ assert(str); char*Psrc = str; int len = strlen(str); while (k--) { char ret = Psrc[0]; for (int i = 0; i < len-1; i++) { Psrc[i] = Psrc[i+1];原创 2017-05-05 19:02:17 · 1135 阅读 · 0 评论 -
斐波那契数列递归非递归实现
int fib(int k){ if (k == 0 || k == 1) return 1; int first = 1; int second = 1; int sum = 0; k -= 1; while (k--) { sum = first + second; second = first; first = sum; } return sum;}i原创 2017-05-05 19:06:33 · 207 阅读 · 0 评论 -
.一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
void Find_data(int *arr,int len, int *data1, int *data2){ assert(arr); unsigned int ret = 0; for (int i = 0; i <len; i++) { ret ^= arr[i]; } int tmp1 = 1; int tmp2 = 1; int count = 0; whi原创 2017-05-05 19:10:34 · 216 阅读 · 0 评论 -
一个字符串中查找第一个只出现一次的字符。 要求复杂度为O(N).
char find_first(char *arr,int len){ int asg[256] = {0}; for (int i = 0; i < len; i++) { asg[(int)arr[i]]++; } for (int i = 0; i < len; i++) { if (asg[(int )arr[i]] == 1) return arr[i];原创 2017-05-07 23:04:44 · 415 阅读 · 0 评论 -
有一个二维数组.----杨氏矩阵 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N);
int find_data(int arr[][5], int line, int k){ assert(arr); if ((karr[line - 1][4])) return 0; int lin = 0; int col = 4; while((lin = 0)) { if (k>arr[lin][col]) { lin++; } else if (原创 2017-05-07 22:54:41 · 873 阅读 · 0 评论