- 双向链表的节点
struct Node
{
Node(const DataType& data)
: _pNext(NULL)
, _pPre(NULL)
, _data(data)
{}
Node* _pNext;
Node* _pPre;
DataType _data;
};
- 链表类的建立:
class List
{
public:
//链表的操作函数
private:
Node* BuyNode(const DataType& data)
{
return new Node(data);
}
private:
Node* _pHead;
};
- 操作函数:
List::List(size_t n, DataType data)
{
if(n<=0)
_pHead = NULL;
else if(n == 1)
{
_pHead = BuyNode(data);
}
else
{
_pHead = BuyNode(data);
Node* pri = _pHead;
while(--n)
{
pri->_pNext = BuyNode(data);
pri->_pNext->_pPre = pri;
pri = pri->_pNext;
}
}
}
List::List(const List& l)
{
if(l._pHead == NULL)
_pHead = NULL;
else
{
Node *pri = l._pHead;
_pHead = BuyNode(pri->_data);
while(pri->_pNext != NULL)
{
pri = pri->_pNext;
PushBack(pri->_data);
}
}
}
List::~List()
{
Node *pri = _pHead;
if(_pHead == NULL)
return;
while(pri->_pNext!=NULL)
{
pri = pri->_pNext;
}
Node *avi = NULL;
while(pri != NULL)
{
avi = pri->_pPre;
delete pri;
pri = avi;
}
_pHead = NULL;
}
List& List::operator=(const List& l)
{
List tmp(l);
swap(tmp._pHead,_pHead);
return *this;
}
void List::Print()
{
Node *pri = _pHead;
while(pri)
{
cout<<pri->_data<<"->";
pri = pri->_pNext;
}
cout<<"end"<<endl;
}
void List::PushBack(const DataType& data)
{
if(_pHead == NULL)
{
_pHead = BuyNode(data);
}
else
{
Node *pri = _pHead;
while(pri->_pNext != NULL)
pri = pri->_pNext;
pri->_pNext = BuyNode(data);
pri->_pNext->_pPre = pri;
}
}
void List::PopBack()
{
if(_pHead == NULL)
return;
else if((_pHead->_pNext == NULL))
{
delete _pHead;
_pHead = NULL;
}
else
{
Node *pri = _pHead;
while(pri->_pNext != NULL)
pri = pri->_pNext;
pri = pri->_pPre;
delete pri->_pNext;
pri->_pNext = NULL;
}
}
void List::PushFront(const DataType& data)
{
Node *pri = BuyNode(data);
if(_pHead == NULL)
{
_pHead = pri;
}
else
{
pri->_pNext = _pHead;
_pHead = pri;
_pHead->_pNext->_pPre = _pHead;
}
}
void List::PopFront()
{
if(_pHead==NULL)
return;
else if(_pHead->_pNext == NULL)
{
delete _pHead;
_pHead = NULL;
}
else
{
Node *pri = _pHead;
_pHead = _pHead->_pNext;
_pHead->_pPre = NULL;
delete pri;
}
}
Node* List::Find(const DataType& data)
{
Node *pri = _pHead;
while(pri != NULL)
{
if(pri->_data == data)
return pri;
pri = pri->_pNext;
}
return NULL;
}
void List::Insert(Node* pos, const DataType& data)
{
assert(pos);
if(pos == _pHead)
PushFront(data);
else
{
Node *pri = BuyNode(data);
pri->_pNext = pos;
pri->_pPre = pos->_pPre;
pos->_pPre->_pNext = pri;
pos->_pPre = pri;
}
}
void List::Erase(Node* pos)
{
assert(pos);
if(pos == _pHead)
PopFront();
else if(pos->_pNext == NULL)
PopBack();
else
{
pos->_pNext->_pPre = pos->_pPre;
pos->_pPre ->_pNext= pos->_pNext;
delete pos;
}
}
size_t List::Size()
{
int count = 0;
Node *pri = _pHead;
while(pri != NULL)
{
++count;
pri = pri->_pNext;
}
return count;
}
bool List::Empty()const
{
return !_pHead;
}