自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于类和对象

类是从C语言结构体的基础上发展而来的。class是定义类的关键字,后面接类的名字,然后在接一对 {} ,注意要在 } 的后面接一个分号(class可以被struct替换)。class A//...在类体中可以存在变量和函数,类的内容称为类的成员,类中的变量称为类的属性或成员变量,类中的函数称为类的方法或成员函数(类里定义的函数默认是inline)。在定义成员变量时建议加一个特殊标识,我一般在变量前加_。这么做是为了方便认出成员变量。//没加特殊标志class A。

2024-07-20 10:12:49 662

原创 初识C++

现在有一个项目分配给两个人让他们实现。他们写的都没问题但是它们一合并就出现了命名冲突的问题。在C++里就可以避免此问题的发生。C++提出了命名空间这是对标识符的名称进行本地化,以避免命名冲突。定义命名空间需要用到namespace关键字,后面接命名空间的名字,然后接一对{}即可。int a = 1;int b = 2;命名空间里面不止可以定义变量也可以定义函数和类型,注意一个命名空间就定义了一个新的作用域,命名空间里的所有内容只限于该命名空间中。

2024-07-11 10:55:25 810

原创 排序——归并排序

所以有解决这道题就要用比较快的排序,考虑到该题的特殊性用归并排序解决是最合理的。在排序时不能在原数组上进行排序,解决这个问题其实只需要开辟一个与原数组大小一样的空间,在排完一个后把该数据存入开辟的数组中,当这次序排完后把数据拷贝到原数组中即可。将已有序的子序列合并,得到完全有序的序列。上面的代码就只能对2的倍数进行排序如果不是就无法排序,下面的图片是对一个只有10个数据的序列下标访问情况。,先让一个序列不断对半拆分(递推),拆到只有一个数据的序列时(递推结束条件),开始回归排序(回归)。

2024-07-06 17:56:03 383

原创 排序——快速排序

基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后左右子序列重复该过程,直到所有元素都排列在相应位置上为止。最后的一两层里面包含的数据并不是很多,所以我们可以写一个判断,到特定的范围内用插入排序的方式来排序(这里我写的是当数据量小于10时),这样它的深度会变小很多。先让end走遇到比基准值小的停下来,然后让begin走遇到比基准值大的停下来,之后让它们交换位置。快速排序的非递归实现是基于栈实现的。

2024-06-18 21:34:31 923

原创 排序——希尔排序

当序列越有顺序时,插入排序的时间效率就越高。时间复杂度:O(N^2)(虽然时间复杂度是N^2,那是在逆序的序列情况下,在现实中这种情况一般不会出现)空间复杂度:O(1)gap>1:预排序,目的是让序列变得更有序。时间复杂度:O(N^1.3)空间复杂度:O(1)

2024-06-16 18:27:54 711

原创 二叉树的链式结构实现

该篇是在的基础上的。该篇会有点抽象大家要自己多画画图自己感受一下。现在我们开始吧!在学习二叉树基本操作时,我们需要先有一个现成的二叉树。来方便我们练习。因为现在我们对二叉树的理解也并不是很深入。在这里创建一个树是方便让我们理解。等我们学的差不多的时候,我们来真正的创建二叉树。下图是我创建二叉树的结构。在二叉树的介绍及堆这篇文章中的二叉树概念可以发现二叉树定义是递归式的,因此下面操作中基本都是按照该概念实现的。

2024-06-03 16:10:47 811

原创 二叉树介绍及堆

找到它的两孩子中小的那个,在让这个小的孩子与它进行比较如果孩子大于它则退出,如果小于则交换位置,重复上述操作直至循环结束或跳出循环。先建一个K个数据的小堆,然后让后面的N-K个数据跟该小堆的根结点进行比较,如果大于则进行交换,然后向下调整。先建一个大堆,然后让第一个结点的数据与最后一个结点交换,拿出最后的那个结点,然后再让根结点向下调整。大家应该注意到了哈,这次建堆的方式有点不一样,这是先找到树的最后一个根结点(画四角星的是树的最后一个根结点)4. 若规定根结点的层数为1,具有n个结点的满二叉树的深度,

2024-05-29 18:07:51 753 1

原创 时间复杂度

我们在这里就是将算法中的基本操作的执行次数,认为是算法的时间复杂度。大家可能注意到了底数为什么不写2,实际上2是最常见的可以不写,但如果是其它底数就要写。解释:假设某个算法的执行次数是F(N)=N^2+N。因为只保留最高项所以把N给删掉,即时间复杂度为O(N^2)。O(1) < O(logN) < O(N) < O(N^2) < O(2^N)(越往右越低)。解释:假设某个算法的执行次数是F(N)=2N。时间复杂度是用大O的渐进表示法来表示(大O符号:是用于描述函数渐进行为的数学符号)。

2024-05-27 11:24:26 558

原创 线性表—栈的实现

创建一个栈,只让左括号入栈,让右括号与栈里的数据匹配。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。如果top是0,就要后置了。一般来说top应该也是0,这里是-1是为了确保top是栈顶数据的。然后返回下标top对应的数据即可。将arr置为空指针,top置为-1,capacity置为0。然后只要让top--即可。如果top=-1则返回true,否则返回false。以下的内容如果你对顺序表的实现熟悉的话就很简单。栈顶和栈底并不是固定的,这是人为决定的。直接返回pst->top==-1即可。

2024-05-14 11:19:52 642

原创 leetcode.环形链表问题

当slow走到环的入口处时,假设fast与slow的距离为N。fast走两步,slow走一步,这时N会变成N-1。只要它们一直走,N一定会等于零,这时候它们相遇,即存在环。第二轮它们的距离是C-1,如果C-1是奇数那它们就永远就遇不到了。设slow走的距离为L ,fast走的距离为L+X*C+C-N(X是fast在环里转的圈数)。所以3L=L+X*C+C-N。分析:2L为偶数,将上面的不存在条件带入会发现该等式并不成立,所以走三步会遇到。快指针走两步慢指针走一步,让它们一起往后走,如果它们相等即存在环。

2024-05-14 11:13:28 401 1

原创 通讯录项目—顺序表实现

下面是通讯录要实现的功能。能够保存用户信息:名字、性别、年龄、电话、地址等。增加用户信息。删除指定用户信息。查找用户信息。修改用户信息。显示用户信息。

2024-05-08 20:33:11 1026

原创 扫雷(升级版)附全代码

上次我写了简单版本的扫雷(建议看一下),但是有些功能并没有实现。在这篇中这些功能都会被实现。

2024-05-04 18:10:35 1100 3

原创 线性表—单链表实现

链表是一种物理存储单元上非连续、非顺序的存储结构,由一系列节点(链表中每一个元素称为节点)组成。单链表是一种链式存取的结构,它由一个个节点组成。节点由两部分组成:数据域和指针域。数据域用于存储数据,指针域用于指向下一个节点的地址。最后一个节点的指针域指向NULL。

2024-05-03 10:51:21 753 1

原创 线性表—顺序表实现

线性表是n个具有相同特性的数据元素的有限序列。线性表在逻辑结构上一定是连续的,但物理结构不一定连续。顺序表是在计算机内存中以数组的形式保存的线性表。

2024-04-25 09:38:02 940 1

原创 动态内存管理

我们之前在申请空间时,都是一些固定空间。如果我们后面想调整空间的大小是办不到的。C语言提供了一些函数可以让我们实现这个操作(头文件<stdlib.h>,空间在堆区开辟)。

2024-04-24 09:26:34 602

原创 简介编译和链接

C语言是一门计算机语言,C语言源代码都是文本文件是无法执行的,中间要经过和才能生成二进制的可执行文件才能执行。

2024-04-13 17:51:26 255 2

原创 关于文件的操作

我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了。如果想要把数据进行持久化的保存,我们可以使用文件。

2024-04-12 15:16:21 1099 2

原创 结构体(struct)

C语言提供了许多内置类型,如:char、int、double等,假设我想描述一本书,这时单一的内置类型是不行的。因为要描述一本书需要作者、定价等。所以C语言为我们提供了结构体这种自定义的数据类型。下面我来介绍一下结构体。

2024-04-05 11:33:52 749 3

原创 整数和浮点数在内存中的存储方式

我们平时会常常用到的整数和浮点数,它们在内存中是怎么存储的呢?在这篇文章中我会给大家介绍一下。

2024-04-01 11:18:29 1006

原创 常用内存函数

函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。函数memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。memmove和memcpy没有什么区别,唯一的区别就是该函数的source和destination的内存是可以重叠的。上次我介绍了一些关于对字符串操作的函数。如果ptr1大于ptr2返回大于0的数,如果ptr1小于ptr2返回小于0的数,等于则返回0。比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。

2024-03-29 10:25:39 404 1

原创 简介指针(3.函数)

就是把函数的地址存到一个数组中,那函数指针的数组如何定义呢?函数指针是指向函数的指针变量。根据前面我讲的内容,不难得出,函数指针变量是来存放函数的地址的。通过上面介绍相信大家一定对指针有了更深的理解,这一篇我主要介绍指针与函数的关系。这其实就是一个回调函数,那啥是回调函数呢?回调函数就是一个通过函数指针调用的函数。指针可不是随便看看就能学会的,一定要多练,只有这样才能学会!从上可以看出函数名就代表函数的地址。

2024-03-26 20:50:46 152

原创 简介指针(2.数组)

我们可以这样理解二维数组,把二维数组中的每一行看成一个一维数组只不过是连在一起的。所以二维数组中数组名表示的就是第一行的地址,是一维数组的地址。在传参时传递的是第一行的地址。原来,在sizeof中数组名代表的是整个数组,另外&+数组名也可以代表整个数组。大家会认为以上代码打印出来是多少,既然arr是首元素的地址,那打印的不就是4/8其中一个吗?通过上面代码可以发现arr地址和&arr[0]是一样的,那么我们可以推断出数组名就是数组首元素的地址。指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?

2024-03-26 20:50:32 195

原创 简介指针(1.基础)

如果机器是32位,也就是相当有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做一个地址,那么一个地址就是32个bit位,需要4个字节才能存储。可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以用来接受任意类型地址。p1和p2都指向a的地址所以是一样的,p1指向的是int类型,int类型有4个字节所以加1跳过4个字节。一般 void* 类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果。

2024-03-26 20:50:17 514

原创 常用字符串函数

str中它包含了0个或者多个由delimiters字符串中一个或者多个分隔符分割的标记,当找到str中的一个标记时,将它用 ‘\0’ 结尾,返回一个指向这个标记的指针。下面我介绍一些关于字符串的常用函数strlen,strcpy,strcat,strcmp,strncpy,strncat,strncmp,strstr,strtok(头文件都是string)(如果str1大于str2则返回大于0的数,小于返回小于0的数,等于返回0)给它一个地址它会一直向后读,直到遇到'\0'停下来,且返回的值是无符号整型。

2024-03-21 10:59:34 433 1

原创 用位操作符.解决经典面试题

先a = a ^ b,在b = a ^ b (b=a(a^b)^b→b=a),然后a = a ^ b (a=a(a^b)^b(a)→a=b)。先求和a = a + b,在b = a - b (b=a(a+b)-b→b=a),在a = a - b (a=a(a+b)-b(a)→a=b)。例:(101)^(100)=(001)。例:(101)|(100)=(101)。(例:a = 1,b = 2→a = 2,b = 1)。例:(101)&(100)=(100)。(例:a = 1,b = 2→c = 3)。

2024-03-02 09:20:06 325 1

原创 面试题..汉诺塔

如果n>1时我们先把上面的n-1个圆盘看成一个圆盘,调Move函数把它移到B柱上,只不过这时目标杆是B柱,中转杆是C柱。这时再次调Move函数把剩下的n-1个圆盘全部移到C柱上只不过这次中转杆是A柱,起始杆是B柱。简单来说就是有三根柱子假设是A柱(起始杆),B柱(中转杆),C柱(目标杆)。目标是把A柱上的所有圆盘移到C柱上。我们可以先假设有两个圆盘,把小圆盘放到B柱再把大圆盘放到C柱,最后把小圆盘放到C柱上就搞定了。再写出圆盘移动的Move函数(A柱作为start,B柱作为temp,C柱作为end)。

2024-02-21 16:37:56 279 1

原创 递归【C语言】

例如1,1,2,3,5,8,13,21,34......规律是从第三项开始包括第三项以后每一项都是前两项的和,开始的1,1是规定我们不能更改。我们首先创建一个Fact函数,然后令n为第几项,当n>=3时,Fact(n)=Fact(n-1)+Fact(n-2)。在运行的时候,它是先计算把Fact(n-1)计算完然后在计算Fact(n-2)。递归的核心思想就是把一个大问题层层转化成一个与原问题相似,但规模比较小的子问题,直到子问题不能在被拆分,这样递归就结束了。这是n的阶乘公式:n!=3*2*1*1(0!

2024-02-01 14:48:54 247 1

原创 扫雷【C语言】

我们要做一个9×9的棋盘,并且要用到两个二维数组一个是明面上的xing一个是暗面上的digital,还有虽然是9×9的棋盘但我们定义11×11的数组(关于为什么这样到后面就知道了)并且要是字符型的。真正的随机数是无法预测的。程序中在调用rand 函数之前先调用srand 函数,通过srand 函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。雷肯定是随机埋的,具体是怎么实现的,我就不在此多说了,如果想看的可以到文章的最后看。大家可以自己试一试。

2024-01-14 11:45:56 965 1

原创 函数【C语言】

在函数使用过程中,把函数的参数分为形参和实参。如果你只定义了一个函数而不去调用,函数里的参数只会形式上存在,不会向内存申请空间,不会真实存在这就是形参。一般来说,一段程序中的代码所用的名字并不是总是有效的,而限定名字有效的区域叫作用域。虽然形参和实参有联系,但他们的地址却不一样,我们可以理解为形参是实参的临时拷贝。4.如果return后的返回值不符合函数的返回值,系统会自动将返回的值隐式转化为函数返回类型。事实上,形参和实参的数组是一个数组。2.形参如果是二维数组,数组行可以不写,但列要写。

2023-12-16 11:40:19 431 2

原创 关于分支与循环

还有,experession一定要是整型表达式,case后一定要是整型常量表达式,case后一定要空格!还有一点,在编写case里内容时,写完记得加一下break,break是跳出switch语句。听着很方便吧,但是,如果使用不当的话就会导致在函数内随意跳转,打乱程序执行流程。真就执行,假就不执行。循环结构我们可以用while,for ,do–while来实现。在if中判断是否相等时,我建议你写成1==a,写成a==1也可以,但,有时我们会忘记写第二个等号。它们分别是while,for,do–while。

2023-12-07 20:29:54 865 2

原创 关于我的介绍

我打算在这四年学会2~3门计算机语言,并且学一下算法和数据结构。对于我来说,我的时间很充裕。在学习上,我会先从基础抓起,毕竟万丈高楼是平地起的。只要基础好的话那就不怕找不到工作。我也会尽量做到每天向我的gitee上传代码。每周的话尽量花费10个小时左右,我认为做什么事一定要有效率,时间其实没那么重要。如果时间太长了话,会消磨意志,反而会产生不好的效果。我打算到大三就去实习,到毕业尽量拿到大厂的offer。大家好,我是一名来自河南对编程充满好奇的大一新生。

2023-12-05 10:28:22 356 1

空空如也

空空如也

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

TA关注的人

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