自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 用C语言实现堆以及性质

堆的实现下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算法,把它构建成一个堆。根节点左右子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子节点的 子树开始调整,一直调整到根节点的树,就可以调整成堆。堆分为大堆和小堆大堆:每个父亲节点都比孩子节点大;小堆:每个父亲节点都比孩子节点小;向下调整现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整成一个小堆(或者大堆)。向下调整算法有一个前提:左右子

2021-12-06 00:16:45 860 2

原创 简述树的特立——二叉树

概念二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树特殊二叉树1.满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。. 也就是说,如果一个二叉树的层数为K,且结点总数是 (2^k) -1 ,则它就是满二叉树。如下图:2.完全二叉树:满足以下要求:. 所有叶子..

2021-11-17 11:46:53 1414 3

原创 用C语言数组设计循环队列

解释:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。来源:力扣(LeetCode)链接:622. 设计循环队列 - 力扣(LeetCode) (leetcode-cn.com)著作权归领扣网络

2021-11-11 18:48:19 1734 5

原创 两个队列实现栈

队列的实现:(95条消息) C语言实现队列_i_Crave的博客-CSDN博客栈的实现:(94条消息) C语言实现栈_i_Crave的博客-CSDN博客队列的性质是先进先出;栈的性质是后进先出;如何用两个队列实现栈的性质呢?栈必须是输出最先输入的数据,然而队列只能从最早输入的数据开始输出;所以要想以栈的方式从队列输出只能先把队列中除了队尾的数据全部输出到另一个队列中,再把剩余的那个数据输出,当想输入时往有数据的一个队列从队尾输入数据,这就是实现栈的过程;图解:在...

2021-11-04 21:43:33 541 9

原创 C语言实现队列

队列概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头队列的实现队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。下面用链式结构实现队列:// 链式结构:表示队列typedef int QDataType;typedef str...

2021-11-04 16:36:38 964 2

原创 C语言实现栈

栈一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。栈的实现栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的 代价比较小。如下图:下面用顺序表(数组)来实现栈;建立一个顺...

2021-11-02 01:01:20 506 6

原创 链表与顺序表的差别

顺序表:优点:1.支持随机访问,需要随机访问结构支持算法可以很好的适用2.CPU高速缓存命中率更高缺点:1.头部和中间插入删除时间效率低 O(N)2.连续的物理空间,空间不够了需要增容(a.增容过程有一定程度消耗,b.为了避免频发增容,一般我们都按2倍增,用不完存在一定的空间浪费)链表:优点:1.任意位置插入删除效率高 O(1)2.按需申请释放空间缺点:1.不支持随机访问,意味着一些排序、二分查找等在这种结构上不适用2.链表存储一个值,同时要存..

2021-10-29 17:11:22 171

原创 复杂链表的拷贝

题目:给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y ..

2021-10-29 16:26:29 149 3

原创 链表分割且不能改变原来的数据顺序

描述现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。思路一:动态创建两个带头单项链表,从原链表头开始遍历,一个记录值大于x的节点,把最后一个节点链接到空节点上;一个记录值小于x的节点。将记录大于x的链表链接到记录小于x的链表的后面,再释放两个头结点;记录链表分开后的两个头结点,以便于释放两个哨兵头位,将两个链表连起来(如下图)思路二:在原链表上改动,从...

2021-10-25 20:59:25 257 5

原创 合并两个有序无头单链表

21. 合并两个有序链表 - 力扣(LeetCode) (leetcode-cn.com)将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。创建结构体变量,用来接收比较完的节点,从头比较两个单链表,小的放在创建的结构体变量后面;相当于尾插,知道一方到尾,再把剩下的一方链到尾节点,返回首节点;注意细节:1.要再定义两个结构体变量,记录排好的链表首节点,另一个记录链表的尾节点,以便于尾插;2.检查给的两个链表是否有空;3.可以建立一个哨...

2021-10-22 17:17:40 307 1

原创 数据结构如何计算复杂度

在学习具体的数据结构和算法之前,每一位初学者都要掌握一个技能,即善于运用时间复杂度和空间复杂度来衡量一个算法的运行效率。通过算法所编写出的程序的运行效率。程序的运行效率具体可以从 2 个方面衡量,分别为:程序的运行时间。 程序运行所需内存空间的大小。数据结构中,用时间复杂度来衡量程序运行时间的多少;用空间复杂度来衡量程序运行所需内存空间的大小。时间复杂度判断一个算法所编程序运行时间的多少,并不是将程序编写出来,通过在计算机上运行所消耗的时间来度量。原因很简单,一方面,解决一个问题的算法.

2021-10-10 21:44:17 1570

原创 无线传感器网络笔记

一无线传感器网络简介短距离无线通信特点:通信距离短,覆盖距离一般为10~200m。无线发射器的发射功率较低,发射功率一般小于100mW。工作频率多为免付费、免申请的全球通用的工业、科学、医疗频段。 短距离无线通信技术的概念:指集信息采集、信息传输、信息处理于一体的综合型智能信息系统,并且其传输距离限制在一个较短的范围内。 低成本、低功耗和对等通信是短距离无线通信技术的三个重要特征和优势。 常见的无线通信技术有IrDA技术、蓝牙技术、WIFI技术、RFID技术、UWB技术、Zigbee技术。 以.

2021-10-03 15:00:01 13197 4

原创 程序是如何执行的

大体上分为三步:编译——>链接——>运行具体如下:预编译: 1.头文件的包含; 2.用空格替换注释; 3.宏定义的替换;(预编译做的都是文本操作)编译:把C语言代码翻译成汇编代码;(中间会有1.语法分析,2.词法分析,3.语义分析,4.符号汇总)汇编:把汇编代码转化成二进制指令(形成符号表,形成.obj文件)链接:1.合并段表 2.符号表的合并和重定向(将目标代码跟函数库相连...

2021-09-29 22:19:17 289 2

原创 C语言文件操作

为什么使用文件使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。什么是文件 ,文件种类磁盘上的文件是文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境 后缀为.exe)。数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文 件,或者输出内容的文件。文件名一个文件要

2021-09-29 16:38:49 1703 13

原创 动态内存开辟——柔性数组

C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。例如:typedef struct st_type{ int i; int a[0];//柔性数组成员}type_a;有些编译器会报错无法编译可以改成:typedef struct st_type{ int i; int a[];//柔性数组成员}type_a;柔性数组的特点结构中的柔性数组成员前面必须至少一个其他成员。sizeof 返回的这种结构大小不包括柔性数组的内存。

2021-09-27 17:08:43 235 1

原创 C语言——动态内存管理(malloc、calloc、realloc、free)

对于空间的需求,变量,数组都能够解决。但是,有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。这时候就只能试试动态存开辟了。在c语言中给出了3个动态内存开辟的函数:malloc、calloc、realloc;函数详解:malloc声明void *malloc(size_t size)参数size-- 内存块的大小,以字节为单位。返回值该函数返回一个指针 ,指向已分配大小的内存。如果请求...

2021-09-24 18:41:20 183

原创 c语言进阶结构体,枚举,联合体

结构体匿名结构体类型:struct{ int a; char b; float c;}x;struct{ int a; char b; float c;}a[20], *p;p=&x;//思考结合上面代码,这种写法合法吗?会警告!编译器会把上面两个声明当成完全不同的两个类型。所以是非法的。结构的自引用注意格式://1.struct Node{ int data; struct Node* next;};//2.t

2021-09-22 18:22:16 170

原创 内存操作函数的实现(C语言)

memcpy——内存复制C 库函数void *memcpy(void *str1, const void *str2, size_t n)从存储区str2复制n个字节到存储区str1。C 库函数 – memcpy() | 菜鸟教程 (runoob.com)功能实现:void* my_memcpy(void* dest, const void* src, size_t count){ void* ret = dest; assert(dest && src...

2021-09-20 17:03:16 142 2

原创 自个实现的字符串函数(用C语言)strlen,strcmp,strcpy,strcat,strstr;

一、strlen计算字符串长度函数;C 库函数size_t strlen(const char *str)计算字符串str的长度,直到空结束字符,但不包括空结束字符。C 库函数 – strlen() | 菜鸟教程 (runoob.com)手写:(三种方法)//1.普通计数法int my_strlen(const char * str){ int count = 0; while(*str) { count++; str++; } return count;}...

2021-09-16 23:34:46 245 4

原创 C语言解决 Z字形变换(力扣第6题)

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行Z 字形排列。比如输入字符串为 "PAYPALISHIRING"行数为 3 时,排列如下:之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。上面的图不容易观察画成下面这样的就明显多了:解决思路:先用一个二维数组来接收原数组变形后的,题中给出了二维数组的行,要自己计算二维数组的列;最后开辟一个目标数组,从二维数组头依次向目标数组赋值;解题...

2021-09-14 00:05:55 490 1

原创 力扣刷题中最不想看到的!(力扣报错)

有些时候总感觉自己逻辑是对的,但总有一些oj过不了。个别特殊情况没有考虑到;还有一些语法问题,一下报错可以对照一下;1.超了内存2.访问数组越界3.初始化有误4.递归基线错误或语法不对5.整形越界整理不足,有知道的继续补充;...

2021-09-11 23:55:27 774 9

原创 数组与指针题目的细节(一)

题目一:int main(){ int a[4] = { 1, 2, 3, 4 }; int* ptr1 = (int*)(&a + 1); int* ptr2 = (int*)((int)a + 1); printf("%x,%x\n", ptr1[-1], *ptr2); return 0;}解析:&a+1:&a是取出整个数组地址,&a+1是跳过整个数组;(int*)(&a + 1):再强制转化成整形指针,指向数组最后;(

2021-09-07 22:09:05 135 6

原创 C语言实现接雨水问题

描述给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。输入:[3,1,2,5,2,4]返回值:5说明:数组 [3,1,2,5,2,4] 表示柱子高度图,在这种情况下,可以接 5个单位的雨水,蓝色的为雨水接雨水问题_牛客题霸_牛客网 (nowcoder.com)解释:设置两个水量,一个临时水量,一个最终水量;两个下标啊a,b,a指向开始出不动,b指向开始出加一往右移动;b下标对应的值如果比a下标对应.

2021-09-04 21:54:20 1283 3

原创 qsort函数用法以及如何自己实现

声明下面是 qsort() 函数的声明。void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))参数base-- 指向要排序的数组的第一个元素的指针。 nitems-- 由 base 指向的数组中元素的个数。 size-- 数组中每个元素的大小,以字节为单位。 compar-- 用来比较两个元素的函数。返回值该函数不返回任何值。举例如下:...

2021-09-02 00:42:40 315 8

原创 在原来空间基础上删除数组中某一个数字

例如:int arr[] = { 1, 3, 2, 3, 3, 4, 5, 3 }; 想在数组arr空间上直接修改可以设两个临时变量来充当数组下标;总结:开始时单步scr,des同时向右移,当scr遇到目标数字时,des停下为了接受scr遇到下一个不为目标数字的数字,当 scr走到数组尽头时,结束。此时函数返回的是des(去掉目标数字后,数组的长度);代码如下:#include <stdio.h>int remove(int *nums, int numssize...

2021-08-26 13:08:37 129 2

原创 关于unsigned char的取反操作

怎样才能正确进行 unsignedchar取反操作?int main(){ unsigned char a=0xA5; int b=~a>>5; printf("%d\n",b);}错误思路:将0xA5写入内存中的形式为:原码:00000000 00000000 00000000 10100101因为是正数,所以原码,反码,补码相等;unsignedchar占一个字节,即8bit,a- 10100101按照常规来说,将a取反为:01...

2021-08-23 01:27:45 2299 1

原创 汉诺塔——递归法

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。汉诺游戏规则如下:1、有三根相邻的柱子,标号为A,B,C。2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。3、现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小

2021-08-22 20:04:06 5258 2

原创 关于数组指针传参设计的总结

开始学的时候对于数组,指针,函数的一些细节问题不是那么明白,整理了一下;指针数组顾名思义指针数组是个数组,是存放指针的数组;例如:int *arr[5] 指针数组arr是有5个元素,每个元素是int*; 同理 char *arr[5]指针数组arr是有5个元素,每个元素是char*;数组指针数组指针是指向数组的指针。例如:int (*arr)[5] 意思是arr指针指向一个数组,该数组含有5个元素,每个元素都是int, char*(*per)[5]意思是per指针...

2021-08-16 18:23:50 512 4

原创 C语言实现小游戏——扫雷

C语言编写的有点粗糙,模拟的功能基本齐全,看见不足,还请赐教!1.建立一个可以持续玩下去的框架int main(){ int input; srand((unsigned)time(NULL)); do { printf("******** 1.paay 2.exit **********\n");//菜单 scanf("%d", &input); switch (input) { case 1: game(); break; case

2021-08-15 00:28:08 570 1

原创 实现三子棋

规则:3*3的棋盘,不管行、列、斜着,哪方先下成一样的,就判赢,都没有下成判平局;下面用程序来实现人与电脑下棋:先建立大体框架,然后再补充内容void meau(){ printf("**************************\n"); printf("***** 1.game 0.exit ******\n"); printf("**************************\n");}int main(){ srand((unsigned int)tim..

2021-08-13 21:33:02 778 1

原创 函数递归总结

1.直接或者间接调用自身的一种方法; 通常把一个大型复杂的问题层层转化为一个与原问题相似规模的问题来求救。2.递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算(减少程序的代码量)注意:递归要有两个要素,结束条件与递推关系,只有不断靠近结束条件才能正常使用递归。如果没有这两个要素,程序将一直跑,直到栈溢出;例题:打印一个数的每一位。比如输入:123 打印:1 2 3#include <stdio.h>void print(int a){...

2021-08-13 00:10:42 269 2

原创 浮点数的存储规则

整形在内存中是以二进制补码形式存储的,浮点数呢?浮点数先化成 (-1)^S * M * 2^E 这种形式 ,比如:5.5将转换好的二进制小数,用科学计数法表示,5.5可以写为:1.011*2^2套入上面公式:S 表示符号位,正数为0,负数为1;S=0 , M=1.011 ,E=2 ;单精度浮点类型占四个字节(32bit),双精度浮点类型占八个字节(64bit)如下图分布:注意:E加上中间值要用二进制表示;M再取出时一定要加上前面去掉的1.取出浮点数时:E全为0时...

2021-08-09 17:42:38 424

原创 程序员的内功修炼——函数栈帧的创建与销毁

每个函数都是在栈上创建,同时在执行程序之后被自动销毁。在执行程序调用该函数的过程中,由两个寄存器 esp , ebp来存放该函数地址(一个是该函数的最高位的地址,一个是该函数最低位的地址),这两个地址是用来维护函数在栈上开辟的空间(该空间又称为函数栈帧)。程序总是从main函数开始,但其实main函数也是被其他函数调用;#include <stdio.h>int Add(int x, int y){ int z = 0; z = x + y; return z;}

2021-08-08 20:07:47 221

原创 全局变量的隐藏知识

你以为下面代码的结果是什么:#include <stdio.h>int i;int main(){ i--; if (i > sizeof(i)) { printf(">\n"); } else { printf("<\n"); } return 0; }C语言中,0为假,非0即为真。注意:全局变量,没有给初始值时,编译其会默认将其初始化为0。这点和局部变量是不

2021-08-05 15:19:55 238

原创 笔试怎样能拿到高分

在多人面试的环境下,你一定要在面试官眼中留下深刻影响,这样你才能有更大的机会成功!就像很多人都会的题目一定要答的流利完美,没有丝毫漏洞,只有这样才能有更多的机会。自己实现strcpy函数,这个题目大家很定都很熟悉void my_strcpy(char* dest, char* src){ while (*src != '\0') { *dest = *src; *dest++; *src++; } *dest == *src;}上面这段代码是可以运行出来,但在面试官眼.

2021-08-04 15:47:09 137

原创 又一小白开始了编程之路

之前在剧上看到的那些搞计算机的都特别牛逼,感觉他们特别厉害,也由衷佩服他们我感觉这个行业特别难,我也想拼一拼;其实我也想像那些大神那样酷,能装一装,哈哈哈!我死磕代码,每天8小时以上,不信征服不了他,加油既然来了,就互相促进,一块进步大神们,你们在远处不用等我,我马上追到你们...

2021-08-03 09:43:25 81 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除