//循环链表有头节点,头节点为空,尾部指向头节点
#define Elemtype int
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct Node
{
Elemtype data;
struct Node* next;
}Node,*Circlelist;
Circlelist InitCirclelist()//创建循环链表
{
Circlelist L, p,q;
L=(Circlelist)malloc(sizeof(Node));
p=L;
int n;
cout<<"请输入循环链表结点数目:";
cin>>n;
int num;
for(int i=1;i<=n;i++)
{
cout<<"请输入结点:";
cin>>num;
q=(Circlelist)malloc(sizeof(Node));
q->data=num;
p->next=q;
p=q;
}
p->next=L;
cout<<"输入完毕"<<endl;
return L;
}
void Printlist(Circlelist L)//打印循环链表
{
Circlelist p,q;
p=L;
int i=1;
while(p->next!=L)
{
p=p->next;
cout<<"第"<<i<<"个结点数据为"<<p->data<<endl;
i++;
}
cout<<"打印完毕"<<endl;
}
int Lengthlist(Circlelist L)//计算循环链表节点数,加入到killNode中作为比较条件
{
Circlelist p,q;
p=L;
int i=0;
while(p->next!=L)
{
p=p->next;
i++;
}
// cout<<"长度为:"<<i<<endl;
return i;
}
int CountLengthlist(Circlelist L)//计算循环链表节点数并输出长度
{
Circlelist p,q;
p=L;
int i=0;
while(p->next!=L)
{
p=p->next;
i++;
}
cout<<"链表长度为:"<<i<<endl;
return i;
}
void KillNode(Circlelist L)//约瑟夫环的部分
{
Circlelist p,q;
p=L;
int lengthlist=Lengthlist(L);
for(int i=1;i<=lengthlist-1;i++)//这里一开始把Lengthlist(L)当作与i的比较条件,殊不知在每一轮for循环中,L的长度是不断减小的,呜呜呜呜!!以后涉及到比较的条件,都用常量来表示!!!
{
cout<<"第"<<i<<"轮开始"<<endl;
CountLengthlist(L);
cout<<"****************************"<<endl;
for(int j=1;j<3;j++)
{
if(p->next==L)
{
p=p->next->next;
cout<<p->data<<endl;
//
}
else{
// cout<<p->next->data<<"我是L"<<endl;
p=p->next;
cout<<p->data<<endl;
// if(p->next==L)
// {
// p=p->next->next;
// cout<<p->data<<"ccccccc"<<endl;
//
// }
}
}
if(p->next!=L )
{
cout<<p->next->data<<"死亡结点"<<endl;
q=p->next;
p->next=p->next->next;
free(q);
// cout<<q->data;
}
else{
p=p->next;
cout<<p->next->data<<"死亡结点"<<endl;
q=p->next;
p->next=p->next->next;
free(q);
}
}
if(p!=L) //判断最后的存活结点时需要注意结点必须是有效的
{
cout<<"存活结点:"<<p->data<<endl;
}
else{
cout<<"存活结点"<<p->next->data;
}
}
int main()
{
Circlelist S;
S=InitCirclelist();
Printlist(S);
// Lengthlist(S);
KillNode(S);
}