您的位置:首页 > 其它

双向链表的几种实现

2016-06-09 22:01 417 查看
#pragma once
#include<iostream>
using namespace std;
typedef int DataType;
//结构体的定义
struct Node
{
Node(const DataType& d)
:_data(d)
, _prev(NULL)
, _next(NULL)
{}
Node* _next;
Node* _prev;
DataType _data;
};
//双向链表类的定义
class DList
{
friend ostream& operator<<(ostream& os,DList& d);
public:
DList()//构造函数
:_head(NULL)
,_tail(NULL)
{}
~DList()//析构函数
{
Node* cur = _head;
while (cur)
{
Node* del = cur;
cur = cur->_next;
delete del;
}
}
public:
void PushBack(const DataType& d);//后插
void PushFront(const DataType& d);//前插
void PopBack();//后出
void PopFront();//前出
void Find(const DataType& d);//查找
void Insert(const DataType& d);//在指定位置插入
void BubbSort();//冒泡排序
void Reverse();//逆序
void Remove(const DataType& d);//删除指定的元素
void RemoveAll(const DataType& d);//删除所有指定的元素
void Erase(Node* pos);//删除指定节点
private:
Node* _head;//头指针
Node* _tail;//尾指针
};

#include"DList.h"

ostream& operator<<(ostream& os,DList& d)//输出运算符的重载
{
Node*cur = d._head;
while (cur)
{
os << cur->_data <<"<=>";
cur = cur->_next;
}
os <<"over";
return os;
}
void DList::PushBack(const DataType& d)
{
Node* newNode = new Node(d);
if (_head == NULL)
{
_head = newNode;
_tail = _head;
}
else
{
_tail->_next = newNode;
newNode->_prev = _tail;
_tail = newNode;
}
}
void DList::PushFront(const DataType& d)
{
Node* newNode = new Node(d);
if (_head == NULL)
{
_head = newNode;
_tail = _head;
}
else
{
newNode->_next = _head;
_head->_prev = newNode;
_head = newNode;
}
}
void DList::PopBack()
{
if (_head == NULL)
{
return;
}
else if (_head == _tail)
{
delete _head;
_head = NULL;
_tail = NULL;
}
else
{
_tail = _tail->_prev;
delete _tail->_next;
_tail->_next = NULL;
}
}
void DList::PopFront()
{
if (_head = NULL)
{
return;
}
else if (_head == _tail)
{
delete _head;
_head = NULL;
_tail = NULL;
return;
}
else
{
Node* del = _head;
_head = _head->_next;
_head->_prev = NULL;
delete del;
}
}

#include"DList.h"
void test1()
{
DList l1;
l1.PushBack(1);
l1.PushBack(2);
l1.PushBack(3);
l1.PushBack(4);
cout << l1 << endl;
l1.PopBack();
l1.PopBack();
cout << l1 << endl;
l1.PopBack();
l1.PopBack();
l1.PopBack();
cout << l1 << endl;
}
int main()
{
test1();
getchar();
return 0;
}

本文出自 “顺势而为” 博客,请务必保留此出处http://lk123456.blog.51cto.com/10831443/1752964
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: