循环链表

循环链表:只要知道表中任何一个结点的地址,就能遍历表中其他任一结点。这是我写的简单的循环链表:

结点定义和抽象数据类型定义:

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
请按任意键继续. . .

这些代码是基础代码实现,优化的代码和更健壮的代码,将在开源中国网的博客中重新更新。

posted @ 2013-05-24 13:25  李VS超  阅读(238)  评论(0编辑  收藏  举报