您的位置:首页 > 编程语言 > C语言/C++

c++双向链表实现

2021-10-21 20:40 447 查看
//
// Created by admin on 2021/10/21.
// List 双向链表实现
//

#ifndef HELLOWORLD_LIST_H
#define HELLOWORLD_LIST_H

// List类
template<typename Object>
class List {
// 节点类
struct Node {
Object mData;
Node *prev;
Node *next;

explicit Node(const Object &d = Object{}, Node *p = nullptr, Node *n = nullptr);  // 构造函数
};

public:
// 迭代器声明
class Iter {
friend class List;

Node *currNode;  // 当前节点
public:
explicit Iter(Node *node);  // 构造函数
Iter operator++();  // 重载前置++运算符
Iter operator++(int);  // 后置++运算符重载
Object &operator*();  // 重载*运算符
bool operator!=(const Iter &iter) const;
Iter operator--();
};

List(); // List 构造函数
~List(); // 析构函数

Iter insert(Iter iter, const Object &object); // 插入函数
Iter pushBack(const Object &object) { return Iter{insert(end(), object)}; }

void pushFront(const Object &object);  //头部插入
void popFront() { erase(begin()); }  // 删除头部元素
void popBack() { erase(--end()); }    // 删除尾部元素

Iter erase(Iter iter); // 删除元素
void clear();  // 清除所有元素
bool empty() { return mSize == 0; }  // 是否为空
Object &front() { return *begin(); }  // 获取首元素
Object &back() { return *--end(); }  // 获取尾元素

Iter begin() { return Iter{head->next}; }  // 头节点
Iter end() { return Iter{tail}; }   // 尾节点
unsigned size() { return mSize; }  // 获取尺寸

private:
Node *head;     // 头节点
Node *tail;     // 尾节点
unsigned mSize; // 链表元素个数
};

// 节点类
template<typename Object>
List<Object>::Node::Node(const Object &d, Node *p, Node *n): mData(d), prev(p), next(n) {}

template<typename Object>
List<Object>::Iter::Iter(List::Node *node): currNode(node) {}  // Iter构造函数实现

template<typename Object>
typename List<Object>::Iter List<Object>::Iter::operator++() {
currNode = currNode->next;
return *this;
}

template<typename Object>
Object &List<Object>::Iter::operator*() {
return currNode->mData;
}

template<typename Object>
bool List<Object>::Iter::operator!=(const List::Iter &iter) const {
return this->currNode != iter.currNode;
}

template<typename Object>
typename List<Object>::Iter List<Object>::Iter::operator--() {
currNode = currNode->prev;
return *this;
}

template<typename Object>
typename List<Object>::Iter List<Object>::Iter::operator++(int) {
auto preNode = *this;
currNode = currNode->next;
return preNode;
}

template<typename Object>
List<Object>::List() {
mSize = 0;
head = new Node;  // 创建首节点
tail = new Node;  // 创建尾节点
head->next = tail;
tail->prev = head;
}

template<typename Object>
typename List<Object>::Iter List<Object>::insert(List<Object>::Iter iter, const Object &object) {
Node *node = iter.currNode;
++mSize;
return Iter{node->prev = node->prev->next = new Node{object, node->prev, node}};
}

template<typename Object>
typename List<Object>::Iter List<Object>::erase(List<Object>::Iter iter) {
Node *node = iter.currNode;
Iter ret{node->next};
node->prev->next = node->next;
node->next->prev = node->prev;
--mSize;
delete node;
return ret;
}

template<typename Object>
void List<Object>::clear() {
while (!empty()) erase();
}

template<typename Object>
void List<Object>::pushFront(const Object &object) {
insert(begin(), object);
}

template<typename Object>
List<Object>::~List() {
clear();
delete tail;
delete head;
}

#endif //HELLOWORLD_LIST_H

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: