基于双向链表的命令行记事本工具,支持增、删、改、查及文件读写功能。每条记录以节点形式存储,支持从头部/尾部插入、按行号删除、修改和插入。数据可持久化保存到本地文件,程序启动时自动加载。适合作为C++数据结构与文件操作的综合练习项目。
项目说明:双链表记事本
项目名称:基于双向链表的命令行记事本工具
技术栈:C++、Linux环境、g++编译、文件读写
一、设计思路
这个项目是用双链表实现一个轻量级的命令行记事本,支持增删改查和文件持久化。
· 为什么用双链表:因为笔记本的核心操作是插入和删除,双链表在中间插入/删除时不需要移动数据,只需要改指针,比数组更适合这个场景
· 为什么要两个指针(prev和next):因为需要支持正向遍历(从头到尾)和反向遍历(从尾到头),还要支持按行号插入和删除,有prev指针后,删除时不用从头遍历找到前一个节点
· 为什么要保存到文件:因为不想每次打开程序都重新输入,数据要能跨会话保存
二、我负责的板块
整个项目是我独立完成的,主要分这几个模块:
· 节点定义与链表类设计:定义Node结构体,设计DList类的公有接口和私有成员
· 插入功能:实现头部插入、尾部插入、指定位置插入,处理空链表和边界情况
· 删除功能:实现按位置删除,处理删除头节点、尾节点、中间节点三种情况
· 修改与查询功能:按位置修改数据、按位置获取数据
· 遍历功能:正向输出和反向输出所有节点
· 文件读写模块:将链表数据保存到本地文件,程序启动时自动加载
· 内存管理:编写clear函数释放所有节点,在析构函数中调用,防止内存泄漏
三、坑点与难点
坑点一:插入时指针连接顺序错了导致数据丢失
在中间插入时,我先连接了新节点的next,然后修改了前一个节点的next,结果后一个节点的prev没有正确指向新节点,导致反向遍历时断链。后来我按“先连接新节点与后一个节点,再连接前一个节点与新节点”的顺序,确保两边指针都正确。
坑点二:删除唯一节点时程序崩溃
删除唯一节点时,我没有同时把head和tail置nullptr,只释放了内存,导致head变成了野指针,tail还指向已释放的内存。修复方法是删除前判断长度是否为1,如果是则删除后将head和tail都置nullptr。
坑点三:文件读写时编码问题导致中文乱码
在Windows下保存的文件,在Linux下读出来的中文变成乱码。解决方法是所有文本统一用英文,或者用UTF-8编码保存,确保跨平台时内容一致。
坑点四:插入位置在边界时没处理好
一开始我只写了中间插入的逻辑,没有单独处理插入在头部或尾部的边界情况,导致调用时出现段错误。后来在insert函数中判断如果pos==0则调用pushFront,如果pos==length则调用pushBack,确保边界安全。
项目总结
通过这个项目,我掌握了双链表的核心操作、指针连接的顺序、边界条件的处理以及文件持久化的基本方法。这个项目是我暑假独立完成的第一个完整可用的工具。