循环链表的c++实现方式
时间: 2024-05-10 14:18:49 浏览: 77
数据结构学习(C++)——循环链表.doc
循环链表是一种链表,其尾节点指向头节点,形成一个循环结构。下面是一种基于模板类的 C++ 实现方式:
```cpp
template <class T>
class CircularLinkedList {
private:
struct Node {
T data;
Node* next;
explicit Node(const T& d = T(), Node* n = nullptr) : data(d), next(n) {}
};
Node* head; // 头节点指针
int size; // 链表大小
public:
CircularLinkedList() : head(nullptr), size(0) {}
~CircularLinkedList() { clear(); }
// 在链表尾部插入元素
void push_back(const T& val) {
if (empty()) {
head = new Node(val);
head->next = head;
} else {
head->next = new Node(val, head->next);
head = head->next;
}
++size;
}
// 返回链表是否为空
bool empty() const { return size == 0; }
// 返回链表大小
int length() const { return size; }
// 清空链表
void clear() {
while (size) {
Node* p = head->next;
head->next = p->next;
delete p;
--size;
}
head = nullptr;
}
// 遍历链表并执行函数 f
void traverse(void (*f)(const T&)) const {
Node* p = head->next;
while (p != head) {
f(p->data);
p = p->next;
}
}
};
```
这个实现方式中,我们使用了一个内部结构体 `Node` 来表示链表节点,其包含一个 `data` 成员用于存放数据,一个 `next` 成员用于指向下一个节点。
在构造函数中,我们将头节点指针 `head` 初始化为空指针,链表大小 `size` 初始化为 0。
在 `push_back` 函数中,如果链表为空,我们直接创建一个头节点并将其 `next` 指向自身;否则,我们新建一个节点并将其插入到尾部,然后将头节点指向该新节点。
在 `empty` 和 `length` 函数中,我们分别返回链表是否为空和链表大小。
在 `clear` 函数中,我们使用循环遍历链表并删除每个节点,最后将头节点指针设为空指针。
在 `traverse` 函数中,我们使用循环遍历链表并将每个节点的数据传递给函数 `f`。
阅读全文