废话少说,贴代码
结构部分
template<class T>
struct LinkNode{
LinkNode *r_Link;
T data;
LinkNode(const T &x,LinkNode *ptr=NULL){
data=x;
r_Link=NULL;
}
};
template<class T>
class Circle{
public:
LinkNode<T> *head,*last;
Circle(const T &x){
head=new LinkNode<T>(x);
last=head;
}
void Insert(const T &x){
LinkNode<T> *newNode=new LinkNode<T>(x);
last->r_Link=newNode;
last=newNode;
last->r_Link=head;
}
bool Remove(T x){
LinkNode<T> *p=head,*cur=last;
while(1){
if(p->data==x)
break;
cur=p;
p=p->r_Link;
}
cur->r_Link=p->r_Link;
if(p==head) //判断被删节点是否为头节点
head=p->r_Link;
delete p;
return true;
}
};
算法实现
id Josefu(Circle<T> &cir,int n,int m){
LinkNode<T> *p=cir.head,*cur;
if(n==1){
printf("只剩一个人员:%d",p->data);
return;
}
while(n>1){
for(int i=1;i<m;i++){
p=p->r_Link;
}
cur=p->r_Link;
printf("%d 号被淘汰\n",p->data);
cir.Remove(p->data);
p=cur;
n--;
}
printf("最后留下人员: %d",p->data);
}
主函数
int main(){
int n,m;
printf("输入人数和间隔\n");
scanf("%d%d",&n,&m);
Circle<int> cir(1);
for(int i=1;i<n;i++) cir.Insert(i+1);
Josefu(cir,n,m);
return 0;
}
约瑟夫环核心是用循环链表,单、双链表都行
敢死队问题、淘汰问题都是基于约瑟夫环来实现的