C++实现双向链表
2017-11-15 22:05
429 查看
#pragma once
typedef int DataType;
struct ListNode
{
ListNode* _next;
ListNode* _prev;
DataType _data;
ListNode(const DataType& x)
:_data(x)
,_next(NULL)
,_prev(NULL)
{}
};
class List
{
typedef ListNode Node;
public:
List()
:_head(NULL)
,_tail(NULL)
{}
List(const List& l)
:_head(NULL)
,_tail(NULL)
{
Node* cur = l._head;
while (cur)
{
PushBack(cur->_data);
cur = cur->_next;
}
}
List& operator=(List l)
{
swap(_head, l._head);
swap(_tail, l._tail);
}
void Clear()
{
Node* cur = _head;
while (cur)
{
Node* next = cur->_next;
delete cur;
cur = next;
}
_head = _tail = NULL;
}
~List()
{
Clear();
}
void PushBack(const DataType& x)
{
if (_tail == NULL)
{
_head = _tail = new Node(x);
}
else
{
Node* tmp = new Node(x);
_tail->_next = tmp;
tmp->_prev = _tail;
_tail = tmp;
}
}
void PopBack()
{
Erase(_tail);
}
void PushFront(const DataType& x)
{
Insert(_head, x);
}
void PopFront()
{
Erase(_head);
}
void Insert(Node* pos, const DataType& x)
{
Node* tmp = new Node(x);
if (_head == pos)
{
if(_head == NULL)
{
_head = _tail = tmp;
}
else
{
tmp->_next = _head;
_head->_prev = tmp;
_head = tmp;
}
}
else
{
Node* prev = pos->_prev;
prev->_next = tmp;
tmp->_prev = prev;
tmp->_next = pos;
pos->_prev = tmp;
}
}
void Erase(Node* pos)
{
if (_head == _tail)
{
assert(_head == pos);
_head = _tail = NULL;
}
else if (pos == _head)
{
_head = _head->_next;
_head->_prev = NULL;
}
else if (pos == _tail)
{
_tail = _tail->_prev;
_tail->_next = NULL;
}
else
{
Node* prev = pos->_prev;
Node* next = pos->_next;
prev->_next = next;
next->_prev = prev;
}
delete pos;
}
Node* Find(const DataType& x)
{
Node* cur = _head;
while (cur)
{
if (cur->_data == x)
{
return cur;
}
cur = cur->_next;
}
return NULL;
}
void Print()
{
Node* cur = _head;
while (cur)
{
cout<<cur->_data<<" ";
cur = cur->_next;
}
cout<<endl;
}
void Reverse()
{
Node* cur = _head;
while(cur)
{
swap(cur->_next, cur->_prev);
cur = cur->_prev;
}
swap(_head, _tail);
}
private:
Node* _head;
Node* _tail;
};
void TestList()
{
List l1;
l1.PushBack(1);
l1.PushBack(2);
l1.PushBack(3);
l1.PushBack(4);
l1.Print();
ListNode* pos = l1.Find(3);
l1.Insert(pos, 30);
pos = l1.Find(3);
l1.Erase(pos);
l1.Print();
l1.PopBack();
l1.PopBack();
l1.PopBack();
l1.PopBack();
l1.Print();
}
void TestList1()
{
List l1;
l1.PushBack(1);
l1.PushBack(2);
l1.PushBack(3);
l1.PushBack(4);
l1.Print();
l1.Reverse();
l1.Print();
List l2(l1);
l2.Print();
}
typedef int DataType;
struct ListNode
{
ListNode* _next;
ListNode* _prev;
DataType _data;
ListNode(const DataType& x)
:_data(x)
,_next(NULL)
,_prev(NULL)
{}
};
class List
{
typedef ListNode Node;
public:
List()
:_head(NULL)
,_tail(NULL)
{}
List(const List& l)
:_head(NULL)
,_tail(NULL)
{
Node* cur = l._head;
while (cur)
{
PushBack(cur->_data);
cur = cur->_next;
}
}
List& operator=(List l)
{
swap(_head, l._head);
swap(_tail, l._tail);
}
void Clear()
{
Node* cur = _head;
while (cur)
{
Node* next = cur->_next;
delete cur;
cur = next;
}
_head = _tail = NULL;
}
~List()
{
Clear();
}
void PushBack(const DataType& x)
{
if (_tail == NULL)
{
_head = _tail = new Node(x);
}
else
{
Node* tmp = new Node(x);
_tail->_next = tmp;
tmp->_prev = _tail;
_tail = tmp;
}
}
void PopBack()
{
Erase(_tail);
}
void PushFront(const DataType& x)
{
Insert(_head, x);
}
void PopFront()
{
Erase(_head);
}
void Insert(Node* pos, const DataType& x)
{
Node* tmp = new Node(x);
if (_head == pos)
{
if(_head == NULL)
{
_head = _tail = tmp;
}
else
{
tmp->_next = _head;
_head->_prev = tmp;
_head = tmp;
}
}
else
{
Node* prev = pos->_prev;
prev->_next = tmp;
tmp->_prev = prev;
tmp->_next = pos;
pos->_prev = tmp;
}
}
void Erase(Node* pos)
{
if (_head == _tail)
{
assert(_head == pos);
_head = _tail = NULL;
}
else if (pos == _head)
{
_head = _head->_next;
_head->_prev = NULL;
}
else if (pos == _tail)
{
_tail = _tail->_prev;
_tail->_next = NULL;
}
else
{
Node* prev = pos->_prev;
Node* next = pos->_next;
prev->_next = next;
next->_prev = prev;
}
delete pos;
}
Node* Find(const DataType& x)
{
Node* cur = _head;
while (cur)
{
if (cur->_data == x)
{
return cur;
}
cur = cur->_next;
}
return NULL;
}
void Print()
{
Node* cur = _head;
while (cur)
{
cout<<cur->_data<<" ";
cur = cur->_next;
}
cout<<endl;
}
void Reverse()
{
Node* cur = _head;
while(cur)
{
swap(cur->_next, cur->_prev);
cur = cur->_prev;
}
swap(_head, _tail);
}
private:
Node* _head;
Node* _tail;
};
void TestList()
{
List l1;
l1.PushBack(1);
l1.PushBack(2);
l1.PushBack(3);
l1.PushBack(4);
l1.Print();
ListNode* pos = l1.Find(3);
l1.Insert(pos, 30);
pos = l1.Find(3);
l1.Erase(pos);
l1.Print();
l1.PopBack();
l1.PopBack();
l1.PopBack();
l1.PopBack();
l1.Print();
}
void TestList1()
{
List l1;
l1.PushBack(1);
l1.PushBack(2);
l1.PushBack(3);
l1.PushBack(4);
l1.Print();
l1.Reverse();
l1.Print();
List l2(l1);
l2.Print();
}
相关文章推荐
- 双向链表的C++实现
- 多文件编程动态开辟空间实现双向链表的应用 c++版
- 双向链表的C++实现 Implement of Doubly Linked List
- C++实现顺序表及双向链表
- C++模板实现双向循环链表(有带头结点)
- C++实现双向链表
- C++实现双向链表
- C++ 构造双向链表的实现代码
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
- 构造双向链表根据访问频度动态调整位置_C++实现
- 双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)
- C++实现双向链表
- 【C++】双向链表的实现
- C++实现双向链表
- C++实现简单的双向链表
- c++:实现双向链表
- 双向链表之C++实现
- 双向链表的相关操作C++实现
- 二叉搜索树就地转双向链表二叉搜索树实现文件C++
- C++实现双向链表