数据结构(2)

内存泄漏:内存泄漏(Memory Leak)是指程序在运行过程中动态分配了内存,但在不再需要这些内存时未能释放,导致这部分内存无法被再次利用。内存泄漏是一个常见的编程错误,尤其在使用手动内存管理的语言(如 C 和 C++)时更为常见。内存泄漏的原因内存泄漏通常由以下原因造成:1. 忘记释放内存:分配了内存后没有通过相应的函数(如 free 或 delete)释放。

  1. 多次分配同一内存:多次分配内存但只释放了一次。

  2. 指针丢失:分配了内存后,指向这块内存的指针丢失了,导致无法释放。

  3. 循环引用:在某些语言中(如 C++),对象之间相互引用导致无法释放.。

  4. 静态存储分配:静态分配的内存没有被显式释放。

内存泄漏的影响内存泄漏会导致以下问题:1. 性能下降:随着内存泄漏的积累,可用内存减少,程序运行速度变慢。2. 系统不稳定:严重的内存泄漏可能导致系统资源耗尽,甚至崩溃。3. 长时间运行问题:对于长时间运行的服务程序,内存泄漏可能导致系统逐渐失去响应能力(valgrind检查内存泄漏)

链表创建,头插,判空:

链表尾插,打印:

链表头删,尾删,关键字查找:

链表节点修改和链表回收:

快慢指针法:快慢指针法(Fast and Slow Pointer Technique),也称为"龟兔赛跑算法",是一种常用的算法技巧,常用于链表相关的问题中。这种方法通过设置两个指针,一个快指针(通常每次移动两步)和一个慢指针(通常每次移动一步),来解决各种链表问题,如检测环、寻找环的入口点、查找中间节点等。

快慢指针法的基本思想1. 快指针:每次移动两步。2. 慢指针:每次移动一步。3. 相遇:如果链表中有环,则快指针最终会追上慢指针。4. 环的入口点:如果快慢指针相遇,则可以找到环的入口点。5. 链表中间节点:如果链表中没有环,则快指针到达链表末尾时,慢指针恰好位于链表的中间位置。

应用场景1. 检测环•问题:判断链表中是否存在环。•解决方案:使用快慢指针,如果快指针追上了慢指针,则存在环。2. 寻找环的入口点•问题:如果链表中存在环,找到环的入口点。•解决方案:当快慢指针第一次相遇时,将其中一个指针重置到头节点,然后两个指针每次各移动一步,再次相遇时的节点即为环的入口点。3. 查找中间节点•问题:找到链表的中间节点。•解决方案:使用快慢指针,当快指针到达链表末尾时,慢指针正好位于中间位置。

(1)寻找中间节点:

(2) 寻找倒数第k个节点

链表逆序:

链表插入排序:

在其他结构体中声明结构体类型指针原因:指针大小固定,自动会开出指针类型大小空间,不能是变量,因为大小不固定,结构体可以直接赋值

在 C 语言或 C++ 中,一个结构体(struct)可以声明为包含自身作为成员,这被称为递归结构体或自引用结构体(self-referential struct)。这种结构体允许定义指向同一结构体类型的指针成员,从而可以方便地创建链表或其他递归数据结构。实际上,这样做并不会直接导致编译错误,因为标准允许这样的定义,只要后续使用时遵循一定的规则。为什么不会出错?1. 延迟解析(Deferred Parsing):•在 C 语言中,结构体声明可以出现在其他声明之前,这意味着编译器可以先看到结构体的名称,然后再看到其完整的定义。•当一个结构体声明包含指向自身的指针时,编译器可以先处理指针类型,然后在完整定义出现后再处理结构体的其他部分。2. 前向声明(Forward Declaration):•结构体可以先进行前向声明,然后再给出完整的定义。前向声明告诉编译器结构体的存在,但没有给出其完整的布局。例子前向声明 + 完整定义// 前向声明

gcc *.c

相关推荐
Doro再努力4 小时前
Vim 快速上手实操手册:从入门到生产环境实战
linux·编辑器·vim
Doro再努力5 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
学嵌入式的小杨同学1 天前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
Hello World . .1 天前
Linux:软件编程
linux·运维·服务器·vim
学嵌入式的小杨同学2 天前
【嵌入式 GUI 实战】LVGL+MP3 播放器:从环境搭建到图形界面开发全指南
linux·c语言·开发语言·vscode·vim·音频·ux
学嵌入式的小杨同学2 天前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由
linux·c语言·开发语言·前端·vscode·ci/cd·vim
阡陌..3 天前
Linux下的vi和vim使用方法
linux·运维·vim
学嵌入式的小杨同学3 天前
【Linux 封神之路】进程进阶实战:fork/vfork/exec 函数族 + 作业实现(含僵尸进程解决方案)
linux·开发语言·vscode·嵌入式硬件·vim·软件工程·ux
天远数科3 天前
天远车辆过户查询API集成指南:Node.js 全栈视角下的二手车数据挖掘
大数据·数据挖掘·node.js·vim
Hello World . .3 天前
排序算法:常用排序算法
c语言·数据结构·算法·vim·排序算法