数据结构之双向循环链表
根据上一篇数据结构之单向链表这次是双向循环链表:
双向循环链表就是在单向链表上加上一个前驱指针,尾指针指向头结点,头结点指向尾指针,直接上图看。
结点代码如下:
//DLNode.h 双向链表结点类型结构体
#ifndef _DLNODE_H_
#define _DLNODE_H_
template<typename T>struct DLNode
{
T data;
DLNode<T> *prior, *next;
};
#endif
- 双向链表插入结点:
代码如下:
//寻找结点“i”结点的地址
DLNode<T>* GetElemP(int i)const
{
int j=0;
DLNode<T> *p=Head;
if(i<0)
return NULL;
if(i==0)
return p;
do
{
p=p->next;
j++;
}while(p!=Head && j<i);
if(p==Head)
return NULL;
else
return p;
}
//插入新结点
bool ListInsert(int i, T e)
{
DLNode<T> *s, *p=GetElemP(i-1);//寻找插入结点“i”的前一个结点的地址并赋值给p
if(p==NULL)
return false;
s=new DLNode<T>;
if(s==NULL)
return false;
s->data=e;
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
return true;
}
- 完整代码如下:
//DLNode.h 双向链表结点类型结构体
#ifndef _DLNODE_H_
#define _DLNODE_H_
template<typename T>struct DLNode
{
T data;
DLNode<T> *prior, *next;
};
#endif
//DLinkList.h 双向链表的类(DLinkList类)
#ifndef _DLINKLIST_H_
#define _DLINKLIST_H_
#include "DLNode.h"
template<typename T>class DLinkList
{
private:
DLNode<T> *Head;
DLNode<T>* GetElemP(int i)const
{
int j=0;
DLNode<T> *p=Head;
if(i<0)
return NULL;
if(i==0)
return p;
do
{
p=p->next;
j++;
}while(p!=Head && j<i);
if(p==Head)
return NULL;
else
return p;
}
public:
DLinkList()
{
Head=new DLNode<T>;
assert(Head!=NULL);
Head->next=Head->prior=Head;
}
~DLinkList()
{
ClearList();
delete Head;
}
void ClearList()const
{
DLNode<T> *p=Head->next;
while(p!=Head)
{
p=p->next;
delete p->prior;
}
Head->next=Head->prior=Head;
}
bool ListEmpty()const
{
return Head->next==Head;
}
int ListLength()const
{
int i=0;
DLNode<T> *p=Head->next;
while(p!=Head)
{
i++;
p=p->next;
}
return i;
}
bool ListInsert(int i, T e)
{
DLNode<T> *s, *p=GetElemP(i-1);
if(p==NULL)
return false;
s=new DLNode<T>;
if(s==NULL)
return false;
s->data=e;
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
return true;
}
bool ListDelete(int i, T &e)const
{
DLNode<T> *p=GetElemP(i);
if(i<=0 || p==NULL)
return false;
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
return true;
}
};
#endif