基础
_Saoke
曾以为走不出去的日子
现在都回不去了
展开
-
#pragma once 和 #ifndef 的总结
在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性,通常有两种方式——第一种是#ifndef指令防止代码块重复引用,比如说#ifndef _CODE_BLOCK#define _CODE_BLOCK // code #endif// _CODE_BLOCK第二种就是#pragma once指令,在想要保护的文件开头写入#pragma once...转载 2019-03-18 17:29:17 · 237 阅读 · 0 评论 -
模拟实现 strstr
函数const char* Strstr(const char* str1, const char* str2) { assert(str1 != NULL); assert(str2 != NULL); //保存下一次比较时 str1 的起始位置 const char* sign = str1; //比较时 str1 的起始位置 ...原创 2019-01-28 10:22:55 · 155 阅读 · 0 评论 -
模拟实现 strcat
函数char* Strcat(char* dest, const char* src) { assert(dest != NULL); assert(src != NULL); char* dp = dest; while(*dp != '\0') { ++dp; } while (*src != '\0')...原创 2019-01-28 10:09:23 · 202 阅读 · 0 评论 -
模拟实现 strcpy
函数char* Strcpy(char* des, const char* src) { assert(des != NULL); assert(src != NULL); while (*src != '\0') { *des++ = *src++; } ...原创 2019-01-28 10:04:38 · 200 阅读 · 0 评论 -
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水, 给20元,可以多少汽水。 编程实现。
函数int amount(int money) { //初始的时候, 拥有多少元钱就能买多少瓶汽水 int num = money; //初始买了多少瓶汽水, 就有多少个空瓶 int empty = num; while (empty >= 2) { // 2 个空瓶换一瓶汽水 num += emp...原创 2019-01-28 09:42:36 · 516 阅读 · 0 评论 -
一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。找出这两个数字,编程实现。
方法一通过位运算符的性质来实现void Search1(int* arr, int len) { int num[2]; int tm...原创 2019-01-28 09:33:54 · 180 阅读 · 0 评论 -
哈夫曼编码算法--我只想简单点
哈夫曼树哈夫曼树, 即带权路径最小的树, 权值最小的结点远离根结点, 权值越大的结点越靠近根结点图解图(3)即为哈夫曼树哈夫曼编码左孩子路径编码为 0, 右孩子路径编码为 1图解即A 的编码: 0D 的编码: 10B 的编码: 110C 的编码: 111哈夫曼编码算法的实现定义一个哈夫曼树//定义一个哈夫曼树typedef struct { //定义权值 un...原创 2019-01-02 13:12:38 · 62826 阅读 · 12 评论 -
线索二叉树-C语言实现
线索二叉树的定义在二叉链表中, 具有 n 个结点的二叉链表有 n + 1 个空指针域. 由此, 可以利用这些空指针域来存放结点的直接前驱和直接后继的信息结点的存储结构 lchildltagdatartagrchild左孩子结点前驱结点标志域数据域后继结点标志域右孩子结点含义 当 ltag = 0 时, lchild 指向结点的左孩子;当 ltag ...原创 2019-01-01 16:31:19 · 5401 阅读 · 10 评论 -
图的存储结构-邻接矩阵
邻接矩阵图的存储结构分为 邻接矩阵 和 邻接表, 本篇文章是有关通过邻接矩阵来实现图的存储, 邻接矩阵, 顾名思义, 即顶点之间的关系通过矩阵的形式表现出来, 矩阵的行坐标代表起始顶点的位置, 列坐标代表到达顶点的位置(无向图和无向网始末位置不讨论), 对于不带权的图或网而言, 矩阵中的值存放邻接标志, 如果起始顶点与到达顶点邻接, 则为 1, 否则为 0; 而对于带权图或网而言, 如果起始顶点...原创 2019-01-04 18:24:41 · 2899 阅读 · 0 评论 -
二叉树叶子结点,非叶子节点以及深度的计算
二叉树叶子结点的计算//统计叶子结点的数目int LeafNum(BiTree T) { if (!T) { return 0; } else if (!T->lchild && !T->rchild) { return 1; } else { return LeafNum(T->lchild) + LeafNum(T->rchild)...原创 2018-12-30 12:34:36 · 11605 阅读 · 0 评论 -
二叉树的遍历操作-递归和非递归
二叉树的遍历二叉树的遍历是很常见的一种问题, 往常我们可以通过递归来实现二叉树的先序,中序以及后序的遍历操作, 但是将递归转化成非递归是件值得去思考的一件事, 接下来是具体实现具体实现二叉树的定义//定义一个二叉链表typedef struct Node { char data; struct Node* lchild; struct Node* rchild;}BitNode,...原创 2018-12-30 12:27:42 · 356 阅读 · 0 评论 -
模拟实现 strchr
函数const char* Strchr(const char* str, int c) { assert(str != NULL); const char* match = str; while (*match != '\0') { if (*match == c) { return match; } ...原创 2019-01-28 10:29:48 · 140 阅读 · 0 评论 -
模拟实现 strcmp
函数int Strcmp(const char* str1, const char* str2) { assert(str1 != NULL); assert(str2 != NULL); while (*str1 == *str2) { if (*str1 == '\0') { return 0; } ...原创 2019-01-28 10:41:33 · 253 阅读 · 0 评论 -
C语言文件操作总结
C语言文件操作一、标准文件的读写1.文件的打开fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名...转载 2019-03-13 12:36:51 · 1002 阅读 · 0 评论 -
用C语言实现一个通讯录的基本功能(有文件操作版)
无文件操作版https://blog.csdn.net/qq_42957923/article/details/88110696结合无文件操作版的通讯录, 我给代码加了两段代码, 分别是加载文件函数 LoadFile 和保存文件函数 SaveFile, 具体操作如下:加上文件操作// 加载文件 void LoadFile(member* m) { ...原创 2019-03-09 22:29:35 · 601 阅读 · 0 评论 -
用C语言实现一个通讯录的基本功能(无文件操作版)
通讯录结构体// 通讯录个人信息 typedef struct infor{ char name[256]; char num[256]; }infor; // 通讯录信息 typedef struct { // 通讯录人数 infor mem[50]; // 通讯录索引 int mem_in...原创 2019-03-04 13:00:52 · 813 阅读 · 0 评论 -
关于malloc, calloc, realloc等内存申请相关的函数
(1)C语言跟内存分配方式<1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量.<2>在栈上创建 在执行函数时,函数内局部变量的存储单元都转载 2019-03-05 21:27:45 · 392 阅读 · 0 评论 -
结构体、位段与联合体
前言结构体和指针是数据结构的根基,所以这篇博客这算是对结构体有一个重新的认识,主要内容包括:匿名结构体、结构体的自引用、结构体的不完整声明、结构体内存对齐、位段的使用、联合体的应用场景等等。结构体匿名结构体:匿名结构体简言之就是没有名字的结构体,在结构体的时候就已经定义它的具体结构体对象。以后再也不允许创建新的结构体。这是我遇到的第一个坑,先看看下面这段代码:#define _CRT_S...转载 2019-03-01 11:39:43 · 1640 阅读 · 0 评论 -
回调函数的理解和总结
我们对回调函数的使用无非是对函数指针的应用,函数指针的概念本身很简单,但是把函数指针应用于回调函数就体现了一种解决问题的策略,一种设计系统的思想。在解释这种思想前我想先说明一下,回调函数固然能解决一部分系统架构问题但是绝不能再系统内到处都是,如果你发现你的系统内到处都是回调函数,那么你一定要重构你的系统。回调函数本身是一种破坏系统结构的设计思路,回调函数会绝对的变化系统的运行轨迹,执行顺序,调用顺序。回调函数的出现会让读到你的代码的人非常的懵头转向。那么什么是回调函数呢,那是不得以而为之的设计策原创 2019-02-13 22:51:35 · 456 阅读 · 0 评论 -
关于 qsort 的使用和延伸(模仿 qsort 写一个冒泡排序)
qsort 原型void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));base:指向要排序的数组的第一个对象的指针,该对象转换为void*num:数组的元素个数size:数组中每个元素的大小compar:指向比较两个元素的功能函数qsor...原创 2019-02-23 14:55:24 · 172 阅读 · 0 评论 -
指针函数和函数指针的理解与应用
指针函数指针函数, 即返回值为指针的函数, 本质上是一个函数, 我们先看下面实例:#include &lt;stdio.h&gt; #include &lt;time.h&gt; int year; int mon; int day; char* GetDate(); int main() { char* current = GetD...原创 2019-02-11 13:11:01 · 5168 阅读 · 3 评论 -
指针数组和数组指针的理解与应用
指针数组指针数组, 即以指针为元素的数组, 其主要应用于菜单的查找注意下面的实例:#include &lt;stdio.h&gt; int Add(int a...原创 2019-02-10 21:26:52 · 2980 阅读 · 5 评论 -
一级指针和二级指针的理解和总结
一级指针对于一级指针来讲, 我们再熟悉不过的应用就是修改实参的值注意下方应用:#include <stdio.h> void changeValue(int* value); int main() { ...原创 2019-02-10 20:17:10 · 7625 阅读 · 6 评论 -
C/C++中对NULL的理解与总结
NULL起初我们知道, NULL其实就是代表空指针的宏, 其本质上就是 0, 表示不指向任何内存的空指针但是, 我们看这段代码: int* p = (void*)NULL; ...原创 2019-02-21 20:18:57 · 4830 阅读 · 0 评论 -
模拟实现 strncmp
函数int Strncmp(const char* str1, const char* str2, size_t n) { assert(str1 != NULL); assert(str2 != NULL); while (n &amp;&amp; *str1 == *str2) { if (*str2 == '\0') { ...原创 2019-01-29 19:13:20 · 297 阅读 · 0 评论 -
模拟实现 strncat
函数strncat有越界的危险char* Strncat(char* dest, const char* src, size_t n) { assert(dest != NULL); assert(src != NULL); ...原创 2019-01-29 18:40:28 · 211 阅读 · 0 评论 -
模拟实现 strncpy
函数char* Strncpy(char* dest, const char* src, size_t n) { assert(dest != NULL); ...原创 2019-01-29 18:16:33 · 242 阅读 · 0 评论 -
模拟实现 memmove
函数void* Memmove(void* dest, const void* src, size_t num) { assert(dest != NULL); assert(src != NULL); //倒序拷入避免内存重叠 char* d = (char*)dest + num - 1; ...原创 2019-01-28 10:56:08 · 180 阅读 · 0 评论 -
模拟实现 memcpy
函数void* Memcpy(void* dest, const void* src, size_t num) { assert(dest != NULL); ...原创 2019-01-28 10:51:28 · 163 阅读 · 0 评论 -
判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
**判断一个字符串是否为另外一个字符串旋转之后的字符串。例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.AABCD左旋一个字符得到ABCDAAABCD左旋两个字符得到BCDAAAABCD右旋一个字符得到DAABC**#include <stdio.h> ...原创 2018-12-29 18:06:49 · 404 阅读 · 0 评论 -
实现一个函数, 可以左旋字符串中的k个字符
**实现一个函数,可以左旋字符串中的k个字符。ABCD左旋一个字符得到BCDAABCD左旋两个字符得到CDAB**#include <stdio.h> #include &l...原创 2018-12-29 17:17:20 · 403 阅读 · 0 评论 -
不使用(a+b)/2这种方式,求两个数的平均值
不使用(a+b)/2这种方式,求两个数的平均值。 举个例子,a有15块钱,b有5块钱,使a和b的钱数相等。算法1:把a和b的钱放一起,你一张我一张的分,就是(a+b)/2 #include<stdio.h> int main(){ int a = 15; int b = 5; printf("%d\n", (a + b) >> 1); sy...转载 2018-11-24 23:03:08 · 161 阅读 · 0 评论 -
有一个字符数组的内容为:"student a am i", 请你将数组的内容改为"i am a student". 要求: 不能使用库函数。 只能开辟有限个空间(空间个数和字符串的长度无关)。
有一个字符数组的内容为:“student a am i”,请你将数组的内容改为"i am a student".要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。student a am ii ma a tnedutsi am a student#include &lt;stdio.h&gt;#include &lt;windows.h&gt;/*原创 2018-11-25 18:45:55 · 1817 阅读 · 0 评论 -
编程实现: 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。(使用位运算)
可以在指定数组中找出只出现一次的元素#include&lt;stdio.h&gt; int main(){ int arr[] = { 1, 3, 4, 3, 1}; int i = 0; int len = sizeof(arr) / sizeof(arr[0]); for (i = 1; i &lt; len; i++) { ...原创 2018-11-25 18:41:39 · 221 阅读 · 0 评论 -
编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:在32位机器上25这个值包含下列各位:00000000000000000000000000011001翻转后:(2550136832)10011000000000000000000000000000程序结果返回:2550136832正解 :/*编写函数unsigned int reverse_bit(unsigned int value);这个函数的返回值吧value的二...原创 2018-11-25 18:31:32 · 223 阅读 · 0 评论 -
5位运动员参加了10米台跳水比赛+日本某地发生了一件谋杀案+在屏幕上打印杨辉三角
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。#include &lt;stdio.h&gt;#include &lt;windows.h&gt;//写一个判断名次有无重复的情况in...原创 2018-11-17 23:04:16 · 228 阅读 · 0 评论 -
C语言操作符——简单总结
操作符的分类:1.算术操作符2.移位操作符3.位操作符4.赋值操作符5.复合操作符6.关系操作符7.逻辑操作符8.单目操作符9.条件操作符10.逗号表达式11.下标引用,函数调用,结构成员算术操作符种类注意事项+-*/除数不能为 0%操作数必须是两个整数提醒:在进行算术运算时,要注意运算过程中类型的隐式转换移...原创 2018-11-19 16:18:06 · 228 阅读 · 0 评论 -
写一个函数返回参数二进制中1的个数+获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列+输出一个整数的每一位+两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
写一个函数返回参数二进制中 1 的个数比如: 150000 11114 个 1#include &lt;stdio.h&gt;#include &lt;windows.h&gt;/* 写一个函数统计一个数二进制形式下 1 的个数 *///统计 1 的个数int Count_One_Bits(unsigned int value) { int count = 0; unsig...原创 2018-11-19 14:21:13 · 227 阅读 · 0 评论 -
用C语言写一个简单的扫雷小游戏
#define _CRT_SECURE_NO_WARNINGS#include &lt;stdio.h&gt;#include &lt;windows.h&gt;#include &lt;time.h&gt;/* 用 C 语言写一个简单的扫雷游戏*/// 1.写一个游戏菜单 Menu()// 2.开始游戏 // 1.初始化二维数组 Init_Interface() // 2原创 2018-11-16 19:24:06 · 1377 阅读 · 0 评论 -
用C语言写一个简单的三子棋,实现玩家与电脑的对战
源代码:#define _CRT_SECURE_NO_WARNINGS#include &amp;lt;stdio.h&amp;gt;#include &amp;lt;windows.h&amp;gt;#include &amp;lt;time.h&amp;gt;/* 用 C 写一个三子棋*///逻辑://1. 画一个棋盘 --&amp;gt; 用二维数组实原创 2018-11-12 21:00:49 · 372 阅读 · 0 评论