- 博客(62)
- 收藏
- 关注
原创 C语言常见字符串函数实现
1.获取字符串的长度(strlen)#include<assert.h>//计数器方式int mystrlen(const char* str) { assert(str != NULL); int cnt = 0; while (*str++) { ++cnt; } return cnt;}//递归方式int mystrlen(const char* str) { assert(str != NULL); if (*s
2020-07-17 10:40:24
223
原创 什么是指针?什么是指针数组?数组指针?指针函数?函数指针??用函数指针数组实现转移表
指针概念在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”,意思是通过它能找到以它为地址的内存单元。我们简单总结一下:指针就是个变量,用来存放地址,地址唯一标识一块内存空间。指针的大小在32位平台是4个字节,在64位平台是8个字节。指针有很多种不同的类型,比如char* pc、int* pi、short* ps
2020-07-14 11:37:06
425
原创 什么是AVL树?AVL树的插入,旋转及验证(代码实现)
前文说到了二叉搜索树一般情况下有很高的查找效率,平均时间复杂度为O(logN),N为树中的全部节点数。但是二叉搜索树也有缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),这就很不稳定了。那么有没有更好的二叉搜索树呢?一、什么是AVL树两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发表了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行
2020-07-03 08:55:15
303
原创 什么是二叉搜索树?二叉搜索树的查找、插入、删除实现
一、什么是二叉搜索树二叉搜索树(Binary Search Tree)又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:(1)若它的左子树不为空,则左子树上所有节点的值都小于根节点的值(2)若它的右子树不为空,则右子树上所有节点的值都大于根节点的值(3)它的左右子树也分别为二叉搜索树二叉搜索树拥有很高的查找效率,树中最左节点为最小元素,最右节点为最大元素二、二叉搜索树的实现(查找、插入、删除)代码如下:#include<iostream>using namespac
2020-07-02 01:09:37
263
原创 排序算法(三) 之冒泡排序、快速排序
冒泡排序冒泡排序的原理:比较相邻的元素,如果前一个比后一个大(小),就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这样下去,最后的元素应该会是最大(小)的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。void BubbleSort(int* a, int n){ for (int end = n - 1; end > 0; --end) { int flag = 0; for
2020-05-27 11:38:15
198
原创 不会有人真的不看这个完整的string类实现,不会吧
模拟实现一个string类,功能与STL标准库中的string类似 。基本函数实现:构造函数、拷贝构造函数、operator赋值函数、析构函数namespace Xner{ class string { public: string(const char* str = "") { _str = new char[strlen(str) + 1]; strcpy(_str, str); _size = strlen(str); _capacity = _size;
2020-05-26 21:42:23
269
2
原创 Linux进程间通信-匿名管道及命名管道(上)
进程间通信的目的: 数据传输、资源共享、通知事件发生(例如子进程退出时要向父进程发送SIGCHLD信号通知父进程)、进程控制等几种进程间通信方式由于进程之间的独立性 — 每个进程都有自己的虚拟地址空间, 操作的是自己的地址, 因此进程之间无法进行直接通信;那么操作系统是如何完成进程间通信的?给多个进程之间提供一个大家都能访问到的通信介质 –内存,并且操作系统在提供进程间通信方式的时候也根据通信场景的不同提供不同的方式:管道(匿名管道和命名管道)、共享内存、消息队列、信号量管道我们把从一个进程连接到
2020-05-25 17:46:35
190
原创 排序算法(二) 之选择排序、堆排序
选择排序首先在待排序序列中找到最小(大)数据, 存放到排序序列的起始位置, 然后, 再从剩余未排序数据中继续寻找最小(大)数据, 然后放到已排序序列的末尾. 以此类推, 直到所有数据均排序完毕void SelectSort(int* a, int n){ int begin = 0; int end = n - 1; while (begin < end) { // 在[begin, end]选出一个最小的数和一个最大的数下标 int minindex = begin, maxi
2020-05-23 18:52:30
173
原创 排序算法(一) 之插入排序、希尔排序
插入排序插入排序, 也被称为直接插入排序. 每一步将一个待排序的数据插入到之前已经排好序的序列中, 并保持依然有序, 直到插完所有数据void InsertSort(int* a, int n){ for (int i = 0; i < n - 1; ++i) { // 在有序区间[0, end]中插入num int end = i; int num = a[end + 1]; while (end >= 0) { if (a[end] > num)
2020-05-23 17:22:29
219
原创 C/数据结构 -堆(Heap)的实现
现在有一个数组, 逻辑上可看做一颗完全二叉树. 堆(Heap) 就是用数组实现的完全二叉树堆分为两种: 大根堆和小根堆在大根堆中, 父节点的值比每一个子节点的值都要大; 在小根堆中, 父节点的值比每一个子节点的值都要小这里将用代码创建一个小根堆代码如下:头文件Heap.h#pragma once#include <stdio.h>#include <string.h>#include <malloc.h>// 定义堆的结构typedef int
2020-05-19 23:14:14
288
原创 C++实现一个日期类,可以完成日期赋值,日期比较,基本的日期计算
实现一个日期类, 可以完成日期赋值, 日期比较, 日期+天数, 日期-天数, 日期-日期等计算代码如下:#include<iostream>using namespace std;class Date{public: // 获取某月的天数 int GetMonthDay(int year, int month) { int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //
2020-05-17 20:23:52
1076
原创 C语言实现栈和队列
头文件stack.h#pragma once#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int STDataType;typedef struct Stack{ STDataType* _a; int _top; //栈顶 int _capacity; //栈的容量}Stack;// 初始化栈void StackInit(Stack* pst){ pst-
2020-05-14 11:08:42
276
原创 C语言实现带头双向循环链表
头文件List.h#pragma once#include<stdio.h>#include<malloc.h>#include<assert.h>//带头双向循环链表增删查改typedef int LTDataType;typedef struct ListNode{ LTDataType _val; struct ListNode* _next; struct ListNode* _prev;}ListNode;ListNode* Li
2020-05-13 18:45:10
395
原创 实现单链表的增删查改
头文件SList.h#pragma once#include<stdio.h>#include<malloc.h>#include<assert.h>typedef int SLDataType;typedef struct SListNode{ SLDataType val; struct SListNode* next;}ListNode;ListNode* SetListNode(SLDataType x); //动态申请一个节点
2020-05-11 15:47:56
257
原创 实现顺序表的增删查改
线性表分为两种: 顺序表(顺序存储)和链表(链式存储), 这里实现一下顺序表管理数据的增删查改操作头文件自定义头文件中一般存放自定义函数的函数声明SqList.h#pragma once#include<stdio.h>#include<assert.h>#include<stdlib.h>typedef int SqLDataType;typedef struct SeqList{ SqLDataType* a; size_t size; s
2020-05-10 11:08:04
428
原创 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水, 给20元,可以喝多少瓶汽水
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水给20元,可以多少汽水,编程实现代码:#include<stdio.h>int main(){ int money = 20; int total = money; //汽水1元1瓶,有20元买20瓶 int empty_bottle = total; //喝完后空瓶有20个 while (empty_bottle > 1) { total += empty_bottle / 2; empty_bottle =
2020-05-09 21:31:13
287
原创 编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回值是value的二进制位模式从左到右翻转后的值
编写函数:unsigned int reverse_bit(unsigned int value);这个函数的返回值是value的二进制位模式从左到右翻转后的值如:在32位机器上25这个值包含下列各位:00000000000000000000000000011001翻转后:(2550136832)10011000000000000000000000000000程序结果返回:255...
2020-05-04 21:40:48
164
原创 文件描述符fd, 重定向及动态库/静态库的生成与使用
文件描述符fd我们在使用open函数以后, 正常情况下会返回一个文件描述符fd, 那么这个文件描述符是什么东西呢?文件描述符是一个非负整数 —操作文件的句柄本质是个进程打开的文件描述信息表的数组下标, 通过这个下标可以在内核中找到相应的文件描述信息, 通过这个描述信息可以实现文件操作Linux进程默认情况下会有3个缺省打开的文件描述符, 分别是:stdin(标准输入)0 / stdout...
2020-05-03 20:47:48
439
原创 Linux系统调用IO接口
除了用标准库中的函数操作文件以外, 我们还可以使用系统接口来进行文件访问, 文件内容修改下面是一些常用的系统调用IO接口:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(co...
2020-05-01 17:52:39
174
原创 左旋和右旋字符串中的k个字符
实现一个函数,可以右旋字符串中的k个字符ABCD右旋一个字符得到DABCABCD右旋两个字符得到CDABABCD右旋三个字符得到BCDA代码如下:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<string.h>void reverse(char* str, int left, int ...
2020-04-30 17:51:27
204
原创 杨氏矩阵-有一个二维数组数组的每行从左到右是递增的, 每列从上到下是递增的, 在这样的数组中查找一个数字是否存在?
杨氏矩阵有一个二维数组数组的每行从左到右是递增的, 每列从上到下是递增的.在这样的数组中查找一个数字是否存在?#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int Reseach(int a[][3], int row, int col, int num){ int i = 0; int j = col - 1;...
2020-04-28 10:00:42
216
原创 调整数组使奇数全部都位于偶数前面
输入一个整数数组, 实现一个函数来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, 所有偶数位于数组的后半部分代码如下:#include<stdio.h>void Adjust(int* a, int n){ int i, j; for (j = n - 1; j > 0; j--) { for (i = 0; i < j; i++) ...
2020-04-28 09:34:57
294
原创 Linux标准库IO接口
标准库的IO接口:#include <stdio.h>FILE *fopen(const char *path, const char *mode);返回值: 成功将返回一个指向文件对象FILE的指针.否则,将返回 NULLfopen打开文件名为path指向的字符串的文件,将一个流与它关联参数mode指向一个字符串,以下列序列之一开始(序列之后可以有附加的字符):r ...
2020-04-26 15:15:28
272
原创 有一个字符数组的内容为:"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代码如下:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void reserve_size(...
2020-04-25 23:02:28
153
原创 一组数据中只有一个数字出现了一次, 其他所有数字都是成对出现的. 请找出这个数字(使用位运算)
一组数据中只有一个数字出现了一次, 其他所有数字都是成对出现的请找出这个数字(使用位运算)代码如下:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){ int arr[] = { 1, 2, 3, 4, 5, 3, 2, 1, 5 }; int i = 0; int ret = 0; int ...
2020-04-25 22:21:54
259
原创 不使用(a+b)/2这种方式, 求两个数的平均值
不使用(a+b)/2这种方式, 求两个数的平均值方法一:这种方法的优点在于, 当num1和num2的值非常大时, 相减能够保证结果不会溢出#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){ int num1 = 0; int num2 = 0; printf("Input two number:...
2020-04-25 21:35:35
116
原创 输入行数打印杨辉三角
输入行数打印杨辉三角:#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int main(){ int a[50][50] = {0}; int i, j, n; printf("输入要打印的行数n:\n"); scanf("%d", &n); for (i = 0; i < n; i++) { ...
2020-04-23 18:29:28
591
原创 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?输入例子:1999 2299输出例子:7代码如下:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int differ_bits(int x, int y){ int count = 0; int res = x ^ y; while (...
2020-04-23 16:51:52
115
原创 获取一个数的二进制序列中所有的偶数位和奇数位, 分别输出其二进制序列
获取一个数的二进制序列中所有的偶数位和奇数位, 分别输出其二进制序列代码:#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int main(){ int i, j = 0; //定义2个数组来存放二进制序列 char arr1[16]; char arr2[16]; int num = 0; printf...
2020-04-22 22:22:43
154
原创 求一个整数二进制位中1的个数
写一个函数返回参数二进制中 1 的个数比如:unsigned int value = 15;00000000 00000000 00000000 00001111函数返回这个整数的二进制位中有4个1代码:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int count_one_bits(unsigned int va...
2020-04-22 15:03:25
138
原创 Linux -minishell程序
我们在终端中运行一个程序, 这个程序的父进程实际上是shell程序当我们在shell中输入了一个命令, 这时候其实shell对这个标准输入进行解析, 得到了程序名称. 然后创建子进程, 并且将子进程的程序替换为当前这个解析出来的程序今天, 我们要实现一个minishell程序, 步骤如下:1.等待标准输入获取命令行 fgets()-从标准输入读取一行数据2.获取到标准输入之后,进行字符串...
2020-04-22 11:36:56
183
原创 递归方式实现打印一个整数的每一位
递归方式实现打印一个整数的每一位:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void Print(int n){ if (n > 9) { Print(n / 10); } printf("%d\n", n % 10);}int main(){ int num = 0; printf("输...
2020-04-21 21:02:20
147
原创 递归和非递归分别实现求n的阶乘
递归和非递归分别实现求n的阶乘:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>//递归int fac_R(int num){ if (num == 1) { return 1; } return num * fac_R(num - 1);}//非递归int fac_nonR(int num){ i...
2020-04-21 19:48:18
160
原创 Linux进程控制(2): 进程等待/程序替换
进程等待我们知道, 子进程先退出, 父进程如果不管不顾, 就会导致僵尸进程, 进而造成资源泄漏等严重问题一旦产生僵尸进程, “杀人不眨眼”的kill -9也无能为力, 因为没有办法杀死一个已经僵死的进程那么如何避免产生僵尸进程呢???父进程通过进程等待的方式, 回收子进程资源, 获取子进程退出信息 .这里先说一下阻塞和非阻塞:阻塞: 为了完成某个功能发起一个调用, 若当前不具备完成功能...
2020-04-21 17:52:09
215
原创 Linux进程控制(1): 进程创建/进程终止
进程创建fork函数, 创建一个子进程. 从已存在的进程中创建一个新进程. 新进程为子进程, 而原进程为父进程#include <unistd.h>pid_t fork(void); 创建一个子进程返回值:父进程返回子进程的PID,子进程返回0,出错返回-1当一个进程调用fork函数之后, 就有两个二进制代码相同的进程. 而且它们都运行到相同的地方我们看一段代码:#...
2020-04-19 11:32:47
223
原创 四种方法求字符串长度
使用四种方法求字符串的长度话不多说, 直接上代码:#include<stdio.h>#include<string.h>//计数器方法int my_strlen1(char* str){ int count = 0; while (*str++ != '\0') { count++; } return count;}//递归int my_...
2020-04-15 17:23:21
5822
原创 编写一个函数 reverse_string(char* string)(递归实现)
编写一个函数 reverse_string(char * string)(递归实现)实现: 将参数字符串中的字符反向排列要求: 不能使用C函数库中的字符串操作函数#include<stdio.h>int my_strlen(char* str){ int count = 0; while (*str++ != '\0') { count++; } return...
2020-04-15 14:22:23
216
原创 写一个递归函数DigitSum(n), 输入一个非负整数, 返回组成它的数字之和
写一个递归函数DigitSum(n), 输入一个非负整数, 返回组成它的数字之和例如, 调用DigitSum(1729), 则应该返回1+7+2+9, 它的和是19#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int DigitSum(int num){ if (num < 10) return num;...
2020-04-15 10:47:04
426
原创 编写一个函数实现n^k, 使用递归实现
编写一个函数实现n^k, 使用递归实现指数为负的时候, 很容易翻车, 注意好这点就行了~#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>double func(int n, int k){ if (k == 0) return 1; else if (k > 0) return n * func(n, k...
2020-04-14 21:30:54
244
原创 递归和非递归分别实现求第n个斐波那契数
斐波那契数列(Fibonacci sequence), 又称黄金分割数列、因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入, 故又称为“兔子数列”, 指的是这样一个数列:1、1、2、3、5、8、13、21、34、……这个数列从第3项开始, 每一项都等于前两项之和int Recursive(int n){ if (n <= 2) return 1; else return ...
2020-04-14 20:15:42
152
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人