1. 链表数据结构基础解析
链表作为C++中重要的线性数据结构,其核心在于通过指针将离散的内存块串联起来。与数组不同,链表不需要连续的内存空间,这使得它在动态内存管理方面具有天然优势。理解链表的关键在于掌握节点(Node)这一基本组成单元。
1.1 节点结构剖析
每个链表节点包含两个核心部分:
cpp复制struct Node {
DataType data; // 数据域
Node* next; // 指针域
};
数据域存储实际元素值,指针域保存相邻节点的内存地址。在单向链表中,最后一个节点的next指针通常设为nullptr,这是遍历终止的重要标志。
实际开发中建议使用智能指针(如std::unique_ptr)管理节点内存,可避免手动内存管理的风险。但教学示例中仍采用原始指针以展示底层原理。
1.2 链表类型对比
| 类型 | 指针特点 | 遍历方向 | 内存开销 |
|---|---|---|---|
| 单向链表 | 仅next指针 | 单向 | 较低 |
| 双向链表 | 含next和prev指针 | 双向 | 较高 |
| 循环链表 | 尾节点next指向头节点 | 循环 | 中等 |
在ATM队列案例中,选择单向链表实现主要基于:
- 队列只需单向操作(尾部添加、头部删除)
- 节省内存空间
- 实现复杂度较低
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 队列抽象数据类型实现
2.1 类架构设计
队列ADT(抽象数据类型)需要满足FIFO(先进先出)特性,我们的设计包含两个核心类:
cpp复制// 客户类
class CConsumer {
private:
long arrive; // 到达时间戳
int processtime; // 业务处理时长(分钟)
public:
CConsumer() : arrive(0), processtime(0) {}
void set(long when);
// ...其他方法
};
// 队列类
class Queue {
private:
struct Node {
CConsumer consumer;
Node* next;
};
Node* front; // 队首指针
Node* rear; // 队尾指针
int items; // 当前元素计数
const int qsize;// 队列容量上限
// ..
