1. 程式人生 > >迴圈連結串列報數問題,n個人編號分別為1,2,3,……n,從第k個編號開始數1,2到m個然後刪除第m個人,然後下 一個人再從1開始數數到第m個,然後再刪除m人

迴圈連結串列報數問題,n個人編號分別為1,2,3,……n,從第k個編號開始數1,2到m個然後刪除第m個人,然後下 一個人再從1開始數數到第m個,然後再刪除m人

#include<iostream>
#include<stdio.h>
using namespace std;
//迴圈連結串列報數問題,n個人編號分別為1,2,3,……n,從第k個編號開始數1,2到m個然後刪除第m個人,然後下
//一個人再從1開始數數到第m個,然後再刪除m人
struct Lnode
{
int data;
Lnode *link;
};
void josephus(int n,int k,int m)
{
//n為總人數,k為第一個開始報數的人,m為出列者喊道的數
/*p為當前節點,r為輔助節點,指向p的的前驅節點,list為頭節點*/
/*建立迴圈連結串列*/
Lnode *p,*r,*curr,*list;
p=(Lnode*)malloc(sizeof(Lnode));
p->data=1;
p->link=p;
curr=p;
for(int i=2;i<=n;i++)
{
Lnode *ln=(Lnode*)malloc(sizeof(Lnode));
ln->data=i;
ln->link=curr->link;
curr->link=ln;
curr=curr->link;
}
/*把當前指標移動到第一個報數的人*/
r=curr;
while(r->data!=k)r=r->link;


while(n--)
{
for(int i=1;i<m-1;i++)
r=r->link;//當數到m-1的時候
cout<<r->link->data<<endl;
p=r->link;
r->link=r->link->link;
free(p);
p=r=r->link;


}
}
void main()
{
josephus(9,1,3);

system("pause");
}