約瑟夫環——靜態迴圈連結串列,動態迴圈連結串列
靜態迴圈連結串列
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 的那個人又出列