#include<iostream>
using namespace std;
// 结构体定义
typedef struct LNode
{
int index;
struct LNode* next;
}LNode,*LinkList;
// 循环链表初始化
void InitList(LinkList &L)
{
L=new LNode;
// 这里不带头结点,会更方便
L->index=1;
L->next=L;
cout<<"循环链表初始化完成"<<endl;
}
// 循环链表建立
void TailInsert(LinkList &L,int n)
{
LNode *s,*r=L;
for(int i=2;i<=n;i++)
{
s=new LNode;
s->index=i;
s->next=r->next;
r->next=s;
r=s;
}
cout<<"尾插法建立循环链表完成"<<endl;
}
// 找到第m个结点的地址
LNode * Search(LinkList L,LNode *start,int m)
{
LNode *p=start;
int j=1;
while(j<m)
{
p=p->next;
j++;
}
return p;
}
// 整表打印
void Print(LinkList L)
{
LNode* p=L;
cout << "循环链表内容:"<<endl;
while (p->next!=L)
{
cout << p->index<<" ";
p=p->next;
}
cout<<p->index<<endl;
}
int main()
{
LinkList L;
cout<<"请输入约瑟夫环的长度:"<<endl;
int n; cin>>n;
InitList(L);
TailInsert(L,n);
Print(L);
cout<<"请输入每几个结点出环:"<<endl;
int m; cin>>m;
LNode *p=L,*target,*prior;
cout<<"出列结果如下:"<<endl;
while(p->next!=p) // 当链表表长为1时停止循环
{
// 找到目标结点target和其前置结点prior
prior=Search(L,p,m-1);
target=Search(L,p,m);
// 输出
cout<<target->index<<" ";
// 更新结点p
p=target->next;
// 删除结点target
prior->next=target->next;
free(target);
}
cout<<p->index<<endl;
return 0;
}
Cpp循环单链表实现约瑟夫环
最新推荐文章于 2023-07-01 20:54:40 发布