双向链表
双向链表是为了解决在链表中访问直接前驱和直接后继的问题。很简单:
抽象类定义:
//双向链表结点结构体
struct DouLinkNode
{
int data;
DouLinkNode *lLink,*rLink;
};
//双向链表抽象数据类型定义
class DouLinkList
{
public:
//构造函数和析构函数
DouLinkList()
{
head=NULL;
current=head;
}
~DouLinkList(){}
//插入、删除、搜索、输出 dir=0,前驱方向 dir=1,后继方向
bool Insert(int i,int x,int dir);
bool Delete(int i,int dir);
DouLinkNode *Search(int i,int dir);
void Output(int dir);
private:
DouLinkNode *head;
DouLinkNode *current; //定位指针
};
主要算法:
/*
插入算法:
1、
*/
bool DouLinkList::Insert(int i,int x,int dir)
{
DouLinkNode *newNode;
//如果插入的是第一个结点
if(head==NULL&&i==0)
{
head=new DouLinkNode;
if(head==NULL)
{
cout<<"内存分配失败"<<endl;
return false;
}
//创建一个头结点,并处理其左右链接域
head->data=x;
head->lLink=head->rLink=head; //初始值
current=head;
return true;
}
else
{
if(dir==1) //按照后继方向插入,先处理后继结点
{
newNode=new DouLinkNode;
if(newNode==NULL)
{
cout<<"内存分配失败"<<endl;
return false;
}
newNode->data=x;
//1、先处理新结点的后继
newNode->rLink=current->rLink; //统一表达,current->rLink在下一步会被改变
current->rLink=newNode;
newNode->rLink->lLink=newNode; //统一表达,转大圈
newNode->lLink=current;
//顺序插入
current=current->rLink;
}
else //先处理前驱结点,转大圈
{
newNode=new DouLinkNode;
if(newNode==NULL)
{
cout<<"内存分配失败"<<endl;
return false;
}
newNode->data=x;
newNode->lLink=current->lLink;
current->lLink=newNode;
newNode->lLink->rLink=newNode;
newNode->rLink=current;
//顺序插入,相当于定位
current=current->lLink;
}
}
return true;
}
/*
输出算法:
1、
*/
void DouLinkList::Output(int dir)
{
DouLinkNode *output=head;
if(dir==1)
{
while(output->rLink!=head)
{
cout<<"-------------------------------"<<endl;
cout<<"该结点值为:"<<output->data<<endl;
cout<<"前驱结点为:"<<output->lLink->data<<" ";
cout<<"后继结点为:"<<output->rLink->data<<endl;
cout<<"-------------------------------"<<endl;
output=output->rLink;
}
cout<<"-------------------------------"<<endl;
cout<<"该结点值为:"<<output->data<<endl;
cout<<"前驱结点为:"<<output->lLink->data<<" ";
cout<<"后继结点为:"<<output->rLink->data<<endl;
cout<<"-------------------------------"<<endl;
}
else
{
while(output->lLink!=head)
{
cout<<"-------------------------------"<<endl;
cout<<"该结点值为:"<<output->data<<endl;
cout<<"前驱结点为:"<<output->lLink->data<<" ";
cout<<"后继结点为:"<<output->rLink->data<<endl;
cout<<"-------------------------------"<<endl;
output=output->lLink;
}
cout<<"-------------------------------"<<endl;
cout<<"该结点值为:"<<output->data<<endl;
cout<<"前驱结点为:"<<output->lLink->data<<" ";
cout<<"后继结点为:"<<output->rLink->data<<endl;
cout<<"-------------------------------"<<endl;
}
}
/*
删除算法:
1、
*/
bool DouLinkList::Delete(int i,int dir)
{
int count=0;
DouLinkNode *p;
DouLinkNode *current=head;
while(count!=i-1)
{
current=current->rLink;
count++;
}
p=current->rLink;
current->rLink=p->rLink;
p->rLink->lLink=current->lLink;
delete p;
return true;
}
/*
搜索算法:
1、
*/
DouLinkNode *DouLinkList::Search(int i,int dir)
{
int count=0;
DouLinkNode *current=head;
while(count!=i)
{
current=current->rLink;
count++;
}
return current;
}
主程序:
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"------双向链表-------"<<endl;
DouLinkList dll;
dll.Insert(0,0,0);
dll.Insert(1,1,0);
dll.Insert(2,2,0);
dll.Insert(3,3,0);
dll.Insert(4,4,0);
dll.Insert(5,5,0);
dll.Output(1);
cout<<"搜索到的结点是"<<dll.Search(3,1)->data<<endl;
dll.Delete(3,1);
dll.Output(1);
return 0;
}
测试结果:
------双向链表-------
-------------------------------
该结点值为:0
前驱结点为:1 后继结点为:5
-------------------------------
-------------------------------
该结点值为:5
前驱结点为:0 后继结点为:4
-------------------------------
-------------------------------
该结点值为:4
前驱结点为:5 后继结点为:3
-------------------------------
-------------------------------
该结点值为:3
前驱结点为:4 后继结点为:2
-------------------------------
-------------------------------
该结点值为:2
前驱结点为:3 后继结点为:1
-------------------------------
-------------------------------
该结点值为:1
前驱结点为:2 后继结点为:0
-------------------------------
搜索到的结点是3
-------------------------------
该结点值为:0
前驱结点为:1 后继结点为:5
-------------------------------
-------------------------------
该结点值为:5
前驱结点为:0 后继结点为:4
-------------------------------
-------------------------------
该结点值为:4
前驱结点为:5 后继结点为:2
-------------------------------
-------------------------------
该结点值为:2
前驱结点为:5 后继结点为:1
-------------------------------
-------------------------------
该结点值为:1
前驱结点为:2 后继结点为:0
-------------------------------
请按任意键继续. . .

浙公网安备 33010602011771号