单循环链表 解决约瑟夫环的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单循环链表 解决约瑟夫环的问题相关的知识,希望对你有一定的参考价值。

已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

 

#include<stdio.h>
#include<malloc.h>
typedef struct node{
int num;
struct node* next;
}Node;

Node *creat(int n){
Node *p,*q,*head;
p=(Node *)malloc(sizeof(Node));
head = p;
p->num = 1;
for(int i=2;i<=n;i++){
q=(Node *)malloc(sizeof(Node));
q->num = i;
p->next = q;
p = q;
}

p->next = head; //最后一个节点的指针指向头指针,形成循环

return head;
}

void link_process(Node *head,int k,int m){
Node *p =head,*temp;
while(p->num!=k) //使当前指针移动到k的位置
p=p->next;

while(p->next!=p) //p->next == p 时表明这个链表中只剩下一个节点了,结束循环
{
for(int i=1;i<m;i++){
temp = p;
p=p->next;
}
printf("%d",p->num);

temp->next = p->next;
free(p);
p=temp->next;
}

printf("%d",p->num);
free(p);
}

int main(){

int n,m,k;
scanf("%d%d%d",&n,&k,&m);

Node *head = creat(n);

link_process(head,k,m);


return 0;

}

以上是关于单循环链表 解决约瑟夫环的问题的主要内容,如果未能解决你的问题,请参考以下文章

Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)

约瑟夫圆桌问题

小朋友学数据结构:约瑟夫环的链表解法数组解法和数学公式解法

数据结构(线性表——链表2)(约瑟夫环和发牌问题)

经典例题|约瑟夫环多方法解决

16约瑟夫问题