约瑟夫环

来源:互联网 发布:淘宝优惠券链接微信 编辑:程序博客网 时间:2024/05/17 03:04

先看下定义:

有M个人围坐成一圈, 编号依次从1开始递增,现从编号为1的人开始报数,报到N的人出列,然后再从下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列。求出列次序。


不难看出,用循环链表可以比较容易的解决,代码如下。

#include<stdio.h>#include<malloc.h>typedef struct LinkList{int data;struct LinkList *next;}LinkList,*PLink;PLink CreateL(int n){PLink head = (PLink)malloc(sizeof(LinkList));PLink q = head,p;head->data = 1; for(int i = 2;i <= n;i++){PLink p = (PLink)malloc(sizeof(LinkList));q->next = p;p->data = i;q = p;}q->next = head;return head;} void ysfh(PLink head,int m,int n){PLink q = NULL;for(int i = 0;i < m;i++)//删m次就够了 {for(int j = 0;j < n-2;j++){head = head->next;}q = head->next;head->next = q->next;head = head->next;//每次让head指向下一次报数的起点 printf("%d ",q->data);free(q);}} int main(){int M,N;scanf("%d %d",&M,&N);PLink head = CreateL(M);ysfh(head,M,N);}
整体来说代码没难度,熟悉下链表的操作。。。。

结果如下图:



0 0
原创粉丝点击