@【数据结构】(单链表 猴王问题)
利用单循环链表实现猴王问题:有10个猴子,其编号分别是1–10,围城一圈,开始数数,数到3的数分别出列,最后一个出列的猴子为猴王
#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct list
{
int no;
struct list *next;
}Monkey;
void CreateList(Monkey *&L, int n) //n为猴子个数
{
int i; Monkey *p, *q;
L = (Monkey *)malloc(sizeof(Monkey));
L->no = 1;
q = L;
for (i = 2; i <= n; i++)
{
p = (Monkey *)malloc(sizeof(Monkey));
p->no = i;
q->next = p; q = p;
}
q->next = L; //形成首结点为L的循环单链表
}
void Joseph(int n, int m) //求解约瑟夫序列
{
int i, j; Monkey *L, *p, *q;
CreateList(L, n);
cout << "出列顺序为:";
for (i = 1; i <= n; i++)
{
p = L; j = 1;
while (j < m - 1)
{
j++; p = p->next;
}
q = p->next; //q指向第m个结点
cout << q->no << " ";
while (q->next->next == q->next) //只剩一个元素,即为猴王
{
cout << "猴王是:"<<q->no << "号";
break;
}
p->next = q->next; //删除第m个结点
free(q);
L = p->next; //从下一个结点重新开始
}
}
void main()
{
int n = 10, m = 3;
cout << "10个猴子数到3的出列" << endl;
Joseph(n, m);
cout << endl;
system("pause");
}
测试示例: