(程序員面試寶典)已知n個人圍坐在一張圓桌旁,從編號爲k的人開始..................

【題目】

設有n個人(以編號爲1,2,3…….n分別表示)圍坐在圓桌周圍,從編號爲k的人開始報數,數到m的人就站出來,他的下一個人又從1開始報數,數到m的人就站出來,依此規律重複下去,知道全部的人都站出來爲止。

【代碼實現】

這裏選擇循環鏈表作爲數據結構。

#include<iostream>
using namespace std;
struct node
{
  int data;
  node *next;
};
class linklist
{
public:
     linklist() //利用構造函數對循環鏈表進行初始化
     {
       node *p=new node();
       p->data=1;
       p->next=p;
       first=p;
     };
    void josephus(int n,int k,int m);
private:
    node *first;  
};

void linklist::josephus(int n,int k,int m)
{
  node *q=first;
  for(int i=2;i<=n;i++)    //建立循環鏈表(編號爲1,2,3..........N)
  {
    node *p=new node();
    p->data=i;
    p->next=q->next;
    q->next=p;
    q=p;
  }
   //---------找到第一個報數的人,p記錄當前報數的位置,r爲報數的前一個位置----------
  node *p=first; 
  node *r;
  while(--k)
  {
    r=p;;     
    p=p->next;
  }

  //----------把這n個元素依次出列--------
  cout<<"n個元素依次出列:";
  while(n--)
  {
    for(int s=1;s<m;s++)  //從當前元素開始報數,報數爲m的元素出列,p指向出列元素
    {
        r=p;
        p=p->next;
    }  
      r->next=p->next;     
      cout<<p->data<<" ";
      p=r->next;          //此時p指向被刪元素的下一個元素
  }
  cout<<endl;

}
int main()
{
  linklist L;
  L.josephus(9,1,5);
  system("pause");
  return 0;
}

【運行結果】

這裏寫圖片描述

發佈了64 篇原創文章 · 獲贊 29 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章