自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构(十一)---约瑟夫环

题目:罗马人占领乔塔帕特后,犹太人与 Josephus 及他的朋友躲到一个洞中,族人决定宁愿死 也不要被敌人找到,于是决定了一个自杀方式,所有人排成一个圆圈,由第 1 个人开始报数, 每报数到第 3 人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。printf("幸存者1:%d\t幸存者2:%d\n", p->number, p->next->number);//新节点指向头节点形成循环。​ 现在假设有n个人形成一个==单向循环链表==,==求最后剩余的两个节点。

2025-04-30 09:45:00 240

原创 数据结构(十)---链式队列

/新节点作为队尾,next置空。* 出队(维护队头指针)---释放队头节点,然后将下一个节点作为新的队头节点。* 出队(维护队头指针)---释放队头节点,然后将下一个节点作为新的队头节点。//释放原队头节点内存。* @return 成功返回结构体指针q,否则返回NULL。* @return 队列为空返回1,否则返回0。* @return 队列为空返回1,否则返回0。* @return 成功返回0,否则返回-1。* @return 成功返回0,否则返回-1。* @return 成功返回0,否则返回-1。

2025-04-29 11:15:00 248

原创 数据结构(八)---循环队列

/队列为空的时候,队头下标==队尾下标==0。//如果不执行这一行代码,则q->data是空悬指针。//数据指针(存储元素的数组)3. 队满条件:(rear+1)%size == front。* @param size 队列的容量(数组的大小)* @param size 队列的容量(数组的大小)==队列是一种逻辑结构,是特殊的线性表==。

2025-04-28 09:30:00 1541

原创 数据结构(七)---链式栈

/更新栈顶指针为新节点。* @param s 栈结构体指针(需由调用者提前分配内存)* @param s 栈结构体指针(需由调用者提前分配内存)* @param s 栈结构体指针(需由调用者提前分配内存)* @param s 栈结构体指针(需由调用者提前分配内存)* @param s 栈结构体指针(需由调用者提前分配内存)* @param s 栈结构体指针(需由调用者提前分配内存)* @param s 栈结构体指针(需由调用者提前分配内存)* @param s 栈结构体指针(需由调用者提前分配内存)

2025-04-27 14:09:10 669

原创 数据结构(六)-顺序栈

由于只能在固定端操作,栈有以下特定术语:栈顶(Top):允许插入和删除的一端栈底(Bottom):固定不变的另一端入栈/压栈(Push):将元素插入栈顶出栈/弹栈(Pop):删除栈顶元素取栈顶(Top/Peek):获取但不删除栈顶元素。

2025-04-25 12:30:00 907

原创 数据结构(五)-双向循环链表

优点插入删除快:在已知位置时时间复杂度为O(1)可以双向遍历:前驱后继都能访问内存动态分配:无需预先申请空间循环特性:可以从任意节点开始遍历整个链表缺点查找慢:必须遍历,时间复杂度为O(n)占用内存多:比单链表多存一个指针实现稍复杂:要维护两个方向的指针和循环特性适用场景适合:需要频繁增删数据、需要双向操作(如撤销/重做)、需要循环遍历的场景不适合:需要快速查找、内存紧张的情况(注:相比单链表,双向循环链表用更多内存换取了双向操作和循环遍历的便利性)

2025-04-24 12:45:00 812

原创 数据结构(四)-双向链表

优点双向遍历:可以从头到尾或从尾到头遍历链表,灵活性高。删除操作高效:在已知节点指针时,删除节点的时间复杂度为 O(1)(无需遍历前驱节点)插入操作灵活:可在给定节点前或后快速插入新节点。支持反向操作:适用于需要逆向操作的场景(如撤销功能)缺点内存占用高;每个节点需存储前驱和后继指针,空间开销比单链表大操作复杂度略高:插入和删除需维护两个指针,代码实现稍复杂。缓存不友好:节点分散存储,可能引发缓存命中率下降。对比单链表单链表:节省空间,但删除/插入需遍历前驱节点(O(n) 时间)双向链表。

2025-04-23 16:30:00 1263

原创 数据结构(三)-单向循环链表

优点动态内存:无需预分配固定大小,适合数据量不确定的场景。高效操作头插/头删:O(1)时间复杂度尾插:O(1)(维护尾指针时)或O(n)中间插入:O(1)(定位后)循环特性:适合周期性访问场景(如:轮询调度、循环缓冲区)内存效率:按需分配,无扩容浪费随机访问:必须遍历,时间复杂度O(n)存储开销:每个节点需额外存储指针循环陷阱:未正确处理终止条件会导致死循环缓存不友好:节点内存不连续,访问速度低于数组。边界处理:需特殊处理头尾节点的指针更新。

2025-04-22 08:59:40 695

原创 数据结构(二)---单链表

链式存储中,所有节点的存储位置是随机的,他们之间的逻辑关系用指针来确定,跟物理存储位置 无关,因此从上述示例代码可以很清楚看到,增删数据都非常迅速,不需要移动任何数据。另外, 又由于位置与逻辑关系无关,因此也无法直接访问某一个指定的节点,只能从头到尾按遍历的方式 一个个找到想要的节点。简单讲,链式存储的优缺点跟顺序存储几乎是相对的。优点:插入、删除时只需要调整几个指针,无需移动任何数据当数据节点数量较多时,无需一整片较大的连续内存空间,可以灵活利用离散的内存。

2025-04-17 17:30:00 920

原创 数据结构(一)---顺序表

顺序存储中,由于逻辑关系是用物理位置来表达的,因此从上述示例代码可以很清楚看到,增删数 据都非常困难,需要成片地移动数据。顺序表对数据节点的增删操作是很不友好的。优点:不需要多余的信息来记录数据间的关系,存储密度高所有数据顺序存储在一片连续的内存中,支持立即访问任意一个随机数据,比如上述顺序表中 第i个节点是s->data[i](访问快)缺点:插入、删除时需要保持数据的物理位置反映其逻辑关系,一般需要成片移动数据(增删慢)当数据节点数量较多时,需要一整片较大的连续内存空间(需要提前确定大小)

2025-04-16 10:30:00 814

原创 数据结构(三)---单向循环链表

优点动态内存:无需预分配固定大小,适合数据量不确定的场景。高效操作头插/头删:O(1)时间复杂度尾插:O(1)(维护尾指针时)或O(n)中间插入:O(1)(定位后)循环特性:适合周期性访问场景(如:轮询调度、循环缓冲区)内存效率:按需分配,无扩容浪费随机访问:必须遍历,时间复杂度O(n)存储开销:每个节点需额外存储指针循环陷阱:未正确处理终止条件会导致死循环缓存不友好:节点内存不连续,访问速度低于数组。边界处理:需特殊处理头尾节点的指针更新。

2025-04-15 16:43:40 608

原创 C语言基础(十八)---预处理、库文件

预处理就是在源文件(.c文件)编译之前,所进行的一部分预备操作,这部分操作是由预处理程序自动完成的。当源文件在编译时,编译器会自动调用预处理程序来完成预处理操作,预处理执行解析完成才能进入下一步的编译过程查看预处理结果:gcc 源文件 -E -o 程序名[.后缀] //程序名[.后缀]---可以指定输出文件名,程序名由用户自定义,后缀可选(如i,txt或无后缀)不带参数的定义语法:#define 宏名称 常量数据宏定义的预处理机制:此时的预处理只做数据替换,不做类型检查。

2025-04-15 16:34:09 496

原创 C语言基础(十七)---内存管理

每个C语言进程都拥有一片结构相同的虚拟内存,所谓的虚拟内存,就是从实际物理内存映射出来 的地址规范范围,最重要的特征是所有的虚拟内存布局都是相同的,极大地方便内核管理不同的进 程。虚拟内存中,内核区段对于应用程序而言是禁闭的,它们用于存放操作系统的关键性代码,另外由 于 Linux 系统的历史性原因,在虚拟内存的最底端 0x0 ~ 0x08048000 之间也有一段禁闭的区段, 该区段也是不可访问的。这些不同的 内容,所存储的内存区域是不同的,且不同的区域有不同的特性。// 将刚申请的堆内存清零。

2025-04-07 09:06:59 451

原创 C语言基础(十六)---内存操作

要实现动态内存分配,需要使用标准C库提供的库函数,我们所说的动态内存分配,其实就是在堆区申请内存(此时的内存回收需要由程序员自身来维护)//给p对应的内存空间,填充sizeof(int)个字节的0。//使用完毕一定要释放(向系统发送了一个释放内存的信号,内存是系统释放的)//malloc申请的内存空间默认填充的是随机值,需要我们对其清零。//内存使用完毕,释放(内存释放并不会改变p的指向)//创建一个指针,接收在内存分配后返回的结果。

2025-04-07 09:05:22 637

原创 C语言基础(十五)---常量指针与指针常量

类型语法指向可变指向的数据可变常量指针√×指针常量×√常量指针常量××void表示“无类型”,用于函数返回值或参数//一般简写为void func();意思是无返回值无参数。

2025-04-04 09:00:00 744

原创 C语言基础(十四)---二级指针、野指针、空指针

二级指针(多重指针)用于存储一级指针的地址,需要两次解引用才能访问原始数据。其他多级指针的用法类似,但实际开发中二级指针最为常见int a = 10;//a是普通变量//一级指针(存储变量a的地址) //*p解引用到a的值//二级指针(存储指针p的地址) //**q解引用到a的值//三级指针(存储指针q的地址) //***k解引用到a的值二级指针与指针数组等效,可简化指针数组的遍历操作二维数组名是数组指针类型(int (*)[3]),与二级指针(int **)类型不兼容。

2025-04-03 08:58:56 862

原创 C语言基础(十三)---函数指针与指针函数

函数指针本质上是指针,它是函数的指针(定义了一个指针变量,变量中存储了函数的地址)。函数都有一个入口地址,所谓指向函数的指针,就是指向函数的入口地址。这里函数名代表入口地址函数指针存在的意义:让函数多了一种调用方式函数指针可以作为形参,可以形式调用(回调函数)语法:返回值类型 (*变量名)(形参列表);举例:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

2025-04-01 09:00:00 1153

原创 C语言基础(十二)---字符指针

实参与形参都可以是字符数组//开发时能用指针的地方一般都不用数组实参用字符数组,形参用字符指针//开发时能用指针的地方一般都不用数组不管是字符数组还是字符指针传递的都是首地址实参和形参都是字符指针变量(在函数内部不能对字符串中的字符做修改)/**在函数内部不能对字符串中的字符做修改,否则报段错误*///可以修改字符指针的指向//开发时能用指针的地方一般都不用数组实参是指针类型,形参是字符数组(在函数内部不能对字符串中的字符做修改)

2025-03-31 09:07:27 514

原创 C语言基础(十一)---数组指针与指针数组

概念:数组指针是指向整个数组的指针,本质上还是指针(地址)特点:先有数组,后有指针它指向的是一个完整的数组概念:指针数组是一个数组,数组中的每一个元素都是一个指针特点:先有指针,后有数组指针数组的本质是一个数组,只是数组中的元素类型是指针语法:数据类型 *数组名[容量];案例://定义三个变量​//定义指针数组,指针数组是用来存储指针的//int是abc的类型//指针数组里的元素不要直接用,因为是地址,如果要使用的话要先解引用​//获取数组大小。

2025-03-30 16:23:25 892

原创 C语言基础(十)---指针基础

语法:数据类型 *变量列表;举例:int a;//普通变量,拥有真实的数据存储空间​int *a, *b;//指针变量,无法存储数据,只能存储其他变量的地址指针变量的值只能是8/12位的十六进制整数。注意:虽然定义指针变量*a,是在变量名前加上,但是实际变量名依然为a,而不是*a使用指针变量间接访问内存数据时,指针变量必须要明确的指向。(指向:指针变量存放谁的地址就指向谁)

2025-03-30 16:22:20 573

原创 C语言基础(九)---字符数组

在C语言中,支持字符串常量,不支持字符串变量。如果想要实现类似的变量字符串,C语言提供了2种实现方式:字符数组char name[] = "田柾国";字符指针char *name = "哪吒";

2025-03-24 08:59:04 773

原创 C语言基础(八)---二维数组

二维数组本质上是一个行列式组合,也就是说二维数组由行和列两部分组成。属于多维数组。二维数组数据通过行列进行解读二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个特殊的一维数组,只不过它的元素是一维数组(数组的元素的类型可以是数组类型)

2025-03-21 10:25:03 552

原创 C语言经典例题---冒泡排序

/等价于sizeof(a) / sizeof(int)不推荐,因为在二维数组的情况下不适用。每次排序假定第一个元素是最大或者最小的,用第一个元素后面的元素一一与第一个元素进行比较,遇到较大或者较小的和第一个元素交换,访问完数组的最后一个元素,就排好了一个数。案例涉及的每一轮中数列的排序次数,计算规则:次数 = 元素个数-轮数-1,可以通过一个内层for循环实现每一轮的遍历。引入一个临时变量temp,将a的值赋值给temp,int temp = a,a = b,b = temp。//输出冒泡排序后的数组。

2025-03-20 09:12:34 357

原创 C语言基础(七)---一维数组

数组是相同类型,有序数据的集合。语法:数据类型 数组名[数组容量]注意:数据类型又被称作类型说明符,数组容量又被称作数组元素个数或者数组的长度说明:数组的数据类型由数组中的元素来决定。也就是说同一个数组中,所有元素的类型都是一致的数组名也是标识符,我们所说的数组(名),可以理解为数据类型是数组的变量(名)命名规则与变量名相同,一般是变量名的复数表示,也就是以字母、下划线、数字。数组容量还可以叫做常量表达式,其值必须是整数。关于数组容量的类型:C89标准:只支持常量和符号常量,不支持变量。

2025-03-20 09:12:07 778

原创 C语言基础(六)---循环结构

代码在满足某种条件的前提下,重复执行,就叫做循环结构(重复结构)

2025-03-19 10:03:37 1000

原创 C语言经典例题---水仙花数

printf("%d不是水仙花数\n", num);printf("%d是水仙花数\n", num);printf("请重新输入\n");定义:一个n位数满足:各位数字的n次方之和等于该数本身。printf("请输入一个整数:\n");//比较n次方和与数字是否相同。//计算各位数字的n次方之和。需求:判断并输出所有3位水仙花数。//判断num的位数n。需求:判断任意数是否为水仙花数。

2025-03-16 13:00:54 336

原创 C语言基础(五)---分支结构

在C语言中,用1(非0)表示关系表达式的值为真(条件成立),0表示关系表达式的值为假(条件不成立),即关系表达式的值要么为1(条件成立),要么为0(条件不成立)注意:实际上,逻辑运算符两侧的运算对象不但可以是0和1,或者是0和非0,而且也可以是字符型、 实型和指针型等。条件判断你的结果是逻辑值(布尔类型值,也就是说分支语句条件可以使用关系表达式和逻辑表达式),在程序中可用0和1表示真假:1-真、0-假。若表达式值为真(非0),则执行表达式后面的语句,执行完该语句后继续执行if语句后的其他语句。

2025-03-16 13:00:04 805

原创 C语言基础(四)---流程控制

广义上,为解决一个问题而采取的方法和有限的步骤,就称为算法C程序是以函数为基础单位的一个函数的执行部分是由若干条语句构成的C语句都是用来完成一定的操作任务C语句必须依赖于函数存在当用于输入整型数据的格式说明符中没有宽度说明时,则在具体输入数据时分为以下两种情况:如果各格式说明符之间没有其它字符,则在输入数据时,两个数据之间用"空格"、或"Tab"、 或"回车"来分隔。如果各格式说明符之间包含其它字符,则在输入数据时,应输入与 这些字符相同的字符作为间隔例如,设有如下说明int a, b;

2025-03-15 19:05:04 451

原创 C语言基础(三)---运算符

不管是++i还是i++,运算数i自身都增1;同理不管是--i还是i--,运算数自身都减1。它们的不同之处在于赋值给整体的顺序。注意:增1与减1运算符只适用于整型变量和字符型变量,而不能用于其他类型的变量。增1与减1运算符不能用于常量或表达式。--5(i + j) ++都是非法的。

2025-03-14 09:08:35 487

原创 C语言基础(二)---变量、基本数据类型、运算符

同类型说明语句定义的变量只是说明了为这些变量分配了内存空间,以便于存放与之相同类型的数据,在未对这些变量赋值之前,这些变量中的值是随机的(具体的随机值由内存状态决定)//以上代码的意思是:将一个int类型的12赋值给long类型的变量a,此时在赋值的时候,编译系统会自动将常量12的类型转换为long型的12并赋值给a。一个类型说明语句可以同时定义多个类型的变量,各个变量之间使用逗号分隔,各个变量之间用逗号分隔,多个同类型的变量也可以用多个同类型说明语句定义。

2025-03-12 23:47:35 784

原创 C语言基础(一)

数据类型即固定大小内存的别名,并且描述了1个变量存放什么类型的数据。简单来说,就是组织和操作数据。数据:计算机要处理的数据(数字、字符串、文字、符号、图片、音频视频等)数据类型不仅帮助我们组织和操作数据,还决定了程序如何有效的利用内存了解数据类型的内存需求是理解计算机管理和操作数据的关键程序运行需要运行在内存中。

2025-03-08 17:28:43 746

原创 Linux基础(六)

如果我们想要访问这个外设(存储外设),我们就需要访问/dev 下对应的映射文件(设备文件),或这个根据文件系统将外设挂载到我们指定的挂载点,这样我们 就可以正常访问这个外设。sudo mount -t ext4 /dev/sda1 /mnt //以ext4文件系统类型挂载/dev/sda1文件,将其挂载到/mnt。sudo mount /dev/sda1 /mnt/udisk //挂载/dev/sda1文件系统到/mnt/udisk目录下。可以使用这些显示指出资源使用量。

2025-03-07 09:04:37 493

原创 Linux基础(五)

和windows的网段不一样,是由虚拟网卡分配网段和IP,并且能够与windows一样可以连接到互 联网。: 如果拷贝的是整行粘贴在当前行下,如果拷贝的是字符粘贴在当前光标之后(配套。: 如果拷贝的是整行粘贴在当前行上,如果拷贝的是字符粘贴在当前光标之前(配套。: 显示文件名,当前的行号,文件的总行数和文件位置的百分比(末行模式下),从第3行拷贝到第14行然后粘贴到第2行的下一行(末行模式下): 移动光标到当前行的行尾(列尾),一般可以使用。: 移动光标到当前行的行首(列头)(命令模式)

2025-03-05 11:48:54 903

原创 Linux基础(四)

本质上我们用Linux自带的编辑器叫做vi编辑器(类似于Windows的记事本,我们一般用来做文件的编辑),名字取自visual,它是一个全屏幕文本编辑器(程序)。在Linux系统种vi是最常用的编辑程序,它的文本编辑功能十分强大,但是使用起来比较复杂。vim是vi的增强版,所以vi的功能vim都有,而且vim新增了vi没有的功能,它比vi更容易使用。这个工具不是Linux内置,需要额外的安装。

2025-03-03 20:05:41 551

原创 Linux基础(三)

gzip -r chapter01 //压缩chapter01文件夹(chapter01包含demo01.c),压缩后的名称默认为:chapter01/demo01.c.gz,demo01.c源文件不保留。bzip2 -kf demo01.c demo02.c //批量覆盖式压缩多个文件,压缩后的名称为:demo01.c.bz2和demo02.c.bz2,针对每个文件单独压缩。//压缩后源文件(demo01.c文件)不保留。

2025-03-03 13:57:25 871

原创 Linux基础(二)

sudo useradd -d /home/peter -mg lucy peter //创建了一个用户peter,并在家目录下为其分配一个同名目录peter,同时将peter用户添加到已有的lucy组。sudo useradd -d /home/lucy -m lucy //创建一个用户lucy,并在家目录下为其分配一个同名目录(同时会默认创建一个跟用户同名的组:lucy)方式2:[sudo] cat /etc/gshadow //无GID。

2025-03-02 12:59:37 546

原创 Linux基础(一)

文件系统(了解)目录操作(掌握)文件操作(掌握)

2025-02-27 15:05:35 526 1

空空如也

空空如也

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

TA关注的人

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