1.队列的概念及结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列遵循先进先出FIFO(First In First Out) ,与栈的后进先出相反。入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头2.队列的实现队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低,对于队列的实
1.1栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。想要理解栈,可以把栈想象成一个杯子,把数据放进去,最先进去的数据就被放到了杯子的最下面,而后放入的数据就放在了杯子的上面。所以要想将数据取出来只能先去上面的数据。这也是栈的特点:先
力扣链接思路一:遍历链表,将链表结点复制下来,控制随机指针,去找对应的第几个(相对位置)进行链接.思路二:以时间换空间,创建两个指针数组,分别存放两个链表中结点的地址,直接可以在指针数组中找到结点该方法比上面的方法更优,但是时间复杂度依旧很高,但是还是达不到O(N)思路三:1.拷贝结点链接在原结点后面将每个原结点复制,将复制后得到的结点分别链接到原结点的后面//1.插入拷贝结点在原结点的后面
力扣链接思路一:快慢指针法一个指针从相遇点走,一个指针从起始点走,会在入口点相遇.最终代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode *detectCycle(struct
力扣链接思路:先求出两个链表的长度差长链表先走差距步同时走,第一个地址相同的是交点代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode *getIntersectionNode(
牛客链接思路:找中间结点从中间结点开始对后半段进行逆置比较前半段和后半段相等是,不相等不是只需将我们前面写过的链表中间结点,逆置链表的代码复用,并加上如下代码即可最终代码:/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} };*/ clas
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。牛客链接 最简单思路因为头插必然改变顺序,所以使用尾插大于的尾插到一个链表小于的尾插到一个链表然后链接起来使用哨兵位的头结点,防止太多问题的产生/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), nex
力扣链接依次比较,取小的尾插:初步代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* mergeTwoLists(struct ListNode* list1, stru
力扣链接方法一:经典的双指针问题,这里为了方便采用三指针/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head)
力扣链接方法一:使用前后两个指针,cur指向当前位置,prev指向前一个位置,通过改变指向和释放结点来删除val初步代码,还存在问题:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListN
牛客链接使用快慢指针法:两种思路:1.fast先向后走k-1次,slow再向后走1次,然后fast和slow同时向后走,当fast走到最后一个结点时,slow刚好在倒数第k个位置上;2.fast先向后走k次,slow再向后走1次,然后fast和slow同时向后走,当fast走到最后一个结点的后面时(此时为NULL),slow刚好在倒数第k个位置上;根据这个思路,我们可以写出初始代码如下:/**
力扣链接一般我们想到的会是 先遍历一次知道链表结点的个数后再除二,然后再遍历一次进行查找,但是这种做法需要遍历两次链表,消耗比较大,但是使用了快慢指针法就相对简单了,只需遍历一次.快慢指针法:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *n
数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。 数据结构是为算法服务的,算法是要作用在特定的数据结构上的。@TOC一、算法的复杂度算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。
本章重点:程序的翻译环境程序的执行环境详解:C语言程序的编译+链接预定义符号介绍预处理指令#define宏和函数的对比预处理操作符#和##的介绍命令定义预处理指令#include预处理指令#undef条件编译@[toc]1.程序的翻译环境和执行环境在ANSI C的任何一种实现中,存在两个不同的环境。第1种是**翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境**,它用于实际
上一篇我们介绍了顺序读写 那么,如何根据自己的需要进行指定位置的读写呢?5.文件的随机读写5.1 fseekfseek根据文件指针的位置和偏移量来定位文件指针。int fseek ( FILE * stream, long int offset, int origin );origin起始offset偏移量创建文件,并在文件中写入以下内容示例:int main() { FILE* pf = fo
本章重点 :为什么使用文件什么是文件文件的打开和关闭文件的顺序读写文件的随机读写文本文件和二进制文件文件读取结束的判定文件缓冲区因内容比较多,为方便大家吸收,这一篇只介绍1,2,3,4的内容,剩下内容将放到【C】语言文件操作 (二)中介绍@[toc]1.为什么使用文件使用文件可以将数据直接存放在电脑的硬盘上,使数据持久化。例如通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时
@TOC柔性数组也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。例如:struct { int n; float s; int arr[];//柔性数组成员//是结构体的成员变量,但是是数组 }; int main() { return 0; }有些编译器会报错无法
【C】动态内存管理@[toc] 本章重点为什么存在动态内存分配动态内存函数的介绍 mallocfreecallocrealloc常见的动态内存错误几个经典的笔试题1.为什么存在动态内存分配我们已经掌握的内存开辟方式有:#include<stdio.h> int main() { int num = 10;//向内存申请了4个字节的空间 int arr[10];//向内存申请了40个
前一章我们介绍了结构体,这一章我们来介绍一下内容:结构体实现位段(位段的填充&可移植性)枚举 枚举类型的定义枚举的优点枚举的使用联合 联合类型的定义联合的特点联合大小的计算1. 位段结构体学完我们就得拥有结构体实现位段的能力。1.1 什么是位段位段的声明和结构是类似的,有两个不同:1.位段的成员必须是int、unsigned int 或signed int。 2.位段的成员名后边有一个冒号
:see_no_evil:个人主页: 对de起日子 :point_right:系列专栏:【C语言--大佬之路】 :balloon:今日心语:用最少的浪费面对现在。@TOC前言:我们知道c语言有很多内置类型如下,而对于复杂地事物,这些类型是无法进行描述的,所以c语言引入了自定义类型,让我们根据所需来设置类型:继内存操作函数,本章来介绍 自定义类型之 结构体 本章重点结构体 结构体类型的声明结构的自
?今日心语:你所看到的惊艳,都曾被平庸所历练。前言:继【数据结构基础】顺序表 ,我们来介绍链表的相关内容。 @[Toc](目录:)1、链表 顺序表(数组)的缺陷及思考缺陷:中间/头部插入删除,需要移动的元素很多,浪费算力,时间复杂度为O(N),扩容需要申请新空间(尤其是异地扩容)可能会有空间的浪费,拷贝数据,释放旧空间。会有不小的消耗。增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量
?今日心语:你所看到的惊艳,都曾被平庸所历练。 前言:在解题过程中一定要画图进行思考,然后再敲代码。移除元素初学数据结构顺序表,要求时间复杂度为O(N),空间复杂度为O(1):力扣oj链接题目要求:题目分析:思路1:查找一个删除一个,与顺序表中查找的思路一样。时间复杂度:O(N2),最坏的情况是数据基本都与val相等,删除一个的时间复杂度为O(N),删除N个为O(N2)。思路2:提供一个临时数
?今日心语:你所看到的惊艳,都曾被平庸所历练。 前言:适合学习了数据结构顺序表后做,此题虽然简单,但是必须结合画图进行分析,同时要仔细阅读题目。[TOC]删除有序数组中的重复项:题目要求:题目分析:本质是一个去重算法,适用于有序数组最终代码:int removeDuplicates(int* nums, int numsSize) { int src = 0; int dst
?系列专栏:【C语言–大佬之路】 ?今日心语:你所看到的惊艳,都曾被平庸所历练。 ?个人主页:阿伟@t前言:适合学习了数据结构顺序表后做,此题虽然简单,但是必须结合画图进行分析,同时要仔细阅读题目。。[TOC]题目要求:题目分析:思路:但是题目中并没有让我们合并到新数组中,而是要求合并到nums1中,题目中已经将空间开好思路2:采用三指针,i1和i2从后往前进行比较,例如开始时:i1指向nums
前言:继【时间复杂度和空间复杂】度之后,本章我们来介绍数据结构中的顺序表和链表,若觉得文章不错,希望支持一下博主?,如果发现有问题也欢迎❀大家在评论区指正。1.线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不
【数据结构基础】时间复杂度和空间复杂度算法的时间复杂度和空间复杂度【本节目标】1.算法效率2.时间复杂度3.空间复杂度4.常见时间复杂度以及复杂度oj练习数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。数据结构是为算法服务的,算法是要作用再特定的数据结构上的。算法的复杂度算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时
继字符函数与字符串函数(下)本章来介绍一组内存操作函数,内容如下:内存操作函数 mon- memory记忆即内存 memcpy memmove memset memcmp 这些函数头文件都是#include<string.h>, 与前两篇内容中的函数有所区别也有相似之处,对比学习最好, 下面是前两篇内容的链接: 【C】字符函数和字符串函数(上) 【C】字符函数和字符串
这章主要来介绍以下库函数字符串查找 strstr strtok错误信息报告 strerror字符操作1、 strstrstrstr在一个字符串中另外一个字符串是否存在, 若存在:返回字符串的第一个出现的字符串的首地址 若不存在:返回NULL 示例:#include <stdio.h> //strstr在一个字符串中另外一个字符串是否存在, //若存在:返回字符串的第一个出现的字符串的首
@TOC 前言 : 重点介绍处理字符和字符串的库函数的使用和注意事项求字符串长度 strlen长度不受限制的字符串函数 strcpy strcat strcmp长度受限制的字符串函数介绍 strncpy strncat strncmp注意: C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的, 字符串通常放在常量字符串中或者字符数组中。 字符串常量适用于那些对它不做修改
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号