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();
}
关键点说明
-
节点结构:
-
内存管理:
-
核心操作:
- 插入:支持头部 (
prepend
) 和尾部 (append
) 插入。 - 删除:删除第一个匹配值 (
remove
)。 - 遍历:通过
traverse
方法接受回调函数,安全访问每个元素。
- 插入:支持头部 (
-
辅助功能:
-
Qt 集成:
- 虽然示例中没有使用 GUI 组件,但可通过信号槽机制扩展。例如,在数据修改时发射信号通知界面更新(需继承
QObject
并使用Q_OBJECT
宏)。
- 虽然示例中没有使用 GUI 组件,但可通过信号槽机制扩展。例如,在数据修改时发射信号通知界面更新(需继承
扩展建议
- 迭代器支持:可实现迭代器类,支持基于范围的 for 循环。
- 异常处理:在内存分配失败时添加异常处理逻辑。
- 模板特化:针对特定类型(如
QString
)优化操作。
此实现提供了一个健壮的链表基础结构,可直接在 Qt 项目中使用。