- 博客(83)
- 收藏
- 关注
原创 Linux虚拟内存映射mmap
Linux虚拟内存基础 摘要:本文介绍了Linux虚拟内存管理机制。首先阐述了分页内存管理的原理,通过虚拟地址和物理地址的映射实现进程独立内存空间。重点分析了虚拟地址转换过程,涉及MMU和多级页表机制。详细讲解了关键数据结构:struct page描述物理页帧,mm_struct管理进程虚拟内存布局。最后介绍了mmap系统调用,用于创建高效的内存映射,包括其参数、类型和应用场景。文章从内核机制到系统调用层面,系统性地剖析了Linux虚拟内存管理的基础架构。
2025-07-17 02:27:53
638
原创 Linux驱动基础:阻塞、休眠、poll、异步通知
文章摘要:本文介绍了Linux驱动开发中的四种关键机制:休眠/唤醒、poll、异步通知和阻塞/非阻塞。休眠/唤醒机制通过wait_event等函数实现进程挂起,利用wake_up函数在中断时恢复执行;poll机制通过查询文件描述符状态实现非阻塞检测;异步通知采用信号机制实现事件驱动;而阻塞/非阻塞模式则通过O_NONBLOCK标志控制I/O行为。文中详细阐述了各机制的工作原理、实现流程及具体代码示例,为Linux驱动程序设计提供了全面的技术参考。
2025-07-16 19:25:30
586
原创 Linux中断及其处理
Linux中断处理机制摘要 Linux中断处理机制分为上半部和下半部。上半部在屏蔽中断状态下快速处理紧急任务(如硬件应答),下半部通过软中断、tasklet或工作队列延迟处理耗时操作。软中断和tasklet基于优先级执行,而工作队列则允许睡眠和阻塞,适用于复杂任务。线程化中断将部分处理移至内核线程,减少中断延迟。内核提供request_irq()注册中断处理函数,并通过中断向量表管理不同中断源。这种分层设计平衡了实时响应与系统效率,是操作系统与硬件交互的核心机制。
2025-07-14 00:18:56
579
原创 Linux设备树(dts/dtsi/dtb、设备树概念,设备树解析,驱动匹配)
设备树是描述硬件资源的独立数据结构,实现了硬件配置与内核分离。其核心作用是为内核驱动提供硬件信息,通过.dts文件描述外设地址、中断号等参数,取代传统硬编码方式,解决硬件变更需重新编译内核的问题。 设备树包含根节点及子节点,节点命名遵循device-type@address格式。常用节点类型包括CPU、内存、总线和外设节点,关键属性如compatible(驱动匹配)、reg(地址范围)、interrupts(中断配置)等。编译工具dtc将.dts转换为内核可读的.dtb文件。设备树显著提升了嵌入式系统的移植
2025-07-11 22:18:19
669
原创 Linux驱动基本概念(内核态、用户态、模块、加载、卸载、设备注册、字符设备)
驱动开发基础摘要 驱动程序是操作系统与硬件之间的桥梁,负责硬件初始化、提供设备访问接口、处理中断及数据传输。它运行在内核空间,可直接访问硬件,但需通过copy_to/from_user与用户空间交换数据。一个典型驱动包含模块初始化/退出函数、设备操作接口(如file_operations结构体)以及内核注册/注销机制。开发时需注意内核空间限制(如无标准库、严格错误处理),并通过printk调试。示例代码展示了字符设备驱动的基本框架,包括设备注册、类创建和文件操作实现。
2025-07-11 22:13:23
632
原创 Linux/Unix 套接字Socket编程(socket基本概念,流程,流式/数据报socket,Unix domain socket示例)
Socket(套接字)是网络通信的基础,提供了进程间数据交换的端点。文章介绍了socket的基本概念、通信域、通用地址结构体以及两种主要类型:流socket(TCP协议)和数据报socket(UDP协议)。详细讲解了流socket的客户端-服务端模型,包括listen()、accept()、connect()、recv()和send()等系统调用;以及数据报socket的无连接通信模型,涉及recvfrom()和sendto()等操作。文章还涵盖了socket的创建、绑定地址和关闭等基本操作,为网络编程提供
2025-07-06 01:09:45
733
原创 Linux/Unix线程及其同步(create、wait、exit、互斥锁、条件变量、多线程)
线程是轻量级并发执行单元,共享进程资源但独立运行。相比进程,线程创建开销小、切换高效,更适合多核并行和频繁通信场景。POSIX线程(Pthreads)提供跨平台API,包括线程创建(pthread_create)、终止(pthread_exit)、ID获取(pthread_self)和同步(pthread_join)等操作。线程同步通过互斥量(pthread_mutex_t)实现,确保共享资源访问的原子性:线程锁定互斥量后独占访问资源,解锁后释放。互斥量需初始化(PTHREAD_MUTEX_INITIALI
2025-07-04 00:35:08
893
原创 Linux/Unix文件IO(文件描述符、原子操作、文件数据结构、open、read、write、fcntl、dup)
本文介绍了文件IO操作的两种方式:系统调用IO和标准IO。系统调用IO(如open、read、write等)是操作系统的底层接口,直接与内核交互但性能开销较大。标准IO在此基础上提供缓冲机制,减少系统调用次数。文章还深入探讨了原子操作实现、文件描述符的三层数据结构(描述符表、文件表、v-node表)以及文件控制函数fcntl和文件描述符复制函数(dup/dup2/dup3)的使用。这些机制共同保证了文件操作的高效性和数据一致性。
2025-07-02 19:25:43
868
原创 Linux/Unix进程概念及基本操作(PID、内存布局、虚拟内存、环境变量、fork、exit、wait、exec、system)
摘要 本文详细介绍了进程的基本概念和相关知识。主要内容包括:进程与程序的区别,进程号和父进程号的获取方法,进程内存布局的组成(程序段、数据段、栈和堆),虚拟内存管理的原理与优点(扩展内存、进程隔离、简化编程等),栈和栈帧的结构与功能,命令行参数argc和argv的使用方式,以及环境变量的访问和修改方法(通过environ、getenv、putenv等接口)。文章还通过代码示例展示了如何获取进程ID、操作环境变量等具体实现。
2025-07-02 18:25:02
1077
原创 Linux/Unix堆栈内存分配(malloc、free、realloc、calloc、memalign、posix_memalign、brk、sbrk、alloc)
本文介绍了内存分配的核心概念,重点讲解了堆内存的动态管理机制。堆内存通过`malloc`,`calloc`,`realloc`分配,使用`free`释放,其生命周期跨越函数作用域。详细解析了底层系统调用`brk`和`sbrk`的工作原理,以及`malloc`,`free`的实现原理:包括内存块结构、空闲列表管理和分配策略。特别强调了正确使用内存分配函数的注意事项,如避免重复释放、仅释放`malloc`分配的指针等。通过示例代码演示了内存分配的实际操作和效果。
2025-06-27 20:15:59
890
原创 【make】makefile变量
本文总结了Makefile变量的使用规范与特性。1、变量格式:特殊变量以"."开头,自定义变量建议小写;2、变量引用:使用$(var)或${var},$需用$$表示;3、变量定义:分为递归展开(可能无限递归)和简单展开(使用:=);4、高级特性:包括条件赋值(?=)、替换引用、嵌套使用、追加值(+=)和多行定义(define);5、环境变量:如CFLAGS用于编译选项,SHELL指定命令行解释器,目标变量仅作用于特定目标。
2025-06-06 21:12:02
303
原创 【make】makefile命令
本文总结了Makefile处理过程中的关键要点:1) 命令默认使用/bin/bash解析,空行含tab被视为空命令;2) 命令格式注意事项,包括注释限制和变量使用;3) 命令回显控制方法(@、-n、-s);4) 命令执行特性,包括子进程调用和.ONESHELL的使用;5) 并行执行控制(-j参数和.NOTPARALLEL);6) 错误处理机制(-前缀忽略错误);7) define指令封装常用命令;8) 空命令的作用。这些规则涵盖了Makefile命令处理的主要方面。
2025-05-29 20:51:52
277
原创 【make】makefile规则
Makefile规则定义了如何重建目标文件,其中第一个规则的目标是"终极目标"。规则语法为TARGETS:PREREQUISITES COMMAND,支持通配符、变量引用和行连接。依赖分为常规依赖和order-only依赖。目录搜索功能可通过VPATH变量或vpath关键字实现。伪目标(.PHONY)用于执行特殊命令而非创建文件。静态模式规则可自动构造不同目标的依赖关系。双冒号规则允许目标出现在多个规则中。GCC的-M/-MM选项可列出文件依赖关系。这些特性使Makefile能
2025-05-27 20:30:03
839
原创 【GCC】预处理以及调试
GNU C预处理器是GCC套件的一部分,用于在编译前扩展宏。通过“-D”命令行选项可以定义宏,而“-E”选项则用于查看预处理后的代码。为了便于调试,GCC提供了“-g”选项,该选项在目标文件和可执行文件中存储额外的调试信息,如变量名和源代码行号,这对于使用调试器(如GDB)追踪程序执行和检查变量值非常有用。此外,当程序崩溃时,操作系统会生成一个核心文件,结合调试信息,可以定位到程序停止运行的具体行和变量值,这对于开发和部署后的故障排查至关重要。
2025-05-23 16:33:54
145
原创 【GCC】库及其链接
库是预先编译好的目标文件集合,主要用于提供可直接调用的函数,如math库中的sqrt函数。库分为动态库和静态库,Linux系统下标准库文件通常存放在/usr/lib和/lib路径下。通过将常用函数制作成库文件,可以提高代码复用率和开发效率。链接库文件时,可以使用gcc命令指定库文件路径或通过-l选项链接标准库。动态库在程序运行时加载,可被多个程序共享,节省内存;静态库在编译时链接,成为程序的一部分,可能增加内存占用。创建库文件可使用ar指令,如ar cr libNAME.a file1.o file2.o。
2025-05-23 16:31:11
345
原创 【GCC】单独编译以及链接
将项目代码分模块存放在多个文件中,可以显著提高编译效率。当代码被修改时,只需重新编译改动过的文件,生成目标文件(.o),而不需要重新编译整个项目。在链接阶段,链接器将所有目标文件合并生成可执行文件。由于链接过程通常比编译更快,这种方法在大型项目中尤其有效。使用工具如make可以自动管理这一过程,进一步优化开发效率。例如,使用gcc -Wall -c main.c编译单个源文件生成目标文件,再通过gcc main.o hello.o -o main链接生成可执行文件。
2025-05-23 16:27:33
152
原创 【GCC】简单源文件的编译
本文介绍了使用GCC编译器编译C语言程序的基本指令和示例。对于单个源文件,使用gcc -Wall 源文件 -o 可执行文件名命令,其中-Wall选项用于显示所有警告信息,-o指定输出可执行文件的名称。示例中,gcc -Wall main.c -o main将main.c编译为main可执行文件。若源文件中存在语法错误,GCC会提示错误信息。对于多个源文件,使用gcc -Wall 源文件1 源文件2 … 源文件n -o 可执行文件名命令,如gcc -Wall main.c hello.c -o hello,将
2025-05-23 16:21:55
316
原创 【GCC】编译警告选项
警告选项'-Wall'是GCC编译器中的一个重要工具,它能够检测并报告多种常见的编程错误。该选项结合了多个具体的警告选项,如-Wcomment(警告嵌套注释)、-Wformat(警告格式字符串错误)、-Wunused(警告未使用的变量)、-Wimplicit(警告未声明的函数)和-Wreturn-type(警告未指定返回类型的函数)。这些警告通常指示代码中存在潜在的问题,如逻辑错误或代码冗余,因此使用'-Wall'可以帮助开发者提高代码质量。此外,GCC还提供了其他不在'-Wall'中的警告选项,如-Wco
2025-05-23 16:13:56
201
原创 【GCC】编译优化
GCC作为一款优化编译器,提供了多种选项以提高可执行文件的运行速度或减小其大小。优化过程涉及选择最佳机器指令组合,并考虑不同处理器的兼容性。源码级优化技术如公共子表达式消除(CSE)和函数内联(FL)能有效提升代码效率和减小体积。然而,某些优化如循环展开可能以增加文件大小为代价来提升速度。GCC还支持调度优化,通过指令顺序安排提高执行效率。编译器提供从-O0到-O3的优化级别,用户需权衡优化带来的编译时间和内存消耗。此外,GCC允许同时使用优化和调试选项,尽管这可能导致调试信息的不一致。优化过程中,GCC还
2025-05-23 16:09:46
608
原创 【GCC】编译器编译过程
编译器的工作原理涉及多个阶段,主要包括预处理、编译、汇编和链接。预处理阶段使用预处理程序扩展宏和包含的头文件,生成扩展名为“.i”或“.ii”的预处理文件。编译阶段将预处理后的源代码转换为特定处理器的汇编语言。汇编阶段将汇编语言转换成机器码并生成目标文件,保留外部函数的未定义地址供链接器填充。最后,链接阶段将目标文件与系统库和C运行时库链接,生成最终的可执行文件。GCC工具链在整个过程中透明地处理这些步骤,简化了编译过程。
2025-05-23 16:02:48
152
原创 【GCC】gcc编译器简介
交叉编译是一种在一种体系结构的平台上编译出能在另一种体系结构平台上运行的程序的技术。例如,在x86平台上编译ARM平台程序,编译后的程序无法在x86上运行,需在ARM平台上执行。C语言程序的编译过程包括预处理、编译、汇编和链接四个步骤,最终生成可执行文件。GCC是Linux下常用的C语言编译器,支持多种语言编译,最初为GNU项目开发。GCC提供了多种编译选项,支持动态库和静态库的制作与使用。动态库需放置在系统库目录或通过环境变量指定路径,而静态库则无需额外操作。交叉编译时,需使用特定参数如-fPIC以确保代
2025-05-23 15:56:39
864
原创 【make】makefile总述
Makefile是用于自动化编译和构建项目的工具,其核心内容包括显式规则、隐含规则、变量定义、指示符和注释。显式规则明确指定如何更新目标文件,而隐含规则则根据文件类型自动推导。变量定义用于简化文本替换,指示符控制make程序的行为,注释则用于说明。Makefile的命名通常为“makefile”或“Makefile”,且可以通过“include”关键字包含其他Makefile文件。环境变量“MAKEFILES”可指定额外的Makefile文件。make的执行过程包括读取Makefile文件、初始化变量、建立
2025-05-22 17:23:07
618
原创 【make】makefile简介
Makefile 是一种用于管理大型项目中文件编译和链接的工具,特别适用于文件关系复杂的场景。它通过描述文件之间的依赖关系和编译命令,简化了项目的构建过程。Makefile 的基本结构包括目标(target)、依赖项(prerequisites)和命令(recipe)。目标通常是生成的文件或操作,依赖项是生成目标所需的文件,而命令则是执行的具体操作。Make 工具会根据 Makefile 中的规则,检查依赖项是否有更新,并决定是否需要重新编译目标文件。通过使用变量和自动推导规则,Makefile 可以进一步
2025-05-22 15:02:55
622
原创 【计算机结构】1-1 计算机的发展历史
计算机系统由硬件和软件组成,硬件包括主机和外设,软件分为系统软件(如操作系统)和应用软件(如微信、抖音)。计算机硬件的发展经历了从电子管到超大规模集成电路的四个时代,体积和功耗逐渐减小,性能显著提升。微处理器的发展遵循摩尔定律,半导体存储器的容量也迅速增长。软件方面,计算机发展趋势呈现两极分化,微型计算机趋向更小、更网络化,而巨型机则追求更高速度和智能化。
2025-05-21 20:08:00
290
原创 【数据结构】3-4 队列的应用
在操作系统中,队列是一种重要的数据结构,广泛应用于资源管理和任务调度。例如,当多个进程竞争有限的系统资源时,采用FCFS(先来先服务)策略,可以通过队列实现CPU资源的公平分配。此外,队列还用于打印数据缓冲区,确保打印任务按顺序执行。在树和图的应用中,队列也发挥着关键作用,如用于树的层次遍历和图的广度优先遍历,帮助系统地访问和处理节点数据。这些应用展示了队列在计算机科学中的多样性和重要性。
2025-05-20 16:27:38
220
原创 【数据结构】3-3-3 栈的应用--递归
栈在函数调用中扮演着重要角色,特别是在递归调用时。函数调用的特点是后进先出(LIFO),即最后被调用的函数最先执行结束。在函数调用过程中,栈用于存储返回地址、实参和局部变量。递归调用时,每次进入新的一层递归,相关信息被压入栈顶;退出时则弹出。然而,递归的效率较低,可能导致栈溢出,且常包含重复计算。因此,可以通过自定义栈将递归算法转换为非递归算法。例如,计算阶乘和裴波那契数列的递归算法,都可以通过栈结构实现非递归版本,从而提高效率和避免栈溢出问题。
2025-05-20 16:23:52
296
原创 【数据结构】3-3-2 栈的应用--表达式求值
本文详细介绍了数据结构中关于表达式的三种形式:中缀、前缀和后缀表达式,并阐述了它们之间的转换方法及计算过程。中缀表达式是常见的运算符位于操作数之间的形式,如a+b;前缀表达式将运算符置于操作数之前,如+ab;后缀表达式则将运算符放在操作数之后,如ab+。文章还详细描述了如何通过栈结构将中缀表达式转换为前缀或后缀表达式,并利用栈进行表达式的计算。此外,还提供了具体的计算步骤和示例,帮助理解如何在实际操作中应用这些方法。
2025-05-20 16:17:35
544
原创 【数据结构】3-3-1 栈的应用--括号匹配
使用栈实现括号匹配是一种常见的数据结构应用。算法通过扫描字符,遇到左括号时将其入栈,遇到右括号时弹出栈顶元素并检查是否匹配。匹配失败的情况包括左括号单身、右括号单身或左右括号不匹配。最后,检查栈中是否还有未匹配的括号。算法代码展示了如何初始化栈、扫描表达式并处理括号匹配的逻辑。测试代码验证了算法的正确性,通过检查不同表达式的括号匹配情况,输出相应的结果。这种方法利用了栈的“后进先出”特性,确保最后出现的左括号最先被匹配,从而有效解决括号匹配问题。
2025-05-20 14:56:30
509
原创 【数据结构】3-2-4 双端队列
双端队列是一种允许从两端进行插入和删除操作的线性表。如果仅使用一端的插入和删除操作,其功能等同于栈。双端队列有两种受限形式:输入受限的双端队列,只允许从一端插入但可以从两端删除;输出受限的双端队列,允许从两端插入但只能从一端删除。判断输出序列的合法性时,需考虑这些操作限制,确保序列符合双端队列的操作规则。
2025-05-20 14:29:18
166
原创 【数据结构】3-2-3 队列的链式存储
链式队列是一种使用链表实现的队列结构,其核心在于通过节点指针连接各个元素。链式队列的节点结构包含数据域和指向下一个节点的指针。队列结构体则包含指向队头和队尾的指针。链式队列的初始化分为带头节点和不带头节点两种方式,带头节点的初始化需要为头节点分配空间,并将队头和队尾指针指向头节点;不带头节点的初始化则直接将队头和队尾指针置空。入队操作通过创建新节点并将其插入队尾实现,出队操作则通过移除队头节点并更新指针完成。判空操作通过检查队头和队尾指针是否指向同一节点(带头节点)或队头指针是否为空(不带头节点)来判断队列
2025-05-19 16:16:33
829
原创 【数据结构】3-2-2 队列的顺序存储
顺序队列是一种通过静态数组实现的队列结构,使用队头(front)和队尾(rear)指针来管理队列元素。循环顺序队列通过牺牲一个存储单元来避免队满和队空条件的混淆。基本操作包括初始化队列、判断队列是否为空、入队、出队和获取队头元素。判断队满和队空的方法有多种,如通过指针位置、队列元素个数、或增加变量(如size或tag)来记录队列状态。这些方法确保了队列操作的正确性和高效性。
2025-05-19 16:03:57
820
原创 【数据结构】3-2-1 队列的基本概念
队列是一种遵循先进先出(FIFO)原则的线性表,允许在一端插入元素,在另一端删除元素。其基本操作包括初始化队列(InitQueue)、销毁队列(DestroyQueue)、入队(EnQueue)、出队(DeQueue)和读取队头元素(GetHead)。此外,常用操作还包括判断队列是否为空(QueueEmpty)。这些操作共同构成了队列的基本功能,使其在数据处理和任务调度中具有广泛应用。
2025-05-19 15:54:54
225
原创 【数据结构】3-1-3 栈的链式存储
链栈是一种用链表实现的栈结构,其基本操作包括初始化、入栈、出栈、获取栈顶元素、判断栈是否为空以及输出栈中所有元素。链栈的结构体由数据域和指向下一个节点的指针组成。初始化时,分配一个头节点并将其指针置为空。入栈操作通过分配新节点并将其插入链表头部实现,出栈操作则通过删除链表头部节点并释放其空间完成。获取栈顶元素和判断栈是否为空的操作分别通过检查链表头部节点和头节点的指针实现。输出栈中所有元素的操作通过遍历链表并打印每个节点的数据域完成。测试代码展示了链栈的基本操作流程,包括初始化、入栈、出栈、获取栈顶元素、判
2025-05-19 15:50:06
745
原创 【数据结构】3-1-2 栈的顺序存储
顺序栈是一种采用顺序存储方式的栈,通过静态数组实现,为每个元素分配连续的存储空间,并使用栈顶指针指向栈顶元素。其基本操作包括初始化、判断栈是否为空、入栈、出栈和读取栈顶元素。初始化时,栈顶指针通常设置为-1或0,表示栈为空。入栈操作需检查栈是否已满,若未满则将新元素压入栈顶;出栈操作需检查栈是否为空,若不为空则将栈顶元素弹出。读取栈顶元素时,同样需检查栈是否为空。此外,共享顺序栈允许两个栈共享同一片存储空间,一个栈的栈底在存储空间的起始位置,另一个栈的栈底在存储空间的末尾位置。共享栈的栈满条件是两个栈的栈顶
2025-05-19 15:43:29
533
原创 【数据结构】3-1-1 栈的基本概念
栈是一种遵循后进先出(LIFO)原则的线性数据结构,只允许在一端(栈顶)进行插入(进栈)和删除(出栈)操作。栈的基本操作包括初始化栈(InitStack)、销毁栈(DestroyStack)、进栈(Push)、出栈(Pop)、读取栈顶元素(GetTop)和判断栈是否为空(StackEmpty)。对于n个不同元素的进栈顺序,其出栈序列的排列个数遵循特定的组合数学规律,通常与卡特兰数相关。栈在计算机科学中广泛应用于函数调用、表达式求值、括号匹配等场景。
2025-05-19 15:37:13
168
原创 【数据结构】2-7 顺序表和链表的比较
顺序表和链表是两种常见的线性表结构,分别采用顺序存储和链式存储。顺序表支持随机存取,存储密度高,但需要大片连续空间,扩展和容量调整不便。链表则通过离散的小空间分配,扩展和容量调整方便,但不支持随机存取,存储密度较低。在基本操作方面,顺序表在插入和删除时需要移动元素,时间复杂度为O(n),而链表只需修改指针,时间复杂度同样为O(n),但主要开销在于查找目标元素。查找操作中,顺序表按位查找为O(1),按值查找为O(n);链表按位和按值查找均为O(n)。适用场景上,链表适合表长难以预估且频繁增删元素的场景,而顺序
2025-05-19 15:27:04
144
原创 【数据结构】2-6 静态链表
静态链表是一种用数组实现的链表结构,通过分配连续的内存空间来存储节点。其优点在于增删操作无需大量移动元素,但缺点是不能随机存取,且容量固定。静态链表适用于不支持指针的低级语言或数据元素数量固定的场景,如操作系统的文件分配表。静态链表的基本操作包括初始化、查找、插入和删除。初始化时,将头节点的next设为-1,其他节点设为-2表示空闲。查找操作从头节点开始遍历,插入和删除操作则需找到前驱节点并修改相关节点的next值。静态链表的实现通过数组下标模拟指针,适用于特定场景下的链表操作。
2025-05-19 15:21:02
276
原创 【数据结构】2-5 循环链表
循环单链表和循环双链表是两种重要的数据结构。循环单链表在单链表的基础上,将表尾指针指向表头,形成一个环,使得从一个节点出发可以访问到所有其他节点。其基本操作包括初始化、判断是否为空、判断节点是否为尾节点等,时间复杂度为O(n)或O(1)。循环双链表则在双链表的基础上,将表头的前驱指向表尾,表尾的后继指向表头,形成双向环。其基本操作包括初始化、判断是否为空、判断节点是否为尾节点、插入和删除节点等。循环双链表的插入和删除操作需要调整前驱和后继指针,确保链表的完整性。这两种数据结构在需要循环访问的场景中具有较高的
2025-05-19 15:06:13
937
原创 【数据结构】2-4 双链表
双链表在单链表的基础上增加了指向前驱节点的指针,其节点结构包括数据域、前驱指针和后驱指针。双链表的初始化涉及创建头节点并设置其前驱和后驱指针为NULL。插入操作在指定节点后插入新节点,需调整新节点及其前后节点的指针。删除操作移除指定节点的后继节点,并调整相关指针及释放节点空间。双链表的遍历操作,包括按位查找和按值查找,由于不能随机存取,必须从头节点开始顺序访问,时间复杂度为O(n)。这些操作共同构成了双链表的基本功能,使其在数据结构中具有灵活性和高效性。
2025-05-19 14:58:31
669
原创 【数据结构】1-1数据结构的基本概念
数据结构是计算机科学中的核心概念,涉及数据元素、数据项、数据对象和数据类型等基本概念。数据结构的三要素包括逻辑结构、存储结构和数据的运算。逻辑结构描述数据元素之间的关系,如集合、线性结构、树形结构和图结构。存储结构涉及数据在计算机中的物理存储方式,包括顺序存储、链式存储、索引存储和散列存储。数据的运算则包括对数据进行的各种操作,如插入、删除和查找等。理解这些基本概念和结构对于设计和实现高效的算法至关重要。
2025-05-18 21:33:25
170
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人