Qt 中实现链表

server/2025/2/27 8:26:57/

Qt 中实现链表,我将使用模板类来支持泛型数据,并通过封装确保数据安全。

完整实现代码

#include <QCoreApplication>
#include <QDebug>
#include <functional> // 用于遍历时的回调函数template<typename T>
class LinkedList {
private:struct Node {T data;Node* next;Node(const T& data) : data(data), next(nullptr) {}};Node* head;public:// 构造函数LinkedList() : head(nullptr) {}// 析构函数:释放所有节点~LinkedList() {clear();}// 禁止拷贝构造和赋值(或实现深拷贝)LinkedList(const LinkedList&) = delete;LinkedList& operator=(const LinkedList&) = delete;// 清空链表void clear() {Node* current = head;while (current != nullptr) {Node* next = current->next;delete current;current = next;}head = nullptr;}// 在头部插入void prepend(const T& value) {Node* newNode = new Node(value);newNode->next = head;head = newNode;}// 在尾部插入void append(const T& value) {Node* newNode = new Node(value);if (head == nullptr) {head = newNode;} else {Node* current = head;while (current->next != nullptr) {current = current->next;}current->next = newNode;}}// 删除第一个匹配项bool remove(const T& value) {Node* prev = nullptr;Node* current = head;while (current != nullptr) {if (current->data == value) {if (prev == nullptr) {head = current->next;} else {prev->next = current->next;}delete current;return true;}prev = current;current = current->next;}return false;}// 判断是否为空bool isEmpty() const {return head == nullptr;}// 获取链表长度int size() const {int count = 0;Node* current = head;while (current != nullptr) {count++;current = current->next;}return count;}// 遍历链表,使用回调处理每个元素void traverse(const std::function<void(const T&)>& func) const {Node* current = head;while (current != nullptr) {func(current->data);current = current->next;}}
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);LinkedList<int> list;// 插入测试list.append(1);list.append(2);list.prepend(0);// 遍历打印qDebug() << "链表内容:";list.traverse([](int value) {qDebug() << value;});// 删除测试list.remove(2);qDebug() << "\n删除 2 后的链表:";list.traverse([](int value) {qDebug() << value;});return a.exec();
}

关键点说明

  1. 节点结构

    • 使用内部 Node 结构体封装链表节点,包含 datanext 指针。
    • 节点仅在链表类内部可见,确保数据封装。
  2. 内存管理

    • 析构函数:遍历链表并删除所有节点,避免内存泄漏。
    • clear() 方法:提供手动清空链表的功能。
    • 禁用拷贝:默认禁用拷贝构造和赋值,防止浅拷贝问题。如需深拷贝,需自定义实现。
  3. 核心操作

    • 插入:支持头部 (prepend) 和尾部 (append) 插入。
    • 删除:删除第一个匹配值 (remove)。
    • 遍历:通过 traverse 方法接受回调函数,安全访问每个元素。
  4. 辅助功能

    • isEmpty:检查链表是否为空。
    • size:获取链表长度。
    • 遍历输出:结合 Qt 的 qDebug 输出链表内容。
  5. Qt 集成

    • 虽然示例中没有使用 GUI 组件,但可通过信号槽机制扩展。例如,在数据修改时发射信号通知界面更新(需继承 QObject 并使用 Q_OBJECT 宏)。

扩展建议

  • 迭代器支持:可实现迭代器类,支持基于范围的 for 循环。
  • 异常处理:在内存分配失败时添加异常处理逻辑。
  • 模板特化:针对特定类型(如 QString)优化操作。

此实现提供了一个健壮的链表基础结构,可直接在 Qt 项目中使用。


http://www.ppmy.cn/server/170984.html

相关文章

二叉树中的深搜(典型算法思想)—— OJ例题算法解析思路

目录 一、2331. 计算布尔二叉树的值 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 代码思路概述 详细代码逻辑解释 节点定义 求值函数 基线条件 递归步骤 逻辑操作 总结 二、129. 求根节点到叶节点数字之和 - 力扣&#xff08;LeetCode&#xff09…

2025中国经济白皮书赋能CES Asia,国际合作成新亮点

近日&#xff0c;2025年中国经济白皮书的发布&#xff0c;为第七届亚洲消费电子技术贸易展&#xff08;CES Asia 2025&#xff09;的招商工作带来了重大利好消息&#xff0c;其在国际合作方面展现出的显著优势&#xff0c;成为吸引全球企业参与的重要因素。 白皮书重申了中国坚…

将VsCode变得顺手好用(1

目录 设置中文 配置调试功能 提效和增强相关插件 主题和图标相关插件 创建js文件 设置中文 打开【拓展】 输入【Chinese】 下载完成后重启Vs即可变为中文 配置调试功能 在随便一个位置新建一个文件夹&#xff0c;用于放置调试文件以及你未来写的代码&#xff0c;随便命名但…

<02.26>Leetcode

想想为什么要a走b的路b走a的路 因为这样到达相交点的话是同时的&#xff08;路程才是一样的&#xff09; 这样能保证第二圈就相遇了 如果各走各的路很难相遇 两个无交点的链表也有一个null交点 /*** Definition for singly-linked list.* public class ListNode {* int…

为什么办公电脑需要使用企业级杀毒软件?--火绒企业版V2.0

首先&#xff0c;办公电脑处在一个网络连接和数据传输频繁的环境中&#xff0c;员工经常会接收和发送电子邮件、浏览网页、下载文件等&#xff0c;因此存在着各种网络安全威胁的风险。 其次&#xff0c;企业办公电脑作为业务运营的关键枢纽&#xff0c;存储着大量商业机密、客…

本地部署阿里的万象2.1文生视频(Wan2.1-T2V-1.3B)模型

文章目录 &#xff08;零&#xff09;在线体验&#xff08;一&#xff09;本地部署&#xff08;1.1&#xff09;克隆仓库&#xff08;1.2&#xff09;安装依赖&#xff08;1.2.1&#xff09;安装 flash-attention&#xff08;1.2.2&#xff09;重新安装依赖&#xff08;1.2.3&a…

【找工作】C++和算法复习(自用)

文章目录 C头文件自定义排序函数stl 算法数据结构树状数组 数学字符串manacherkmp 自用随便记录 C 排序 stl 头文件 全能头文件&#xff1a; #include<bits/stdc.h>自定义排序函数 bool compare(const int &odd1,const int &odd2) {return odd1>odd2; }…

低代码在独具特色的业务中的应用:实践方案与未来展望

低代码开发是一种新兴的软件开发模式&#xff0c;它允许开发者通过图形化界面和最少的手写代码来快速构建应用程序。随着企业对快速开发和部署应用程序的需求日益增长&#xff0c;低代码平台在各个行业中得到了广泛的应用。本文将探讨低代码在独具特色的业务中的应用&#xff0…