1. 程式人生 > >約瑟夫環——靜態迴圈連結串列,動態迴圈連結串列

約瑟夫環——靜態迴圈連結串列,動態迴圈連結串列

靜態迴圈連結串列

struct node{
    int flag;
    int next;
}arr[11];

#include"stdio.h"
#include"stdlib.h"
#include"s.h"
main(){
    int i,j,k;
    for(i=0;i<11;i++){
        arr[i].flag =1;
        arr[i].next =i+1;
    }
    arr[10].next=1;
    j=10;
    for(i=0;i<5;i++){
        for(k=0;;){
            if
(k<3){ j=arr[j].next; k+=arr[j].flag ; } else break; } arr[j].flag =0; } for(i=0;i<11;i++){ printf("%d ",arr[i].flag); } printf("\n"); system("pause"); }

動態迴圈連結串列

#define Total 6
#define Num 4 typedef int DataType; typedef struct node{ DataType password; int number; struct node *next; }ListNode; #include"stdio.h" #include"stdlib.h" #include"s.h" void InsertNode(ListNode **list,ListNode *head,int i,DataType x){ ListNode *p; p=(ListNode*)malloc(sizeof(ListNode)); p->number =i; p->password =x
; if(*list==NULL){ *list=p; p->next =NULL; } else{ p->next =head->next ; head->next =p; } } void CreateJoseph(ListNode **link,int n){ ListNode *head=NULL,*list=NULL; int i; int password[]={6,2,5,8,3,4}; for(i=0;i<n;i++){ InsertNode(&list,head,i+1,password[i]); if(i==0){ head=list; } else{ head=head->next ; } printf("%d ",password[i]); } printf("\n"); head->next =list; *link=list; } void ExJoseph(ListNode **link,int m){ ListNode *p,*q; int i; p=q=*link; while(q->next !=p){ q=q->next ; } while(p!=p->next ){ for(i=0;i<m-1;i++){ q=p; p=p->next ; } q->next =p->next ; printf("%d ",p->number ); m=p->password ; free(p); p=q->next ; } printf("\n"); printf("last person:%d",p->number ); } main(){ ListNode *link; CreateJoseph(&link,Total); ExJoseph(&link,Num); system("pause"); }

用到二級指標,在建立約瑟夫環的過程中,需要插入資料節點,而插入過程中最好用指標,定義兩個指標,一個為list指標,用於記錄第一個節點,以便形成迴圈連結串列,另一個為輔助指標head指標,用於指向插入連結串列的節點,在插入函式中最終是對該指標進行操作,一級指標只能改變指標指向資料的內容,不可取,二級指標可以改變list指標地址的指向,使其指向連結串列的頭節點,並儲存。
在輸出約瑟夫環的函式中定義兩個節點,p,q。並使q只想p之前。迴圈結束的條件是隻剩一個節點,在迴圈過程中,經過第一次迴圈過後,刪除p節點,並將p的密碼賦值給m,q的下一個節點指向p的下一個節點,釋放p,重新賦值p為刪除節點之後q的下一個節點。

相關推薦

——靜態迴圈連結串列動態迴圈連結串列

靜態迴圈連結串列 struct node{ int flag; int next; }arr[11]; #include"stdio.h" #include"stdlib.h" #include"s.h" main(){ int

C語言用陣列1. 簡單約瑟夫環問題: N個人編號從1~N圍成一圈輸入一個數T從1號開始報數報到T的人出圈;下一人又從1開始報數下一個報到T的人出圈輸出出圈順序。 考慮問實現約瑟夫環問題

1. 簡單約瑟夫環問題: N個人,編號從1~N圍成一圈,輸入一個數T,從1號開始報數,報到T的人出圈;下一人又從1開始報數,下一個報到T的人出圈,輸出出圈順序。 考慮問題: 報到T的人出圈,怎麼表示出圈?要麼刪除對應的標號,其他的標號前移(如果是陣列結構,要依次移動

Josephus()問題的數學方法使用遞推公式。

無論是用連結串列實現還是用陣列實現都有一個共同點:要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達O(nm),當n,m非常大(例如上百萬,上千萬)的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。

(數學高效率解法很詳細)

 5.5.4 用數學方法解約瑟夫環(1) 原文copy:http://book.51cto.com/art/201403/433941.htm 5.5.4  用數學方法解約瑟夫環(1) 上面編寫的解約瑟夫環的程式模擬了整個報數的過程,程式執行時間還可以接受,很快就可

迴圈連結串列解決的問題

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

魯智深吃饅頭之類的問題總結c++(不用迴圈連結串列

今天看見這一類的題,覺得用迴圈連結串列太麻煩了,就想用某一種方法來代替迴圈連結串列,總結如下。 大致題意 n 個人圍城一圈,從第一個人開始順序編號為1到n。從第1個人從1開始報數,數到3的人出圈。再由下一個人從1開始報數,數到3的人出圈,如此迴圈數下去,直到最後一個人出圈。(題意都差不多

(使用C語言單向迴圈連結串列來解決)

題目描述 編號為1,2,…,n的n個人按順時針方向圍坐在一張圓桌周圍,每人持有一個密碼(正整數)。一 開始任選一個正整數m作為報數上限值,從第一個人開始按順時針方向自1開始報數,報到m時停止報數,報m的那 個人出列,將他的密碼作為新的m值,從他順時針方向的下一個人開始重新從1報數,

--迴圈連結串列的應用

     通過迴圈連結串列實現約瑟夫環 要求:1)要求設計一個程式模擬次過程,輸入總的人數n,所報的出列的數字k,計數開始的位置p; 程式所能達到的功能:構造連結串列;輸入資料;執行報數;儲存出列人的序號,刪除出列人的資訊以及把指向出列人的指標移到出列人的下一個人,然後重

問題(迴圈連結串列實現)

約瑟夫環問題,n個人圍成一圈,報數到m的人出列,直至n個人全部出列,問出列人的順序 手寫迴圈連結串列模擬實現 #include<stdio.h> #include<stdlib.h> typedef struct SingleNode {

資料結構——迴圈連結串列

n個數據元素構成一個環,從環中任意位置開始計數,計到m將該元素從表中取出,重複上述過程,直至表中只剩下一個元素。 提示:用一個無頭結點的迴圈單鏈表來實現n個元素的儲存。 樣例: 輸入: 10 3 1 //分別為總數,出列的人數到的數字,開始數的人的編號。 輸出:

(Josephus)迴圈連結串列解決

關於約瑟夫環的簡單思路技巧 題目要求: 分析題目: 設編號為1,2,3,4…n的n個人順時針坐一圈,約定編號為K的人按順時針從1開始報數,數到m的人出列,他的下一位從1開始 報數… 預設第一次輸入剛開始的序號,之後選擇到誰就用誰的密碼,並把它刪掉。 思路分析:正

迴圈連結串列的遞迴實現

約瑟夫(Joseph)問題的一種描述是:編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新

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

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

問題(迴圈連結串列

這是一道比較經典的迴圈連結串列問題,在華為上機筆試中也出現過。 約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直

單向迴圈連結串列實現

約瑟夫環 已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。 ///迴圈連結串列實現 #include<bits/stdc++.h>

問題(迴圈連結串列實現C)

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

---單向迴圈連結串列

題目:實現一個圍圈報數的小函式,7個人圍一圈,從第1個人開始報數,報道3的人結束遊戲,計算出最後剩下一個人的時候,他是第幾個人。 程式碼: 預設從第一個人開始報數 #include<iost

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

已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部

單向迴圈連結串列模擬

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

迴圈連結串列 實現

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