n只猴子要选大王,选举方法如下:所有猴子按 1,2 ……… n 编号并按照顺序围成一圈,从第 1个猴子起,由1开始报数,报到m时,该猴子就跳出圈外,下一只猴子再次由1开始报数,如此循环,直到圈内剩下一只猴子时,这只猴子就是大王。
#include<malloc.h>
#include<iostream>
using namespace std;
typedef struct snode
{
int data;
struct snode *next;
}lnode;
void houzi(int n,int k)
{
lnode *p,*lq,*head,*s,*pre; //p:当前结点。 head :头结点 。pre:当前结点前一个结点。
head=(lnode *)malloc(sizeof(lnode));
head->next=head;
head->data=0;
p=head;
p->data=1;
p->next=p;
for(int i=2;i<=n;i++)
{
lq=(lnode *)malloc(sizeof(lnode));
lq->data=i;
lq->next=p->next;
p->next=lq;
p=p->next;
}
p=head;
pre=head;
while(n!=1)
{
for(int i=1;i<k;i++)
{
p=p->next;
cout<<p->data<<" ";
}
cout<<endl<<p->data<<"出局"<<endl;
while(pre->next!=p) //确定删除结点的前一个节点,以便删除。
pre=pre->next;
pre->next=p->next;
s=p;
p=p->next;
free(s);
n--;
}
cout<<"最后的结点为:"<<p->data<<endl;
}
int main()
{
houzi(8,3);
}
约瑟夫问题。
解决方法:建立一个有n个节点,没有头结点的循环链表,确定第一个报数人的位置。不断从链表中删除节点,直到链表为空。
还需要搞定的:单链表反转,对单链表遍历一次求中间值。先记下。