自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 环形链表问题(详细)

环形链表是链表的一种,特点是尾结点不指向NULL而是指向自身的任意一个结点,最后一个结点指向自己的也算。遍历环形链表会死循环。现在我们通过难度循序渐进的两道题来深入了解一下环形链表相关的问题。(采用C语言解答)题目来源:leetcode。

2024-07-19 11:30:54 868 7

原创 轮转数组(时间复杂度不同的三种思路)

最开始i=0时,3%7,结果为3,所以新数组下标为3的地方放入了1。直到i为4时,7%7的结果为0,也就是将下标为4,即5放到新数组下标为0的位置。循环内完成两件事,保存最后一个数据,将其他数据整体向后移动1位,将最后一个数据放到最前面的位置。因为numsSize、k都为变量,都可看做N,而外循环执行k次,内循环执行N次左右,所以时间复杂度为O(N²)。但是空间复杂度也是O(N),我们申请了新的大小为N的数组空间。我们可以先看看给的参数是些什么,第一个是给的数组,第二个是数组长度,第三个是要轮转的次数。

2024-07-12 16:54:29 979 3

原创 复杂度(下卷)

在上卷中我们知道了什么是复杂度,也通过几个案例初步了解了时间复杂度的计算方式,那么在下卷中我们继续来了解时间复杂度的计算和空间复杂度。

2024-07-12 13:42:05 703

原创 复杂度(上卷)

在正式进入今天的主题之前,我们不妨先来回顾一下初步学习数据结构后必须知道的概念。🎶数据结构数据结构是计算机存储、组织数据的方式,指相互间存在一种或多种特定关系的数据元素的集合。(没有一种单一的数据结构能够满足所有用途,因此我们需要学习各种不同的数据结构。如:线性表、树、图、哈希等。

2024-07-11 20:06:19 731 2

原创 单链表(上)

首先还是要分成三个文件,一个头文件SList.h,一个源文件SList.c,这两个文件来定义链表的结构以及方法的声明和定义,还有一个用来测试的源文件test.c。int data;//存储数据//指向下一个结点的指针List表示的是链表,S表示的是single,单链表,Node是结点。这里定义的指针,我们是要指向下一个结点,所以这个指针的数据类型是。但是我们在顺序表中就已经知道,为了让顺序表或者链表能够存储多种类型的数据,我们在定义时最好将当前使用的数据类型重命名;

2024-07-07 14:37:23 851 1

原创 【C语言】顺序表经典算法

本文介绍的是两道顺序表经典算法题目。移除元素(来源:LeetCode)

2024-07-03 22:33:06 337 1

原创 线性表与顺序存储结构(下)

接上文(线性表与顺序存储结构(上))。这些顺序存储结构的方法在顺序表上下卷中已经提到过,但是有些许不同,可以为理解顺序表提供更丰富的视角。(不过最主要的区别在于顺序表上下卷中的顺序表是动态开辟的而这里底层的是定长数组。

2024-06-30 14:57:21 374 1

原创 算法入门(上)

具体来说就是用最少的存储空间,花最少的时间,解决同样的问题,这就是好的算法。尽管算法不唯一,相对好的算法还是存在的,解决一个问题的方法有优劣之分。这四层是一个循序渐进的关系,层次1的要求是最低的,仅仅没有语法错误,谈不上是好算法。这是比较好理解的特性,算法具有零个或多个输入,至少有一个或多个输出(算法是一定有输出的),输出的形式可以是打印输出,也可以是返回一个或多个值等。算式中的问题是千奇百怪的,所以算法也是千变万化的。指的是算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。

2024-06-30 14:55:20 459 1

原创 线性表与顺序存储结构(上)

线性表:零个或多个数据元素的有限序列。线性表是数据结构中最常用和最简单的一种结构。本文介绍的是线性表和线性表的顺序存储结构的部分内容。顺序表的两种物理结构的其中一种——顺序存储结构:线性表的顺序存储结构指的是用一段地址连续的存储单元依次存储线性表的数据元素。

2024-06-29 11:12:13 519 1

原创 通讯录项目的实现(基于顺序表)

建议先看顺序表(上卷)、顺序表(下卷),再来看本篇。

2024-06-28 19:25:00 710 1

原创 【C语言】顺序表(下卷)

本文继续讲顺序表上卷未讲完的相关内容。在下一篇文章中,将讲解顺序表的应用(通讯录)。其实本质上就是对一个数组进行增删查改操作。至此顺序表的实现方法已讲完。在指定位置之前插入数据。

2024-06-23 15:48:28 322 1

原创 【C语言】顺序表(上卷)

数据结构是由“数据”和“结构”两词组合而来的。数据需要管理。数据结构就是计算机存储、组织数据的方式。比如一个班级就是一个结构,管理的就是班级里的学生。如果我们要找三年2班的同学李华,就可以直接去三年2班找而不用大海捞针。数组。有了数组后我们就可以通过下标,对指定的数据进行修改等操作。

2024-06-21 16:01:09 828 5

原创 【C语言】位运算符

C语言中给我们提供了6个位运算符,包括2个移位运算符和其他4个位运算符(按位取反、按位与、按位异或,以及按位或)。它们可以用于对整数数据进行位运算,现在就让我们来了解一下吧!移位运算符移位运算符可以将位向左或向右移动,改变整数的二进制表示。'<<'是左移操作符,'>>'是右移操作符,操作数可以是任意的整数类型(包括char类型)。i<<j的值是将i中的位左移j位得到的结果。每次从i的最左端溢出一位,然后在最右端补一个0。i>>j的值是将i中的位右移j位后的结果。

2024-06-17 15:50:57 464 1

原创 【C语言】预处理详解(下卷)

紧随上文。其中-s,-t是命令行参数。传的参数不同,效果也不同。许多C的编译器提供了一种能力,允许在命令行中定义符号,用于启动编译过程。如,当我们根据同一个源文件要编译出一个程序的不同版本时,这个特点有些用处。(假如某个程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大些,我们需要一个数组能够大写。for(i = 0;i< SZ;for(i = 0;i< SZ;i ++)

2024-06-11 11:16:14 1484 2

原创 【C语言】预处理详解(中卷)

预处理完整系列推荐阅读顺序:预处理详解(上卷)——宏(上卷)——宏(下卷)——预处理详解(中卷)——预处理详解(下卷)本文接着讲预处理相关的内容。

2024-06-10 17:21:29 831 1

原创 【C语言】宏详解(下卷)

紧接上卷,我们继续来了解宏。使用宏还是函数的抉择:如果实现的逻辑比较简单不容易出错,可以考虑使用宏。至此,宏的讲解就结束了,祝阅读愉快^_^

2024-06-10 11:09:44 765 4

原创 【C语言】宏详解(上卷)

紧接着预处理详解(上卷),接下来我们来讲宏(隶属于预处理详解系列)。#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。所以,宏其实是有参数的,这是与我们之前的#define定义常量很不同的一点。宏的声明方式parameter-list是一个由逗号隔开的符号表,它们可能出现在stuff中。与函数不同的地方在于,宏的参数是没有类型的。宏运行把参数列表里的东西替换到内容(stuff)里。

2024-06-09 16:04:51 1089 1

原创 【C语言】动态内存经典笔试题(下卷)

如果说动态内存是C语言给我们的一个工具,那么只有掌握了工具的特点我们才能更好地使用。紧随上卷,我们再来看看动态内存另外两道经典的笔试题。【C语言】动态内存经典笔试题(上卷)-CSDN博客另外,如果光看想不出来的话,别忘了你还可以画图。

2024-06-09 11:13:19 635 5

原创 【C语言】预处理详解(上卷)

预处理也是C语言中非常重要的存在。那么就详细地来了解一下吧。C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的。1 __FILE__ //进行编译的源文件2 __LINE__ //文件当前的行号3 __DATE__ //文件被编译的日期4 __TIME__ //文件被编译的时间。

2024-06-08 14:47:29 693 2

原创 【C语言】动态内存经典笔试题(上卷)

本系列将详细讲解4道有关动态内存的经典笔试题,以助于加深对动态内存的理解。这些题目都非常经典,你可能随时会遇到它们,所以非常重要。本文讲解其中的前两题。

2024-06-08 10:47:48 1054 7

原创 【C语言】编译和链接

编译和链接的内容非常复杂深奥,这里只是笼统的讲解。

2024-06-07 10:55:27 854 4

原创 【C语言】文件操作(终卷)

我们在上一卷中了解了顺序读写的函数,现在就让我们从随机读写的函数开始吧。就是想在哪个位置读或写都行,比较自由。文件打开时光标默认在起始位置。想从后面的某个部分读或写,就得让文件指针来到那个位置:fseek函数这个函数就能根据文件指针的位置和偏移量来定位文件指针(文件内容的光标,不是指FILE*类型的文件指针)。这个函数有3个参数,第一个是文件指针,第二个是偏移量,第三个指的是起始位置。毕竟,要给出从哪开始,偏移量是多少,才能随机读写。注意,offsetof可以为负数。最后一个。

2024-06-06 11:01:29 594 3

原创 【C语言】文件操作(下卷)

在上一卷中,我们知道了文件指针、文件的打开和关闭(打开其他位置的文件)、文件的顺序读写(其中的fputc()、fgetc()),这一卷中,将继续讲解文件操作未讲到的地方。内容有点多,写不完的部分再开一个文件操作(终卷)。之前我们讲过的fputc与fgetc是一个一个字符地从文件中读或写入文件,那么我们现在来看看fgets和fputs:fputs函数前一个参数是一个字符指针,指向一个字符串。第二个参数是文件指针,关联到一个文件。返回类型是int。功能:往流上写一个字符串。

2024-06-05 19:58:01 1345 2

原创 【C语言】字符串左旋(三种方法)

(方法3只给出思路参考)

2024-06-03 11:07:32 1183 4

原创 【C语言】字符串逆序

(来源:牛客网)将一个字符串str的内容颠倒过来,并输出。数据范围输入描述:输入一个字符串,可以有空格输出描述:输出逆序的字符串示例1输入输出示例2输入nowcoder输出redocwon。

2024-06-02 19:11:26 566 3

原创 【C语言】文件操作(中卷)

在文件操作(上卷)中,讲到的主要都是正式文件操作开始之前的前置知识,而这一卷中,我们将开始正式地操作文件。在上卷中我们已经说到,stdin stdout stderr是三个C语言程序启动时默认打开的流。这三个流的类型是:FILE*,通常称为文件指针。而C语言,就是通过FILE*的文件指针来维护流的各种操作的。fgetc也就是读字符。fputc是写字符。fgets是读字符串,fputs是写字符串。文本行就是多个字符的意思。fscanf和fprintf是格式化输入和输出。

2024-06-02 11:21:43 1292 2

原创 【C语言】文件操作(上卷)

为什么要使用文件呢?你是否发现,我们写的程序,退出后再次运行,是记不住上次程序的数据的。这是因为我们写的程序是存储在电脑的内存中的,如果程序退出,内存回收,所以数据就丢失了。如果想要将数据进行持久化的保存,我们可以使用文件。想想我们电脑上的这些文件,PPT之类的,我们写好后再次打开依然是在的。包括我们写好的代码,也在电脑的文件夹里放着。这是因为这些文件是放在电脑的硬盘上的。硬盘上的数据除非自己修改,否则是不会丢的。下次打开程序还是在硬盘上拿到我们的数据。

2024-06-01 16:33:57 955

原创 【C语言】柔性数组

你是否听说过柔性数组呢?如果没有的话,就一起了解一下吧。(没有malloc free calloc realloc 四个函数的前置知识的朋友最好先阅读一下我的“动态内存管理”一文,因为下面会涉及到。C99中,结构中的最后一个元素允许是位置大小的数组,这就叫“柔性数组”成员。int i;int a[0];//柔性数组成员int i;int a[];//柔性数组成员有的编译器支持前一种写法,有的则支持后一种,vs则是两种写法都可以。由此,我们可以看出柔性数组的定义。1.在结构体中。

2024-06-01 11:09:08 811 4

原创 【C语言】常见的动态内存的错误

在动态内存函数的使用过程中我们可能会遇到一些错误,这里将常见的错误进行总结。对NULL解引用请看以下代码:可以看到,这时我们的malloc开辟是失败的,所以返回的是空指针NULL,而我们却没有进行检查,而是直接对其解引用,最终想要打印这块内存的内容,也是失败的。这里的下波浪线是vs给出的没有进行检查的警告,即使malloc申请的空间没有那么大可以成功申请,最终也能正常打印,这个警告依然会存在。总之,就是不要忘记检查返回值是否为NULL。对动态开辟空间的越界访问。

2024-05-31 14:19:27 405 5

原创 【C语言】动态内存管理

为什么要有动态内存分配?可以回想一下目前为止,我们想要向内存申请一块空间存放数据,有哪些手段呢?目前我们遇到的方式主要有两种一、创建一个变量。比如我们存放一个整型数据,就创建一个整型变量。(也就是申请4个字节)我们创建一个变量,存放了一个数据。二、如果我们要存放多个数据呢?这就是我们的数组,连续存储一组相同类型数据。比如下面这里申请了4个整型,也就是16个字节的空间。但是,这两种存储方式是有缺陷的:我们能否将n的4个字节空间扩大到10个字节、将arr的16个字节扩大到40个字节?

2024-05-31 12:18:09 1454 4

原创 【C语言】结构体与内存对齐

在本篇博客,我将介绍结构体类型,结构体变量的创建和初始化,重点介绍结构中存在的内存对齐。

2024-05-30 16:42:19 1137 2

原创 【C语言】atoi函数的使用及模拟实现

atoi (ascii to integer),是把参数 str 所指向的字符串转换为一个整数(int类型)的库函数。有兴趣的朋友可以听我逐句翻译一下cpluscplus.com里的这段解释(要考六级了练一下):将字符串转换为整型解析C-字符串str,将它的所含物解释为一个整数,将这个整数作为int类型的值返回。这个函数首先丢弃必要数量的空白字符(像isspace),直到第一个非空白字符被找到。然后,从这个字符开始,接受一个可选的初始正号或负号,后面跟着尽可能多的十进制数字,并将它们解释为数字值。这个字符串

2024-05-29 10:59:50 1159

原创 【C语言】大小端字节序存储

/十六进制数那么,因为数据在内存中的存储以字节为单位,这个十六进制数的四个字节内放的应该就是11 22 33 44(因为1个十六进制位可以转换为4个二进制位,而8个二进制位也就是2个十六进制位刚好为一个字节),可能会有以下两种存放方式:我们把上面这一种叫做大端字节序存储,下面的叫小端字节序存储。可以通俗地理解为,正着存的是大端,倒着存的是小端。用语言描述低位字节存放在高地址处,高位字节存放在低地址处,叫大端字节序存储;低位字节存放在低地址处,高位字节存放在高地址处,叫小端字节序存储。

2024-05-27 11:05:01 1300

原创 【C语言】八进制、十六进制

在我们日常生活中使用的数往往是十进制的,而当我们学习C语言后我们会接触到许多不同的进制并且时常需要去思考与使用这些不同的进制(尤其是2的幂相关的进制,因为这种计数系统比十进制更接近于计算机的二进制系统),所以学习和掌握这些不同进制是非常重要的。本文将对八进制和十六进制(8和16都为2的幂)进行一些讲解。通常情况C语言都假定整型常量是十进制的数,但在表达与计算机相关的值时,八进制和十六进制却十分方便。

2024-05-26 15:03:20 1548 3

原创 【C语言】指针作为参数(传值调用vs传址调用)

在前面讲了那些指针相关的内容后,是时候探讨一下指针有什么作用了。在C语言中,指针有多种各不相同的应用,在本篇文章中,我们探讨一下指针作为函数参数的作用(对比传值与传址两种不同函数调用方式)。传址调用,可以让函数和主调函数之间建立真正的联系,在函数中可以修改主调函数中的变量。所以我们可以知道,当我们只是需要主调函数中的变量值来实现计算,可以采用传值调用。举个例子:而如果需要修改主调函数中的变量的值,就需要传址调用了。到此,本文就结束了,希望大家阅读愉快^_^

2024-05-26 11:00:06 681 3

原创 【C语言】整型提升与char取值范围

C语言中整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。为了获得这个精度,表达式中字符、短整型操作数在使用前被转换为普通整型。而这个过程是悄悄发生的。整型提升的意义:表达式的整型运算要在CPU的相应运算器件内执行,CPU整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使是进行两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU难以直接实现两个8bit字节的直接加法运算。

2024-05-25 19:43:25 358 6

原创 【C语言】指针运算

前面在“走进指针世界”中我已经讲解过指针相关的很多前置知识,其实还有一个很重要的部分就是指针的运算。这篇博客,就让我们一起了解一下指针的运算吧!指针作为变量,是可以进行算术运算的,只不过情况会和整型变量、浮点型变量有所不同,比较特殊。当指针指向一个数组时,C语言是允许对指针进行算术运算的,往往是加法或减法,这给我们提供了一种数组下标以外的对数组进行处理的方式。

2024-05-25 14:04:02 1033 6

原创 【C语言】冒泡排序详解

排序,就是将一组数据按特定的规则调换位置,使这组数据具有某种顺序关系,一般就是递增或递减。在接触C语言不久,我们就会遇到其中一种有名的排序算法——“冒泡排序”,不知道你是否已经掌握了,如果还没有的话,不妨听一下我的讲解版本,或许能有一点启发。记住,理解冒泡排序非常重要的一点是,你要知道这个名字“冒泡”并不是随便乱取的,通过画图你可以看到它的过程真的就像在“冒泡”,可以抓住这个形象的过程去理解。当然冒泡可以向左冒,也可以向右冒。

2024-05-25 11:51:32 1325 2

原创 【C语言】sizeof运算符 讲解与例题

sizeof运算符允许程序获取存储指定类型的值所需要的内存空间。表达式sizeof(类型名)的值是一个无符号整数,代表的是存储属于该类型的值所需要的字节数。如,sizeof(char)的值为1。但其实对于其他许多类型我们无法得到一个确切的值而是取决于具体实现。如在32位的机器上,sizeof(int)的值为4。注意,sizeof是一种特殊的运算符,因为编译器本身就能确定sizeof表达式的值。当然,除了类型之外,sizeof也可以用来求常量、变量和表达式的字节数。

2024-05-24 12:26:45 1059

原创 【C语言】strstr函数的使用和模拟

今天给大家带来一个字符串函数,strstr()的使用介绍和模拟实现。模拟实现这个函数,可以帮助我们更深刻地理解这个函数的功能和提高解决字符串相关问题的能力,有兴趣的话就请往下看吧。函数功能:strstr函数的功能是在字符串中找另一个字符串有无出现,或者说就是找一个子字符串。如果能找到,就返回第一次出现的地址,如果找不到就返回空指针。函数原型:或char* strtstr(char* str1,const char* str2);

2024-05-23 16:07:37 1445 1

空空如也

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

TA关注的人

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