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

C++模板实现双向循环链表(有带头结点)

2017-02-18 21:03 696 查看
带头结点的双向循环链表,头结点不存储有效数据,有效数据从头结点的下一个节点存储,代码中既实现了完整版的过程,又完成了简单优化。代码如下:

#include<iostream>
#include<assert.h>
using namespace std;

template<class T>
struct ListNode
{
T _data;
ListNode<T>* _next;
ListNode<T>* _prev;

ListNode(const T& x)
:_data(x)
, _next(NULL)
, _prev(NULL)
{}
};

template<class T>
class List
{
typedef ListNode<T> Node;
public:
List()
{
_head = new Node(T());
_head->_next = _head;
_head->_prev = _head;
}

List(const List& l)
:_head(new Node(T()))
{
_head->_next = _head;
_head->_prev = _head;
Node* cur = l._head->_next;
while (cur != l._head)
{
PushBack(cur->_data);
cur = cur->_next;
}
}
List& operator=(const List& l)
{
if (this != &l)
{
Node* cur = l._head->_next;
while (cur != l._head)
{
PushBack(cur->_data);
cur = cur->_next;
}
}
return *this;
}

~List()
{
/*Node* next = _head->_next;
while (next != _head)
{
Node* cur = next;
next = next->_next;
delete cur;
}*/
Clear();
delete _head;
_head = NULL;
}

void PushBack(const T& x)
{
/*Node* tail = _head->_prev;

Node* tmp = new Node(x);
tail->_next = tmp;
tmp->_prev = tail;

_head->_prev = tmp;
tmp->_next = _head;*/
Inerst(_head, x);
}

void PopBack()
{
/*Node* tail = _head->_prev;
Node* last = tail->_prev;
delete tail;
last->_next = _head;
_head->_prev = last;*/
Erase(_head->_prev);
}

void Inerst(Node* pos, const T& x)
{
assert(pos);

Node* Pos = pos;
Node* prev = Pos->_prev;
Node* tmp = new Node(x);

prev->_next = tmp;
tmp->_prev = prev;
tmp->_next = Pos;
Pos->_prev = tmp;
}
void Erase(Node* pos)
{
Node* prev = pos->_prev;
Node* next = pos->_next;
delete pos;
prev->_next = next;
next->_prev = prev;
}

void PushFront(const T& x)
{
/*Node* tail = _head->_next;
Node* tmp = new Node(x);

_head->_next = tmp;
tmp->_prev = _head;
tmp->_next = tail;
tail->_prev = tmp;*/
Inerst(_head->_next, x);
}
void PopFront()
{
/*Node* begin = _head->_next;
Node* tail = begin->_next;
delete begin;
_head->_next = tail;
tail->_prev = _head;*/
Erase(_head->_next);
}
Node* Find(const T& x)
{
Node* begin = _head->_next;
while (begin != _head)
{
if (begin->_data == x)
{
return begin;
}
begin = begin->_next;
}
return (Node*)-1;
}
void Clear()
{
Node* next = _head->_next;
while (next != _head)
{
Node* cur = next;
next = next->_next;
delete cur;
}
_head->_next = _head;
_head->_prev = _head;
}

public:
void Print()
{
Node* begin = _head->_next;
while (begin != _head)
{
cout << begin->_data << "--";
begin = begin->_next;
}
cout << endl;
}

private:
Node* _head;
};

void TextList()
{
List<int> l;
l.PushBack(1);
l.PushBack(2);
l.PushBack(3);
l.PushBack(4);
l.Print();
l.PopBack();
l.Print();
l.Inerst(l.Find(2), 20);
l.Print();
l.Erase(l.Find(20));
l.Print();
l.PushFront(30);
l.Print();
l.PopFront();
l.Print();
List<int> l1(l);
l1.Print();
List<int> l2;
l2 = l1;
l2.Print();
}

#include"Vector.h"
#include"List.h"

int main()
{
TextList();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 存储 链表