声明循环链表类
class Clink
{
Clink *head;
Clink *next;
Clink *p;
Clink *p2;
Clink *p3;
string name;
public:
Clink()
{
name="“吴香玉”";
}
Clink* build();
void show(Clink *HEAD);
Clink* C_delete(Clink *HEAD);
};
Clink* Clink::build()//建立循环链表
{
head=this;
p=head;
int i=0;
while(p->name!="0")
{
p2=new Clink;
p2->name=sentence[i++];
p->next=p2;//以上几步与建立单向链表相同
p3=p;//保存上一个节点
p=p2;//p移向刚建立的节点
}
p3->next=head;//将0之前的一个节点的next指向头节点,构成一个圈
return head;
}
Clink* Clink::C_delete(Clink *HEAD)
{
string sen;
p2=HEAD;//p2定位至头节点
p=HEAD->next;//p为p2下一个节点
sen="个";
while(p->name!=sen)//找到要删除的节点
{
p2=p;//保存p所在节点
p=p->next;//p移动至下一个节点
}
p2->next=p->next;//将要删除的节点上一个节点的next,指向要删除的节点的下一个节点
if(p==HEAD) return HEAD->next;//如果要删除的是头节点,那么头节点的下一个节点就成了新的头节点
else return HEAD;//如果要删除的不是头节点那么链表的头节点就没有变化
}
void Clink::show(Clink *HEAD)
{
p=HEAD;
do
{
cout<<p->name;
p=p->next;
}while(p!=HEAD);//因为是循环链表,所以当P第二次到达头节点的时候就不要输出了
cout<<endl;
}
以上就是循环链表中删除一个元素,本机器觉得写的时候应该把查找那个元素与删除元素分成两个函数写,这样可能好一些