模拟实现list

来源:互联网 发布:金石软件win10 编辑:程序博客网 时间:2024/06/07 10:14

list是类库中的一个类,可以将其视为双向链表。


使用它的好处是在任何位置增加或删除元素都很快

缺点是不支持随机存取


话不多说,直接上代码:

代码后面都有注释,希望看完可以对你有帮助。

#include<iostream>#include<assert.h>#include<windows.h>using namespace std;#pragma oncetypedef int DataType;struct Node{Node(const DataType& data):_data(data), _next(NULL), _pre(NULL){}DataType _data;   //值Node* _next;    //下一个节点Node* _pre;     //上一个节点};class List{public:List():_head(NULL), _tail(NULL), _size(0){}List(size_t n, const DataType& data){}List(const List& l){}List& operator=(const List& l){if (this != &l){}return *this;}//尾插void PushBack(const DataType& data){//构造一个新的节点Node* _node = new Node(data);//链表为空if (NULL == _head){_head = _tail = _node;}//链表不为空else{_tail->_next = _node;  //先将新节点链接到尾部_node->_pre = _tail;_tail = _tail->_next;   //将尾节点向后移}++_size;}//尾删void PopBack(){//链表为空直接返回if (_head == NULL)return;//链表中只有一个节点else if (_head == _tail){delete _tail;_tail = _head = NULL;}//链表中有多个节点else{_tail = _tail->_pre;delete _tail->_next;_tail->_next = NULL;}--_size;}//头插void PushFront(const DataType& data){Node* _node = new Node(data);if (_head == NULL)_head = _tail = _node;else{_node->_next = _head;_head->_pre = _node;_node = _head;}++_size;}//头删void PopFront(){//链表为空if (_head == NULL)return;//链表中只有一个节点else if (_head == _tail){delete _head;_head = _tail = NULL;}//链表中有多个节点else{_head = _head->_next;delete _head->_pre;_head->_pre == NULL;}--_size;}//任意位置的插入void Insert(Node* pos, const DataType& data){//此处需要注意assert和if检验的区别assert(pos);assert(data);if (pos == _tail){//相当于尾插PushBack(data);}else{Node* _node = new Node(data);//先建立起_node pos pos->_next的三角关系_node->_next = pos->_next;pos->_next->_pre = _node;pos->_next = _node;_node->_pre = pos;++_size;}}//任意位置的删除void Erase(Node* pos){assert(pos);if (_head == NULL)return;else if (_head == pos)PopFront();//头删else if (_tail == pos)PopBack();else{pos->_pre->_next = pos->_next;pos->_next->_pre = pos->_pre;delete pos;pos == NULL;--_size;}}void DestoryList(){size_t size = _size;while (size){PopFront();--size;}}void Clear(){DestoryList();_size = 0;}void PrintList(){Node* cur = _head;size_t size = _size;while (size){ cout << cur->_data << "";cur = cur->_next;--size;}cout << endl;}Node Front(){return *_head;}const Node Front()const{return *_head;}Node Back(){return *_tail;}const Node Back()const{return *_tail;}size_t Size(){return _size;}bool Empty(){return 0 == _size;}private:Node* _head;Node* _tail;size_t _size;};

测试部分只是测试了简单的头插、头删、尾插、尾删。

读者有兴趣可自行测试

void FunTest(){List l;l.PushFront(1);l.PrintList();l.PushBack(2);l.PushBack(3);l.PushBack(4);l.PushBack(5);l.PushBack(6);l.PushBack(7);l.PushBack(8);l.PrintList(); l.PopBack();l.PrintList();l.PopFront();l.PrintList();}int main(){FunTest();system("pause");return 0;}