循环链表:只要知道表中任何一个结点的地址,就能遍历表中其他任一结点。这是我写的简单的循环链表:
结点定义和抽象数据类型定义:
struct CircleNode
{
int data;
CircleNode *link;
};
//类定义
class CircleList
{
public:
//构造函数析构函数
CircleList()
{
first=last=NULL; //初始化头指针和尾指针
}
~CircleList(){}
//插入、删除、输出、搜索
CircleNode *Search(int i);
bool Insert(int i,int x);
bool Delete(int i);
void Output();
private:
CircleNode *first,*last;
};
函数功能实现:
/*
插入结点算法:
1、画图,分析两种简单情况,立得算法。
*/
bool CircleList::Insert(int i,int x)
{
CircleNode *newNode;
//如果循环链表为空,淡出处理
if(first==NULL&&i==0)
{
first=new CircleNode;
if(first==NULL)
{
cout<<"新结点建立失败"<<endl;
return false;
}
else
{
last=first;
last->link=first;
first->data=x;
}
return true;
}
else //不是第一个结点
{
newNode=new CircleNode;
if(newNode==NULL)
{
cout<<"新结点建立失败"<<endl;
return false;
}
newNode->link=last->link;
last->link=newNode;
newNode->data=x;
last=last->link;
}
return true;
}
/*
输出循环链表算法:
1、
*/
void CircleList::Output()
{
CircleNode *current=first; //循环链表检测指针
while(current->link!=first)
{
cout<<current->data<<" ";
current=current->link;
}
cout<<current->data<<" ";
cout<<endl;
}
/*
搜索算法:
1、
*/
CircleNode *CircleList::Search(int i)
{
CircleNode *current=first;
int count=0;
while(count!=i)
{
current=current->link;
count++;
}
return current;
}
/*
删除结点算法:
1、
*/
bool CircleList::Delete(int i)
{
CircleNode *p;
CircleNode *current=first;
int count=0;
while(count<i-1)
{
current=current->link;
count++;
}
//current指针已经指向了需要删除的结点的前一个结点
p=current->link; //指向要删除的结点
current->link=p->link;
delete p;
return true;
}
测试代码:
cout<<"-----------循环链表----------"<<endl;
CircleList cl;
cl.Insert(0,1);
cl.Insert(1,2);
cl.Insert(2,3);
cl.Insert(3,4);
cl.Insert(4,5);
cl.Output();
cout<<"搜索算法:"<<cl.Search(2)->data<<endl;
if(cl.Delete(2))
cout<<"删除成功"<<endl;
cl.Output();
测试结果:
-----------循环链表----------
1 2 3 4 5
搜索算法:3
删除成功
1 2 4 5
请按任意键继续. . .
这些代码是基础代码实现,优化的代码和更健壮的代码,将在开源中国网的博客中重新更新。