双向链表(Double Linked List)
双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior。
注意:
①双链表由头指针head惟一确定的。
②带头结点的双链表的某些运算变得方便。
③将头结点和尾结点链接起来,为双(向)循环链表。
头文件:
//双链表结点类
template <class T>
class dnode
{
public:
T data;
dnode* prior;
dnode* next;
};
//双链表类
template <class T>
class dlinklist
{
dnode<T>* head;
public:
void Initdlinklist();
void InsertNode(T X, int i = 0);
dnode<T>* GetNode(int i);
void DeleteNode(int i);
};
源文件:
//初始化双链表
template <class T>
void dlinklist<T>::Initdlinklist()
{
head = (dnode<T>*)malloc(sizeof(dnode<T>));
head->prior = head;
head->next = head;
}
//返回指定位置的结点
template <class T>
dnode<T>* dlinklist<T>::GetNode(int i)
{
int j = 0;
dnode<T>* p = head;
while(p->next != head && j<i)
{
p = p->next;
j++;
}
if(i == j)
return p;
return NULL;
}
//插入结点
template <class T>
void dlinklist<T>::InsertNode(T x, int i)
{
dnode<T>* p = NULL;
if(i == 0)
{
p = head->prior;
}
else
{
p = GetNode(i-1);
}
if(p == NULL)
{
cout<<"error";
exit(1);
}
dnode<T>* data = (dnode<T>*)malloc(sizeof(dnode<T>));
data->data = x;
data->prior = p;
data->next = p->next;
p->next->prior = data;
p->next = data;
}
//删除结点
template <class T>
void dlinklist<T>::DeleteNode(int i)
{
dnode<T>* p = GetNode(i);
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
双链表
最新推荐文章于 2025-03-07 19:43:50 发布