list是类库中的一个类,可以将其视为双向链表。
使用它的好处是在任何位置增加或删除元素都很快
缺点是不支持随机存取
话不多说,直接上代码:
代码后面都有注释,希望看完可以对你有帮助。
#include<iostream>
#include<assert.h>
#include<windows.h>
using namespace std;
#pragma once
typedef 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;
}