简单约瑟夫环:
约瑟夫环:若干人围成一个环,约定每间隔n个人,第n个人离开,剩下的人继续,直至所有人离开,输出离开顺序。
简单约瑟夫环使用数组即可实现。
复杂约瑟夫环:每个人都持有一个独立的间隔值x,比如第一个人的间隔值x1为3,那么从第一个人开始往后数3,第三个人离开,此时,以第三个人的间隔值x3作为新的间隔值,继续下去。
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef struct man
{
int data;
int flag;
int wochi;
man *next;
};
void ManInit(man *head, int n)
{
srand(time(NULL));
man *temp = (man *)malloc(sizeof(man));
temp = head;
head->data = 1;
head->flag = 0;
srand(time(NULL));
head->wochi = rand() * 10 / RAND_MAX + 1;
for (int i = 2; i <= n; i++)
{
man *a = (man *)malloc(sizeof(man));
a->data = i;
a->flag = 0;
a->wochi = rand() * 10 / RAND_MAX + 1;
temp->next = a;
temp = temp->next;
}
temp->next = head;
}
void ysf(man *head,int n)
{
man *p, *q;
p = head;
q = head;
int m = head->wochi;
int j = 0;
int i = 1;
while (j < n)
{
cout << "当前的 m 值为 " << m << endl;
while (i < m)
{
p = q;
q = q->next;
i++;
}
p->next = p->next->next;
cout << q->data << " 退出" << endl;
m = q->wochi;
//free(q);
j++;
i = 0;
}
}
int main()
{
man *head = (man *)malloc(sizeof(man));
srand(time(NULL));
ManInit(head, 20);
man *temp = (man *)malloc(sizeof(man));
temp = head;
for (int i = 0; i < 20; i++)
{
cout << "第 " << temp->data << " 个数的值为 " << temp->wochi << endl;
temp = temp->next;
}
cout << endl;
ysf(head, 20);
system("pause");
return 0;
}