约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
在这里可以用循环链表解决,创建一个存储为N的循环链表,每次删除第M个元素并打印出来
代码如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
}LNode, *LinkList;
int CreatList(LinkList L,int n) { //创建链表
L->next = NULL;
LNode * p;
LNode * s;
s = (LinkList)malloc(sizeof(LNode));
s = L;
for (int i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d", &p->data);
s->next = p;
s = p;
}
s->next = L->next;
return n;
}
int ListDelete_L(LinkList L,int i) //删除
{
LNode *p;
LNode *q;
q = (LinkList)malloc(sizeof(LNode));
p = (LinkList)malloc(sizeof(LNode));
p = L;
for (int j = 0; j < i - 1; j++)
{
p = p->next;
}
int s;
s = p->next->data;
p->next = p->next->next;
printf("%d", s);
return s;
}
int main() {
LNode* L;
L = (LinkList)malloc(sizeof(LNode));
int n,m;
scanf("%d %d",&n,&m);
CreatList(L,n);
for (int i = 0; i < n; i++)
{
ListDelete_L(L, m);
}
system("pause");
}