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

【C++】双向链表的实现

2015-09-05 20:14 513 查看
该双向链表的头为指针都指向空

#include<iostream>
using namespace std;

typedef int DataType;

class LinkNode
{
friend class List;
friend void Test1();
friend void Test3();
friend void Test4();
public:
LinkNode(const DataType& x)
:_data(x)
,_prev(NULL)
,_next(NULL)
{}

private:
DataType _data;
LinkNode* _prev;
LinkNode* _next;
};

class List
{
public:
List()
:_head(NULL)
,_tail(NULL)
{}
~List()
{}
List(const List& l)
{}
List& operator=(const List& l)
{}

public:
void PushBack(const DataType& x)
{
//空链表
//1个及以上节点
if(_head == NULL)
{
_head = new LinkNode(x);
_tail = _head;
}
else
{
LinkNode* tmp = new LinkNode(x);
_tail->_next = tmp;
tmp->_prev = _tail;
_tail = tmp;
}

}
void PopBack()
{
//空链表
//一个节点
//两个及以上节点
if(_head == NULL)
{
cout<<"您要删除的链表为空,请先创建链表"<<endl;
return;
}
else if(_head == _tail)
{
delete _head;
_head = NULL;
_tail = NULL;
}
else
{
LinkNode* del = _tail;
_tail = _tail->_prev ;
_tail->_next = NULL;
delete del;
}

}
void PushFront(const DataType& x)
{
//空链表
//一个及以上节点
if(_head == NULL)
{
_head = new LinkNode(x);
_tail = _head;
}
else
{
LinkNode* tmp = new LinkNode(x);
tmp->_next = _head;
_head->_prev = tmp;
_head = tmp;
}
}
void PopFront()
{
//链表为空
//一个节点
//两个及以上节点
if(_head == NULL)
{
cout<<"您要删除的链表为空,请先创建链表"<<endl;
return;
}
else if(_head == _tail)
{
delete _head;
_head = NULL;
_tail = NULL;
}
else
{
LinkNode* del = _head;
_head = _head->_next ;
_head->_prev = NULL;
delete del;
}

}
void Print()
{
if(_head == NULL)
{
cout<<"您要输出的链表为空,请先创建链表"<<endl;
return;
}
else
{
LinkNode* begin = _head;
while(begin != _tail)
{
cout<<begin->_data<<"->";
begin = begin->_next ;
}
cout<<begin->_data<<endl;
}
}

public:
void Insert(LinkNode* pos, const DataType& x)
{
//位置无效
//尾节点之后插
//中间插

if(pos == NULL)
{
cout<<"找不到该位置,请重新选择位置插入"<<endl;
return;
}
else if(pos == _tail)
{
LinkNode* tmp = new LinkNode(x);
_tail->_next = tmp;
tmp->_prev = _tail;

_tail = tmp;
}
else
{
LinkNode* tmp = new LinkNode(x);
pos->_next ->_prev = tmp;
tmp->_next = pos->_next ;
pos->_next = tmp;
tmp->_prev = pos;

//另一种写法
}
}
LinkNode* Find(const DataType& x)
{
if(_head == _tail)
{
if(_head->_data == x)
{
return _head;
}
else
{
cout<<"没有找到该节点"<<endl;
}
}
else
{
LinkNode* begin = _head;
while(begin != _tail)
{
if(begin->_data == x)
{
return begin;
}
else
{
begin = begin->_next ;
}
}
if(begin->_data == x)
{
return begin;
}
else
{
cout<<"没有找到该节点"<<endl;
}
}
}
void Erase(LinkNode* del)
{
//节点无效
//只有一个节点
//多个节点(处理del是头尾的情况)
if(del == NULL)
{
cout<<"找不到该节点"<<endl;
return;
}
else if(_head == _tail)
{
if(_head == del)
{
delete _head;
_head = NULL;
_tail = NULL;
}
else
{
cout<<"找不到该节点"<<endl;
return;
}
}
else
{
//del为头
//del为尾
//del在中间
if(del == _head)
{
PopFront();
}
else if(del == _tail)
{
PopBack();
}
else
{
LinkNode* tmp1 = del->_prev ;
LinkNode* tmp2 = del->_next ;
tmp1->_next = tmp2;
tmp2->_prev = tmp1;
delete del;
}
}

}
void Reverse()
{
LinkNode* tmp1 = _head;
LinkNode* tmp2 = _tail;
while(tmp1 != tmp2 && tmp2->_next != tmp1)
{
DataType a = tmp1->_data ;
tmp1->_data = tmp2->_data ;
tmp2->_data = a;

tmp1 = tmp1->_next ;
tmp2 = tmp2->_prev ;
}
}

private:
LinkNode* _head;
LinkNode* _tail;
};

void Test1()
{
List s1;
s1.PushBack(1);
s1.PushBack(2);
s1.PushBack(3);
s1.PushBack(4);
s1.Print();
/*s1.PopBack ();
s1.PopBack ();
s1.PopBack ();
s1.PopBack ();
s1.PopBack ();
s1.Print();*/
LinkNode* ret1 = s1.Find(1);
cout<<ret1->_data<<endl;
LinkNode* ret2 = s1.Find(2);
cout<<ret2->_data<<endl;
LinkNode* ret3 = s1.Find(3);
cout<<ret3->_data<<endl;
LinkNode* ret4 = s1.Find(4);
cout<<ret4->_data<<endl;
s1.Insert (ret1,5);
s1.Print();
s1.Insert (ret2,6);
s1.Print();
s1.Insert (ret3,7);
s1.Print();
s1.Insert (ret4,8);
s1.Print();

}
void Test2()
{
List s1;
s1.PushFront(4);
s1.PushFront(3);
s1.PushFront(2);
s1.PushFront(1);
s1.Print();
s1.PopFront ();
s1.PopFront ();
s1.PopFront ();
s1.PopFront ();
s1.PopFront ();
s1.Print();

}
void Test3()
{
List s1;
s1.PushBack(1);
s1.PushBack(2);
s1.PushBack(3);
s1.PushBack(4);
s1.Print();
LinkNode* ret1 = s1.Find(1);
cout<<ret1->_data<<endl;
LinkNode* ret2 = s1.Find(2);
cout<<ret2->_data<<endl;
LinkNode* ret3 = s1.Find(3);
cout<<ret3->_data<<endl;
LinkNode* ret4 = s1.Find(4);
cout<<ret4->_data<<endl;
s1.Erase (ret1);
s1.Print();
s1.Erase (ret2);
s1.Print();
s1.Erase (ret3);
s1.Print();
s1.Erase (ret4);
s1.Print();
}
void Test4()
{
List s1;
s1.PushBack(1);
s1.PushBack(2);
s1.PushBack(3);
s1.PushBack(4);
//s1.PushBack(5);
s1.Print();
s1.Reverse();
s1.Print();
}

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