约瑟夫问题(单向链表)

# include "stdlib.h" 
# include "stdio.h" 
struct Node
{
 int data;
 Node *next;
};
int main()
{
 int n,k=1,m,i,s;
  Node *p,*q,*head;
  printf("约瑟夫问题——顺序表/n输入总人数n和退出编号m:/n"); // 输入总人数,退出编号 
  scanf("%d%d",&n,&m); 
  head=new Node;           //确定头结点
  p=head;
 for(i=1;i<=n-1;i++)                 //赋初值
 {
  p->data=i;
  p->next=new Node;   //为下一个新建内存
  p=p->next;
 }
  p->data=n;                 //最后一个单独处理
  p->next=head;                 //指向头,形成循环链表
  p=head;                 
 
 while(p->data!=(p->next)->data)            //p->data==(p->pNext)->data表示只剩下一个结点的
 {
  while(p->data !=k)         //寻找编号为k的结点
   p=p->next;
   s=1;
 if(m==1)
 {
  for(i=1;i<n;i++)
  {
   p=p->next ;
   }  
  printf("最后退出的是第%d位人/n",p->data);     
break;
 }
else
{
while(p!=p->next)           
 {
  for(i=1;i<m-1;i++)         
p=p->next;             
q=p->next;          
p->next=q->next;
p=p->next;
  delete q;
  s++; 
   }
printf("最后退出的是第%d位人/n",p->data);      
delete p;
}
 }
system("Pause");
return 0; 
}

原文地址:https://www.cnblogs.com/ituff/p/2858553.html