循环链表解决约瑟夫问题

#include<stdio.h>
#include<stdlib.h>
typedef struct RLink{
int id;
struct RLink* next;
}rlink;
rlink* initLink(int n)//创建循环链表
{
rlink* p=(rlink*)malloc(sizeof(rlink));//头结点
rlink* temp=p;
rlink* t;
for(int i=1;i<=n;i++)
{
t=(rlink*)malloc(sizeof(rlink));
t->id=i;
t->next=NULL;
temp->next=t;
temp=temp->next;
}
temp->next=p;
return p;
}

void display(rlink* p)
{
rlink* temp=p;
printf(“链表现状:”);
while(temp->next!=p)
{
temp=temp->next;
printf("%d “,temp->id);
}
printf(”\n");
}
void delNode(rlink* p,int id)
{
rlink* temp=p;
rlink* front;
while(temp->id!=id)
{
front=temp;
temp=temp->next;
}
front->next=temp->next;
free(temp);
printf(“删除节点%d \n”,id);
display§;
}
int main()
{
int n,m,k,count;
scanf("%d %d %d",&n,&m,&k);
rlink* p=initLink(n);//创建循环链表,带有头结点
display§;
rlink* temp=p;
rlink* t;
for(int i=1;i<=k;i++)
{
temp=temp->next;
}//找到第K个人所在的节点
while(true)//只剩一个数据时退出
{
count=1;
//del=temp;
while(count<m)
{
temp=temp->next;
if(temp!=p)
{
count++;
}
}//找到数到m的节点
t=temp->next;//指向被删除掉的节点的下一个节点
delNode(p, temp->id);
temp=t;
if(tempp)
temp=temp->next;//判断是否指向头结点,以避免出现多计算步数和找不到数据点的情况:比如3 1 2,
if((temp->next
p)&&(p->next==temp))
break;
}
printf(“报数结束!\n”);
display§;
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值