自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 AVL树的模拟实现

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。我们采用三叉链的方式来实现AVL首先我们定义的AVLTreeNode节点如下所示:template&l

2022-01-06 23:01:27 291

原创 C++中的继承

1、继承的概念:继承是C++三大特性之一,使代码可以复用的重要手段,它允许程序员保持原有类特性的基础上进行扩展,增加功能,这样产生的类,称为派生类,总的来说继承是类间的代码复用。2、继承的语法:继承的语法一般是 :后面要跟继承的方式(public、protect、prviate)以及加上继承的类名如下所示:而继承由有三种方式,而在类间访问限定符也有三种,继承是类外,访问限定符类内,如下所示:我们在学习封装的时候,只是大概知道private、与protect 这两种限定方式基本是一样的,类外都

2021-10-22 16:19:57 210

原创 STL中List的模拟实现

在C++中list底层是由双向队列实现的,其中它的迭代器为了实现出和vector容器的迭代器一样的使用效果(vector的空间是连续的,而list的空间是不连续的),因此对list的迭代器的进行了自定义了一些方法,其中如指针的解引用,迭代器的类中必须重载operator*()、指针的++自定义的是operator++() 返回一个指向下一个节点的指针等等这些对指针的函数重载,实现了和vector容器的迭代器一样的使用方法,list具体实现如下所示: #pragma once#include<as

2021-10-11 22:22:04 127

原创 进程的物理地址空间

一般在Linux下将内存主要划分为已下主要部分,如下图所示,我们知道一个进程的物理空间因该指的是一个进程的活动范围,通过一下代码我i们来观察一下进程中的地址变化。#include<stdio.h> 2 #include<unistd.h> 3 4 int gar_val=100; 5 6 7 int main() 8 { 9 10 pid_t pi=fork(); 11 12 if(pi==0) 13 { 14

2021-08-13 11:31:49 338

原创 数据结构中几种排序算法(1)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。1、直接插入排序是一种简单

2021-08-11 16:16:15 321

原创 Linux中fork函数的初步认识

在Linux中fork函数是创建一个子进程,并且fork函数有两个返回值,并且父进程和子进程的代码共享,但是数据是私有的,各自开辟一份空间来保存数据。如下程序可以看到在fork函数前只是执行了一遍printf函数,而当fork完成了子进程的创建时,父进程和子进程都会执行printf函数。 #include<stdio.h> 2 #include<unistd.h> 3 4 int main() 5 { 6 7 printf("I am Parent

2021-08-10 15:29:37 154

原创 进程管理的初步认识

我们在讲进程的管理时,因该先了解管理的概念,如下图所示管理者有时不会直接和被管理者直接打交道,如我们在学校的时候,和我们经常打交道的是导员,那么校长是怎样在不和我们打交道的同时又是怎样对我们进行管理的呢,是通过导员这个执行者来帮助校长对我们进行管理的,首先导员了解手底下每个学生的信息,然后将学生的信息经行汇总,交付给校长,那么校长是怎样做出决策的呢,答案是数据,如果我们有多门课程不及格时,校长经过校规以及该学生的数据进行判断做出开除的决策的命令给导员那么导员就执行该条命令对该学生进行开除。以上就是管理者完成

2021-08-08 17:59:34 93

原创 “堆“的建立

堆其实是完全二叉树,它的逻辑结构是二叉树的形式,而物理结构在内存中是以数组的形式进行存放的如下图所示。同时下面三个公式是父亲节点与孩子节点的相互关系。堆的实现:如下图所示,我们给一个数组采用向下调整算法对其建小堆,并且向下调整算法是根的左右子树都必须恰都是小堆,才能使用向下调整算法。(建大堆时左右子树都是大堆)向下调整算法的步骤:1、通过父亲节点计算出孩子节点然后比较左右孩子的较小的值2、通过较小孩子与父亲节点比较,如果孩子的值小于父亲的值,则孩子和父亲进行交换,之后将将Parent=Child;

2021-08-06 21:36:03 508

原创 Linux下的基本指令

1、ls指令语法: ls [选项][目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。一般我们使用ls-l 或者ll指令 显示出一些隐藏文件。2、pwd命令语法: pwd功能:显示用户当前所在的目录3、cd指令语法:cd 目录名功能:改变工作目录。将当前工作目录改变到指定的目录下。举例:cd … : 返回上级目录cd /home/litao/linux/ : 绝对路径cd …/day02/ : 相对路径cd ~:进入用户家目

2021-08-05 11:05:00 68

原创 冯诺依曼体系结构与操作系统的初步认识

我们都知道一般电脑的硬件都是按照冯诺依曼体系结构组成的,分为五大部分,输入设备、存储器(内存)、运算器、控制器、输出设备,如下图所示,而这样的组成结构原理是因为如果CPU直接和输入设备交互的话,由于输入设备的速度很慢,而CPU的速度很快,所以根据木桶原理造成了整个系统的速度就很慢了,简单的说就是CPU每次执行完指令后,都要长时间的等待输入设备传送数据,因此为了提高系统的速度,在两者中间加入了内存用来存储数据以及预装数据,就是输入设备每次将数据存进内存中,而CPU只从内存中读取数据,不必要长时间等待外部输入设

2021-08-04 20:40:50 251

原创 Linux下makefile文件编写以及进度条程序的实现

Linux项目自动化构建工具-make/Makefile 其实总的来说make是一条命令而Makefile是一个文件,在讲多文件的make文件编写前我们先将单文件的makefile文件怎么写如下程序所示 1 Mytest:test.o 2 gcc test.o -o Mytest 3 test.o:test.s 4 gcc -c test.s -o test.o 5 test.s:test.i 6 gcc -S test.i -o test.s 7 test.i:t

2021-08-03 18:07:59 208

原创 Linux平台下源程序到可执行程序的详解

我们知道一个源程序到可执行程序,一般要经过预处理,编译,汇编、链接最后生成可执行程序,并且在前面的博客中有了这些步骤分别对应编译器会做什么工作,在Linux平台下我们对这些步骤中,分别对应来测试编译器在不同阶段生成的文件的内容,是否与我们所了解到的一致。1、预处理:预处理功能主要包括宏定义,文件包含,条件编译,去注释等。预处理指令是以#号开头的代码行。实例: gcc –E test.c –o mytest.i选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。选项“-o”是指目标

2021-07-30 17:24:38 427

原创 string类的模拟实现

string的模拟实现当我们在自己实现一个简单的string类时,有时我们可能只有构造和析构函数,而没有实现自己的拷贝构造函数,而编译器自身给我们提供的拷贝构造函数,只能完成值拷贝,及两个对象中的地址公用同一块空间,就会发生同一块内存连续被多次释放,从而出现问题,如下程序所示。namespace SDK{ class string { public: string(const char* s = "") { _str = new char[strlen(s) + 1]; st

2021-07-28 21:17:53 65

原创 函数模板的理解

当我们要写一个不同数据类型的交换函数时,虽然函数重载可以解决这个问题,但是函数仅仅针对不同的类型,代码复用率较低,只要出现新的类型,就要增加新的函数,同时代码的可维护性较低,一个函数重载出错,可能所有的重载均出错。如下是对不同类型的交换函数得到重载。...

2021-06-21 09:18:29 173

原创 C++中动态申请内存的用法

在c++中一般使用new和delete在堆区上进行内存的开辟和释放,而c语言中的malloc和free在c++中也可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此c++提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。同时对于c和c++中的malloc、free与new、delete来说一般申请数据的类型可以分为内置类型与自定义类型。1、内置类型:如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释

2021-06-17 17:18:45 2417

原创 C++构造函数的深入理解

C++构造函数在给对象的成员变量进行赋值时,有两种方法一种构造函数体赋值,另一种初始化列表。 同时对象在经过构造函数体赋值后,虽然会有一个初始值,当这种不能够叫对象成员变量的初始化,是由于在构造函数体中可以多次改变成员变量的值,而初始化是指成员变量只能初始化一次。两者方法如下程序所示。同时构造函数初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。class Date{public: //两个构造函数任选一个 Date(int ye

2021-06-15 09:56:29 193

原创 C++中对于默认成员函数的理解

在一个类中如果我们什么成员函数都不写,那么编译器就会自动生成6个默认成员函数如下图所示当我们在写一个日期类的时候,在使用编译器生成的默认构造函数时,就会发现编译器自动生成的默认构造函数似乎没有用,如下所示。这是由于C++中将数据分成了内置类型和自定类型(class/struct/union自己定义的类型),而编译器生成的默认构造函数不会对内置类型初始化,但是会调用自定一类型的构造函数。class Date1{public: void Print() { cout << _yea

2021-06-10 17:02:36 78

原创 C++类与对象的初步认识

C++类与对象的初步认识C语言与C++的区别前者关注的是过程,后者关注的是对象,一个是分析出求解问题的步骤,另一个是将事前拆分成不同的对象,靠对象之间的交互完成,而在C++中一个对象需要定义一个类来实例化,同时类的定义需要关键字class来来声明,类与对象的关系类实例就比如:现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例变量和方法化出的对象才能实际存储数据,占用物理空间。在类中通常有public 、protect、 privat.

2021-06-05 10:22:06 121

原创 C++怎样实现函数重载

C++怎样实现函数重载C++函数重载是指:C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题,如下程序就是对不同类型的数据的加法函数的重载。#include<iostream>using namespace std;int Add(int x, int y){ return x + y;}double Add(double x, double y){ return x

2021-05-21 16:47:01 2628

原创 插入排序和希维尔排序算法的实现

直接插入排序:当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移如下图所示当我们开始写插入排序时,可能感觉看懂了思想,但是写代码时却有种无从下手的感觉,这时我们不妨将插入排序进行分解首先我们先看成一个数据插入如下代码所示如当前[0,end]区间内的数据有序时将end+1个数据

2021-05-09 20:34:42 109

原创 汉诺塔问题的求解

汉诺塔是指如下图所示,在A轴上有n个物块且每次只能移动一个物块,借助B轴将所有的A轴上的物块放到C轴上,且每次只能将小物块放到大物块上面,不能颠倒次序。当我们采用递归的求解思想,解决这个问题时我们可以将其分解为若干个子问题,如n时我们可以将n-1看作一个整体,让n-1借助C轴全部到B轴上去,之后在将最后一个重A轴移动轴到C轴上去,接下来在将B轴上的n-1个借助C轴移动到A轴上去,之后在将B轴的最后一个移动到C轴上去,如下图所示当n=3,将前两个看成一个整体,借助C轴全部移动到B轴,然后在将3盘移动到C轴,最

2021-04-15 10:47:01 984

原创 C语言程序的编译和链接

C语言中要将我们写的源程序生成可执行程序,一共要经过两个过程,第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码。而在翻译环境中可看做如下图的过程首先源文件经过编译器生成目标文件,目标文件在和链接库一起经过连接器生成可执行程序。在翻译环境中可以看成编译+链接的过程在其中又要经过多个步骤来生成可执行程序如下图所示...

2021-03-26 22:17:52 290

原创 C语言文件操作

在程序设计中,我们将文件分为两种:程序文件、数据文件1、程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。2、数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。在使用文件时首先要遵循以下两个步骤1、创建一个唯一的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+文件后缀 例如 c:\code\test.txt2、文件类型,根据数据

2021-03-23 16:00:56 111

原创 C语言中怎样实现动态内存管理

在学习C语言中,当我们初次遇到在堆区开辟空间变量时,我们可能会提出为什么要专门在堆区开辟变量呢,不是在栈区开辟内存更加容易么?相反在堆区开辟空间时既要malloc,使用完空间后又要free这个空间,以及将开辟空间返回的地址置NULL,如果不这样按照步骤做的话有可能会导致内存泄漏,由此看来使用堆区这么麻烦的事情为什么我们还乐此不疲的使用呢,原因在于在栈区在开辟的变量或者数组的大小是固定的,有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。 这时候就只能试试动态存开辟了

2021-03-15 20:46:42 192

原创 怎样计算结构体的大小

在C语言中有 char、short、int、float、double等内置数据类型,这些数据都有自身的大小,并且可以用来表示一些生活中常见的变量,然而我们要表示一本书的变量时,由于书既有价钱这个变量,又有书名这个变量,由于C语言中没有这种类型的变量,因此我们需要用struct关键字来创造出我们想要的变量。 然而内置类型都有自己变量的大小,那么结构体类型是否也有自身的大小,在学习结构的大小前我们首先学习结构体的对齐原则。1、第一个成员变量在结构体变量偏移量为0的地址处。2、其他成员变量要对齐到某个数字(

2021-03-10 08:53:06 709 1

原创 快速排序的实现

一般我们在对数据进行排序时都采用冒泡排序法,然而冒泡排序算法中在对数据进行遍历一遍时,只能排序一个数据到正确的位置上去,其算法的时间复杂度为o(n^2),该算法的效率比较低,而快速排序算法是在冒泡排序的基础上提出的快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:1、在一组比较的数据中取一个数为基准数。2、通过对基准数与其它数据比较,将大于基准数的数据放到基准数的右边,反之小于基准数的数据放到左边。3、然后在以基准数为界限的两部分数据进行递归,依次使整个数据变成有序序列。其中这

2021-02-27 17:56:16 103

原创 strstr字符函数的模拟实现

C语言中经常要对字符和字符串进行处理,但是在C语言中没有专门的字符类型,一般将字符或者字符函数存储在常量字符串或者字符数组中,字符串常量适合存储那些不修改的字符串函数,我们知道在C语言中最小的一个单位是一个bit,而字符的最小单位是8个bit称为一个字节,因此字符的最小单位为字节。我们同过模拟查找一个字符数组是否是另一个字符数组的子串(strstr)函数来学习字符函数,即字符串str[30]=“abfbfgde”, arr=“bfgde”,若arr是str的子字符串则返回str中bfgde的b的首地址不是怎

2021-02-18 13:17:13 88

原创 数据在内存中的存储

学习C语言至今,已经学习了很多的数据类型了,一般常用的为有符合类型以及无符号类型的数据,一般包括 char、short、int、float、double、long、long long等C语言的内置类型,然而学习了这么多的数据类型,我们可能对数据在内存中是怎样存储的认识是非常的模糊,一般而言在内存中数据的存储方式一般按照补码的方式进行存储,而规定正数的原码与补码相同,负数的原码要经过原码取反,得到反码,在反码加1得到补码,其原因是因为使用补码可以将符号位和数值域统一处理; 同时加法和减法也可以统一处理(CPU

2021-02-08 15:42:19 118

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

C语言实现扫雷小游戏实现的步骤如下:1、首先为了能够简单的实现扫雷游戏,我们采用两个char类型的二维数组来实现,mine数组个用来布置雷的位置信息,show数组用来显某一点周边存在雷的个数,并且在mine数组中使用字符’1’来代表雷,字符’0’代表非雷。2、接着对两个数组分别进行初始化,将mine数组全部初始化为字符’0’,show数组初始化为字符’*’。3、然后需要SetMine函数对mine数组内布置雷的位置信息,以及打印函数DisplayBoard将布置雷的信息在屏幕上显示。4、最后一步是

2021-01-29 19:55:12 91

原创 C语言实现三子棋小游戏

C语言实现三子棋小游戏 今天给大家介绍一下,使用C语言来实现三子棋小游戏的案例。玩法规则就是当玩家和电脑在九宫里,哪一方首先实现了三个子相连则那一方胜出,用*代表玩家下的棋子,#代表电脑下的棋子,接下来介绍一下该游戏的流程。 1、经过菜单选择进入游戏后,首先我们要创建一个3*3的二维数组用来显示玩家和电脑下的棋子。 2、接下来是初始化函数对二维数组进行初始化,使其数组元素为‘ ’空格。 3、然后就是打印棋盘函数,对二维数组中的元素内容进行打印。 4、完成以上准备工作后,然后就是执行一个玩家下一

2021-01-24 23:57:43 266

原创 C++实现单链表的基本功能

## C++实现单链表的基本功能1、 链表是指使用链接的方式存储的线性表,一般一个单链表结点由数据域和指针域两个域组成如图1所示,其中数据域data存放该结点的数据域的值,指针域next存放该结点的后继结点的地址信息。2、单链表的头文件#pragma once#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string.h>struct StuNode//代表学生的节点{ int ID;//学

2021-01-21 01:23:12 258

原创 第一篇博客

第一篇博客大家好,我目前是一位研二的学生,由于以前本科的专业比较靠近机械一类的,对C语言的知识的学习只是课上听过一遍,然后之后就在也没太学过,结果导致自己在研二时,做老师布置的项目时,需要编程时感觉自己无从下手,尤其是对一个新手来说,一开始就要对CCD相机进行SDK开发,来获取CCD相机的图像,之后更是对图像进行处理,来获取一帧图像上光斑的质心,当光斑发生漂移时,需要将漂移量发送给步进电机来调整光斑的位置,使其光斑的中心始终保持在CCD相机的中心位置,天啊真的是无力吐槽了!好不容易费了一个暑假的劲,边看编

2021-01-11 15:53:29 117 1

空空如也

空空如也

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

TA关注的人

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