版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaodu655/article/details/81450311
#include<iostream>
using namespace std;
struct ListNode
{
ListNode()
:_data(0)
,_prev(0)
, _next(0)
{}
ListNode( const int data)
:_data(data)
, _prev(0)
, _next(0)
{}
int _data;
ListNode*_prev;
ListNode*_next;
};
class List
{
typedef ListNode Node;
public:
List()
:pHead(new Node(0))
{
pHead->_next = pHead;
pHead->_prev = pHead;
}
List(int size, int data)
:pHead(new Node(0))
{
pHead->_next = pHead;
pHead->_prev = pHead;
while (size--)
{
PushBack(data);
}
}
List(const List&l)//拷贝构造函数
:pHead(new Node)
{
pHead->_next = pHead;
pHead->_prev = pHead;
Node*cur = l.pHead->_next;
while (cur != l.pHead)
{
this->PushBack(cur->_data);
cur = cur->_next;
}
}
void PushBack(int data);//尾插
void PopBack();//尾删
void PushFront(int data);//头插
void PopFront(); //头删
void insert(Node*pos, int data);//任意位置插入
void Erase(Node*pos);//任意位置删除
Node* Find(int data);//寻找指定元素
void clear();//清空
bool Empty()const;//判断链表是否为空
~List()
{
clear();
delete pHead;
pHead = NULL;
}
friend ostream&operator<<(ostream&_cout, List& l);
private:
ListNode*pHead;
};
void List::PushBack(int data)
{
/*Node*newNode = new Node(data);
Node*cur = pHead->_prev;
cur->_next = newNode;
newNode->_prev = cur;
newNode->_next = pHead;
pHead->_prev = cur;*/
Node* newNode = new Node(data);
newNode->_prev = pHead->_prev;
newNode->_next = pHead;
pHead->_prev = newNode;
newNode->_prev->_next = newNode;
}
void List::PopBack()
{
Node*pDel = pHead->_prev;
pDel->_prev->_next = pHead;
pHead->_prev = pDel->_prev;
delete pDel;
}
void List::PushFront(int data)
{
Node*newNode = new Node(data);
newNode->_next = pHead->_next;
newNode->_prev = pHead;
pHead->_next = newNode;
pHead->_next->_prev = newNode;
}
void List::PopFront()
{
Node*delNode = pHead->_next;
Node*pNext = pHead->_next->_next;
delete delNode;
pHead->_next = pNext;
pNext->_prev = pHead;
}
void List::insert(Node*pos, int data)
{
Node*newNode = new Node(data);
newNode->_next = pos;
newNode->_prev = pos->_prev;
pos->_prev->_next = newNode;
pos->_prev = newNode;
}
void List::Erase(Node*pos)
{
Node*NextNode = pos->_next;
Node*prevNode = pos->_prev;
prevNode->_next = NextNode;
NextNode->_prev = prevNode;
delete pos;
}
ListNode* List::Find(int data)//寻找指定元素
{
Node*pcur = pHead;
while (pcur->_next != pHead)
{
if (pcur->_data == data)
{
return pcur;
}
pcur = pcur->_next;
}
return NULL;
}
void List::clear()
{
/*Node*cur = pHead->_next;
while (cur != pHead)
{
Node*temp = cur;
cur = cur->_next;
delete temp;
}*/
Node* cur = pHead->_next;
while (cur != pHead)
{
Node* tmp = cur->_next;
delete cur;
cur = tmp;
}
pHead->_next = pHead;
pHead->_prev = pHead;
}
bool List::Empty()const//判断链表是否为空
{
return pHead == pHead->_next;
}
ostream&operator<<(ostream&_cout, List& l)
{
ListNode* cur = l.pHead;
while (cur->_next != l.pHead)
{
_cout << cur->_data << "->";
cur = cur->_next;
}
_cout << cur->_data << "->";
_cout << "NULL";
return _cout;
}
void test1()
{
List l;
l.PushBack(1);
l.PushBack(2);
l.PushBack(3);
l.PushBack(4);
l.PushBack(5);
cout << "尾插" << endl;
cout << l << endl;
l.PushFront(6);
l.PushFront(7);
l.PushFront(8);
l.PushFront(9);
l.PushFront(10);
cout << "头插" << endl;
cout << l << endl;
ListNode*pos = l.Find(2);
cout << "查找指定位置" << endl;
cout << l << endl;
l.PopBack();
cout << "尾删" << endl;
cout << l << endl;
l.PopFront();
cout << "头删" << endl;
cout << l << endl;
cout << "指定位置删除" << endl;
l.Erase(pos);
cout << l << endl;
l.clear();
}
void test2()
{
List l1(5, 100);
cout << l1 << endl;
}
int main()
{
test1();
test2();
system("pause");
return 0;
}