现在的位置: 首页 > 综合 > 正文

约瑟夫环问题(双向循环链表模拟)

2013年10月11日 ⁄ 综合 ⁄ 共 754字 ⁄ 字号 评论关闭
#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;
int jph(int & n,int & k);


//利用一个双向循环链表去模拟约瑟夫环
struct Node
{
 int num;
 Node *pre;
 Node * next;
};


int main()
{
 int n,k;
 
  while(scanf("%d %d",&n,&k)!=EOF)
          printf("%d\n",jph(n,k)); 
return 0;
}



int jph(int & n,int & k)
{
//生成双向循环链表
  Node *front;//头指针
  Node *rear;//尾指针

   Node *ptr=new Node;
    ptr->num=1;
    ptr->next=NULL;
    ptr->pre=NULL;
    front=ptr;
    rear=ptr;
    
  for(int i=2;i<=n;++i)
  {
    Node *ptr=new Node;
    ptr->num=i;
    ptr->next=NULL;
    ptr->pre=rear;
    rear->next=ptr;
    rear=ptr;
    
  }
  
  //使之成为双向循环链表
  rear->next=front;
  front->pre=rear;
  
  int c;
  
  for(c=1;front->next!=front;)//如果首尾指针指向了自己,则链表中只剩下一个元素即为所求
  {
     if(c==k)//计数器到时,则删除该节点
     {
       Node * p=front;
       front=front->next;
       p->pre->next=p->next;
       p->next->pre=p->pre;
       delete p;
       c=1;
       
     }
     else
     {
       ++c;
       front=front->next;
     }
     
  }
  
  int ret=front->num;
  delete front;
  
  return ret;
}

抱歉!评论已关闭.