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

C++ 双循环链表简单实现

2017-03-30 11:22 453 查看
c++ 双循环链表的部分功能实现

需要功能后续添加

#ifndef DLINKLIST_H
#define DLINKLIST_H

typedef int Status;
#define OK 0;
#define ERROR -1;

template <typename T>
class DLinkList
{
struct DNode
{
T date;
DNode *prior;
DNode *next;
};

typedef DNode *DNodePointer;

public:
DLinkList();
~DLinkList();

public:
void push_back(const T d);
void pop();
int size();
void print();
private:
DNodePointer head;
DNodePointer cur;
int length;
};

template <typename T>
DLinkList<T>::DLinkList()
{
head = NULL;
length = 0;
}

template <typename T>
DLinkList<T>::~DLinkList()
{
//释放点所有节点
while(head != cur){
DNodePointer src = head;
head = head->next;
delete src;
--length;
}
if (cur){
delete cur;
--length;
}
}

template <typename T>
void DLinkList<T>::push_back(const T d)
{
DNodePointer src = new DNode;
src->date = d;

if (!head){
head = src;
head->next = head->prior = head;
}
else{
//当前节点的后继连上新节点
cur->next = src;
//新节点的前驱连上当前节点
src->prior = cur;
//新节点的后继连上头节点
src->next = head;
//头节点的前驱连上新节点
head->prior = src;
}

cur = src;
++length;
}

template <typename T>
void DLinkList<T>::pop(){
if (length){
DNodePointer src = cur->prior;
src->next = head;
head->prior = src;
//删除尾节点
delete cur;
--length;
if (length){
cur = src;
}
else{
cur = NULL;
head = NULL;
}
}
}

template <typename T>
int DLinkList<T>::size(){
return length;
}

template <typename T>
void DLinkList<T>::print(){
//利用长度的信息来输出
int number = length;
while (number){
cout << head->date << "\t";
head = head->next;
--number;
}
cout << endl;
}
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++-双链表