1. 程式人生 > >單向迴圈連結串列模擬約瑟夫環

單向迴圈連結串列模擬約瑟夫環

約瑟夫環問題,編好為1,2,3....n的個人按順時針圍坐一圈,每人手持一個密碼。一開始選定m=6,從第一個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止,顯示出列順序,打印出編號。

#include <iostream>
#include <stdio.h>
using namespace std;
template <class T>
struct node
{
    T data;  //存取每個人手持的密碼
    T id;   //存取每個人的序號
    node<T> *next;
};
template <class T>
class linklist
{
private:
    node<T> *head;  //定義迴圈連結串列頭節點
public:
    linklist(){head=new node<T>; head->next=head;}   //建構函式
    linklist(T a[],int n);
    int Joseph(int n);   //約瑟夫環演算法
    void show_link(int n)   //展示連結串列中節點的序號和手持的密碼值
    {
        node<T> *p=head->next;
        for(int i=0;i<n;i++)
        {
            cout<<"節點序號:"<<p->id<<",手持密碼:"<<p->data<<endl;
            p=p->next;
        }
    }
};
template <class T>
linklist<T>::linklist(T a[],int n)
{
    head=new node<T>;
    head->next=head;    //頭節點不儲存任何值
    node<T> *pr=head;
    for(int i=0;i<n;i++)
    {
        node<T> *p=new node<T>;
        p->data=a[i];
        p->id=i+1;
        pr->next=p;   //採用尾插法插入節點
        pr=p;
    }
    pr->next=head;  //這一步一定不能忘,這是迴圈連結串列的關鍵
}
template <class T>
int linklist<T>::Joseph(int n)   //約瑟夫環演算法
{
    int m=n;
    int count=1,order=0;
    node<T> *pr=head;  //前一節點
    node<T> *p=head->next;  //當前節點
    while(pr!=p->next)  //不算頭節點,如果節點數量等於1,跳出迴圈
    {
        if(p!=head&&count==m)   //跳過頭節點,如果報數等於m
        {
            node<T> *x=new node<T>;
            x=p;
            pr->next=p->next;
            p=p->next;  //刪除該節點
            order++;
            printf("第%2d個出列,序號為%d",order,x->id);
            cout<<endl;
            m=x->data; //下次報數的m為該節點的密碼
            delete(x);
            count=1; //下個節點報數從1開始
        }
        else
        {
            if(p!=head)
                count++;   //報數增加
            pr=p;  //保持pr與p的關係
            p=p->next;
        }
    }
    printf("第%2d個出列,序號為%d",++order,p->id);
    delete(pr);
    delete(p);
}
int main()
{
    int a[7]={3,1,7,2,4,8,4};  //7個人密碼的順序
    int m=6;
    linklist<int> link(a,7);
    link.show_link(7);
    link.Joseph(m);
    return 0;
}

相關推薦

單向迴圈連結串列模擬

約瑟夫環問題,編好為1,2,3....n的個人按順時針圍坐一圈,每人手持一個密碼。一開始選定m=6,從第一個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止

單向迴圈連結串列練習-問題

開發十年,就只剩下這套架構體系了! >>>   

迴圈連結串列解決的問題

約瑟夫環問題簡介  約瑟夫環問題的原來描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈,……,如此下去,直到所有人全部出圈為止。當任意給定n和m後,設計演算法求n個人出

資料結構——迴圈連結串列、僅設尾指標的迴圈連結串列

1 //迴圈連結串列,連結串列的尾結點的link域中不是NULL,而是存放了指標連結串列開始結點的指標 2 ////設p是在迴圈連結串列中逐個結點檢測指標,則在判斷p是否達到連結串列的鏈尾時p->link == first 3 4 5 //迴圈

迴圈連結串列 實現

【約瑟夫環問題】 已知 n 個人(n>=1)圍坐一圓桌周圍,從 1 開始順序編號,從序號為 1 的人開始報數,順時針數到 m 的那個人出列。下一個人又從 1 開始報數,數到m 的那個人又出列

迴圈連結串列的問題

在程式設計師面試寶典中,有道面試題如下: 已知n個人(以編號1,2,3,,...,n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;從他的下個開始,數到k重新數數,數m個數,那個人出列;以此重複下去,直到圓桌周圍的人全部出列。試用C++程式設計實現

(學習java)用java語言構造的迴圈連結串列解決問題

//josephus問題 41個人1-3報數,數到3的自殺,最後剩餘的2個人結點資料 public class Josephus { public static void main(String[] args) { SLineList s = new SLineLis

迴圈連結串列問題(非常詳細易理解)

約瑟夫問題來源 據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就

JS資料結構第三篇---雙向連結串列迴圈連結串列問題

一、雙向連結串列 在上文《JS資料結構第二篇---連結串列》中描述的是單向連結串列。單向連結串列是指每個節點都存有指向下一個節點的地址,雙向連結串列則是在單向連結串列的基礎上,給每個節點增加一個指向上一個節點的地址。然後頭結點的上一個節點,和尾結點的下一個節點都指向null。同時LinkedList類中再增

Problem E: 用連結串列實現

Description 你聽說過約瑟夫問題嗎?問題大致如下:首先n個人圍成一個圈,標記為1到n號。接著,從1號開始報數(從1開始),然後2號報數,然後3號。。。當有人報到到m時,這個人就要踢出比賽,然後從被踢出的人的下一個人開始,重新報數(從1開始)。這樣經過n-1次後,就只剩下了一個人,問最後剩下的

連結串列解決問題

第一次做約瑟夫環問題,歡迎大家來找茬~ 如果做單迴圈連結串列時有點暈了,要畫圖要畫圖要畫圖,重要的事講三遍,因為真的是很好的方法。 #include<stdio.h> #include<stdlib.h> typedef struc

順序迴圈結構(迴圈佇列)模擬

#include<iostream.h>void InQ(int Q[],int x);void OutQ(int Q[]);int GetHead(int Q[]);int rear,front;const int N=100;//支援100以下個的資料void

使用連結串列解決的問題

已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列,問最後一個出環的人的原編號。 用在單鏈表中刪除一個結點的思想

使用連結串列解決問題

1139 約瑟夫環問題 時間限制:500MS 記憶體限制:65536K 提交次數:157 通過次數:79 題型: 程式設計題 語言: G++;GCC Description 約瑟夫(josephus)環是這樣的:假設有n個小孩圍坐成一個圓圈,並從1開始依次

靜態連結串列解決問題

#include<stdio.h> #define MAXSIZE 100  struct {  int  cur ;  int  number;  int  secret_node; }space[MAXSIZE]; int main(void) {  int

線性表---單迴圈連結串列問題)

約瑟夫環問題: 已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。 程式碼: #include <i

使用環形連結串列實現

連結串列實現Josephus約瑟夫環問題如下,輸出每輪殺掉的人的編號,並且輸出最後剩下的一名幸運者。 標頭檔案如下 #ifndef JOSEPHLIST_H #define JOSEPHLIST_H #include <stdio.h> typedef st

Java 使用連結串列實現

約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。求出出隊序列。 採用連結串列實現,結點資

資料結構---連結串列問題帶來的思考

連結串列和陣列一樣也是線性表的一種。和陣列不同,它不需要再記憶體中開闢連續的空間。 連結串列通過指標將一組零散的記憶體塊連線在一起。我們把記憶體塊稱為連結串列的“結點”(是節點還是結點,結點連線起來打個結所以叫“結點”?開個玩笑),也就是說這些結點可以在記憶體的任意地方,只要有其他的結點的指標指向這個位置就可

資料結構(C語言):連結串列問題

開始學習資料結構,把寫過的程式碼發上來,希望可以給有需要的人一個參考。 //本程式碼由 大漠孤煙 整理編寫,並驗證通過 //求解約瑟夫問題,涉及到連結串列節點的生成,節點的插入和刪除,對理解連結串列非常有好處 //N個節點圍城一圈,從第一個節點開始計數(1),每數