以下代码构造一个带附加头结点的双向链表:
/////////////////////////////////////////////////////////////
//构造函数
/////////////////////////////////////////////////////////////
template<class T>
DblList<T>::DblList<T>(T uniqueVal)
{
//建立一个附加头结点,uniqueVal用于存放一些特殊用途的数
first=new DblNode<T>(uniqueVal);
if(first==NULL)
{
cerr<<"内存分配出错!"<<endl;
exit(1);
};
//置为只含附加头结点的空链表
first->lLink=first->rLink=first;
};
/////////////////////////////////////////////////构造函数结束
以下代码逆转一个链表的所有指针:
/////////////////////////////////////////////////////////////
//reverseList()函数
//逆转单链表
/////////////////////////////////////////////////////////////
template<class T>
void List<T>::reverseList()
{
if(first==NULL)
{
cout<<"链表为空!"<<endl;
exit(1);
};
if(first->link==NULL)
{
cout<<"链表中只有一个元素!";
exit(1);
}
LinkNode<T>* pre;
LinkNode<T>* p;
LinkNode<T>* next;
pre=first;
p=first->link;
next=first->link;
while(p!=NULL)
{
//指向断点后的第二个结点
next=next->link;
//让断点后的第一个结点的指针域指向
//断点前的最后一个结点
p->link=pre;
//pre向后推进一格
pre=p;
//p和next指向断点后的第一个结点
p=next;
}
//把逆转后的尾结点(即原来的头结点)
//的指针域设为NULL
first->link=NULL;
//显示逆转后的的链表的所有元素
//因为本链表在逆转前是含有附加头结点的、
//所以反向遍历的时候可以不用遍历附加头结点
while(pre->link!=NULL)
{
cout<<pre->data<<" ";
pre=pre->link;
}
cout<<endl;
}
////////////////////////////////////////reverseList()函数结束
得到双向链表第i个元素的指针(有左右之分)
/////////////////////////////////////////////////////////////
//Locate()函数
//在得到序号为i的结点的指针,d=0按前驱方向,d!=0按后继方向
/////////////////////////////////////////////////////////////
template<class T>
DblNode<T>* DblList<T>::Locate(int i,int d)
{
//游标
DblNode<T>* ptr=first;
//越界情况处理
if(i<0||i>Length())
{
cout<<"给出的序号越界!"<<endl;
exit(1);
};
//如果不越界
//如果按前驱遍历
if(d==0)
{
for(int k=0;k<i;k++)
{
//指针向左推进一格
ptr=ptr->lLink;
}
return ptr;
}
//如果按后继遍历
else
{
for(int k=0;k<i;k++)
{
//指针向右推进一格
ptr=ptr->rLink;
}
return ptr;
}
};
/////////////////////////////////////////////Locate()函数结束