/5、循环链表的应用(约瑟夫回环问题)
t个数据元素构成一个环,从环中任意位置k开始计数,计到m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。
提示:用一个无头结点的循环单链表来实现n个元素的存储。/
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node* next;
} *linklist;
linklist creatlist(int n)
{
linklist p, r,head;
head= (linklist*)malloc(sizeof(linklist));
head->data = 1; //第一个结点元素
r = head;
for (int i = 1; i < n; i++) //从第二个元素结点开始
{
p= (linklist*)malloc(sizeof(linklist));
p->data = i + 1;
//后插法创建单循环链表
if (i = n - 1)//最后一个结点
{
p->next =head ;//最后一个结点指向第一个元素
r->next = p;
r = p;
}
else
//p->next = NULL;
r->next = p;
r = p;
}
return head;
}
void getelem(linklist L,int n,int m,int k) //共n个数 计到m时取出 从第K个数开始
{
linklist p,r;
p = L->next; //P指向第一个元素结点
for (int i = 1; i <= k-1; i++)
{
p = p->next; //p指向k,从K开始
}
//此时P指向第K个
for (int j = 0; j < n; j++) //要取出这n个数,需要进行n趟循环
{
for (int i = 0; i <= m - 1; i++)
{
p = p->next; //p指向m的前一个
}
r = p->next;
p->next = r->next;
printf("取出的数是:%d", r->data);
free(r);
}
}
int main()
{
int n, m,k;
printf("请输入总数、计到要取出来的数、从第几个数开始计数:");
scanf_s("%d%d%d", &n, &m,&k);
linklist L;
L = creatlist(n);
getelem(L, n, m, k);
return 0;
}