循环链表
循环链表:只要知道表中任何一个结点的地址,就能遍历表中其他任一结点。这是我写的简单的循环链表:
结点定义和抽象数据类型定义:
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
请按任意键继续. . .
这些代码是基础代码实现,优化的代码和更健壮的代码,将在开源中国网的博客中重新更新。