1. 程式人生 > >約瑟夫環問題(迴圈連結串列實現C)

約瑟夫環問題(迴圈連結串列實現C)

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

以下是程式碼實現(c語言)

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int date;
	struct node *next;
}node,*linklist;


linklist creat(int n)
{
	linklist p=NULL,head;

	head=(linklist)malloc(sizeof(node));//建立頭結點 

	p=head;//p為指向當前節點的指標
	
	linklist s;
	
	int i=1;

	if(n!=0)
	{
		while(i<=n)
		{
			s=(linklist)malloc(sizeof(node));
			s->date=i++;
			p->next=s;
			p=s;
		}
		s->next=head->next;//首尾相連,頭結點可以直接刪掉,指向的是head->next,而不是head因為頭結點裡沒有資料 
		
	 } 
	 free(head);
	 return s->next;
 } 
 int main()
 {
 	int n=41;
 	int m=3;
 	int i;
 	linklist p=creat(n);
 	linklist temp;
 	
	 m%=n;
 	while(p!=p->next)
 	{
 		for(i=1;i<m-1;i++)
 		{
 			p=p->next;
		 }
		 printf("%d->",p->next->date);
		 temp=p->next;
		 p->next=temp->next;//連線2,4結點,  一般要刪除一個結點的時候一定要注意最後要接上去
		 free(temp);
		 p=p->next;
	 }
	 printf("%d\n",p->date);
	 return 0;
	 system("pause");
 }


相關推薦

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

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

單向迴圈連結串列實現

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

問題迴圈連結串列實現

//n個人圍圈報數,報m出列,模擬出列的過程 #include <cstdio> #include <cstdlib> typedef struct node { int data; struct node *next; }node; nod

問題迴圈連結串列實現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的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部

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

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

問題的連結串列實現

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

BIT2018 DS-SS 問題與迴圈連結串列

約瑟夫問題是一個經典的問題(大一我們講過)。這個問題可以用陣列,也可以用連結串列。作為複習,大家可以試試你自己的演算法。 已知n個人(不妨分別以編號1,2,3,…,n 代表 )圍坐在一張圓桌周圍,從編號為 k 的人開始,從1開始順時針報數1, 2, 3, ...,順時針數到

遊戲->連結串列和順序表實現

#include<cstdio> #include<cstdlib> #include<iostream> using namespace std; typedef struct Staff { int number; struct Staff

問題(單向迴圈連結串列應用例項)

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

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

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

問題迴圈連結串列實現

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

Josephus迴圈連結串列解決

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

連結串列法,公式法

約瑟夫環作為一個數學問題,它的程式碼實現方式有很多,比如迴圈連結串列,公式解決或者動態規劃,之前參考資料也有用遞迴解決的。Anyway,這些都是解決約瑟夫環問題很有效的方法。這裡總結兩種方法,迴圈連結串列法和公式法。 首先是迴圈連結串列法,它的原理很簡單,也很容

線性寫法

1073 約瑟夫環 1 秒   131,072 KB   0 分   基礎題 N個人坐成一個圓環(編號為1 - N),從第1個人開始報數,數到K的人出列,後面的人重新從1開始報數。問最後剩下的人的編號。 例如:N

猴子選大王問題

資料結構與演算法之約瑟夫環。 與其枯燥的講解約瑟夫環,倒不如用約瑟夫環來解決一個有趣的問題。 猴子選大王問題:     現在有N個猴子需要選取一個猴王,這N個猴子手拉手圍成一個圈,旁邊有一位德高望重的老猴,先將這一圈猴按順時針方向編號1,2.......N,然後

51Nod1073 遞推公式

#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #

順序表之josephus

1.問題描述         n個犯人站成一個圈,從第s個人開始數起,每數到第d個犯人,就拉出來斬了,然後再從下一個開始數d個,數到的人再處決,………………,直到剩下最後一個犯人就予以赦免。 2.演

華為筆試題目--Joseph修改版

測試空間旗下大頭針出品 這個可是已經執行通過了的。大家可以看看,如果有什麼問題,及時交流。 #include<stdio.h>#include<stdlib.h>typedef struct Node *PNode; struct Node {       int num;