当前位置:文档之家› 单循环链表解决Josephus问题

单循环链表解决Josephus问题

//假设n个人围坐在圆桌周围,现在从第s个开始报数,数到m的那个人出局,下一个开始重新报数,如此反复,知道所有的人都出局为止。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct cirlist{
int data;
struct cirlist *next;
}CirNode, *Cirlist;
Cirlist CreateList_L(Cirlist L, int n)//正序输出链表;
{
Cirlist p = NULL, s;
L = (Cirlist)malloc(sizeof(CirNode));
L->next = L;//建立头结点;
s = L;//用一个中间变量承接L,保持L的地址不变;
printf("输入链表的值:\n");
for (int i = 0; i < n; i++)//尾插法
{
p = (Cirlist)malloc(sizeof(CirNode));
scanf("%d", &p->data);
s->next = p;
s = p;
}
p->next = L;
return L;//如果不用s中间变量,利用尾插法L的地址是变化的;
}
void jopus(Cirlist L, int n, int s, int m)
{
Cirlist p = L->next, q = L;
int i, j;
for (i = 1; i < s; i++)
{
p = p->next;
}
for (i = 0; i < n; i++)
{
for (j = 1; j < m; j++)
{
q = p;
p = p->next;
if (p == L)
{
q = p;
p = p->next;
}
}
printf("%-3d", p->data);
q->next = p->next;
free(p);
p = q->next;
if (p == L)
{
q = p;
p = p->next;
}
}
}
void Show_L(Cirlist L)
{
Cirlist p;
p = L->next;
while (p != L)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void main()
{
Cirlist L = NULL;
int n, s, m;
printf("你想创建循环链表的长度:");
scanf("%d", &n);
L = CreateList_L(L, n);
printf("你创建的链表为;\n");
Show_L(L);
printf("输入你开始的位置以及相隔几个数字:");
scanf("%d%d", &s, &m);
jopus(L, n, s, m);
system("pause");
}。

相关主题