1. 程式人生 > >約瑟夫環--連結串列實現

約瑟夫環--連結串列實現

# include <stdio.h>
# include <malloc.h>


typedef struct Node
{
	int data;
	struct Node * next;
}NODE,*pnode;

typedef struct linklist
{
	pnode phead;
	pnode ptail;
	int len;
}LINK,*plink;

static pnode getnode(int i);
void init_list(plink list);
static void creat_list(plink list,int n);
void print_list(plink list);
void joseph(plink list,int m);

int main(void)
{
	int n,m;
	printf ("輸入佇列長度:");
	scanf ("%d",&n);
	printf ("輸入報數停止的數字:");
	scanf ("%d",&m);
	
	plink list;
	list = (plink)malloc(sizeof(LINK));
	
	init_list(list);
	creat_list(list,n);
	print_list(list);
	joseph(list,m);
	
	return 0;
}

static pnode getnode(int i) 	//新建並初始化結點 
{
	pnode node;
	node = (pnode)malloc(sizeof(NODE));
	if (!node)
	{
		printf ("分配記憶體錯誤\n");
		exit(-1);
	}
	node->data = i;
	node->next = NULL;
	return node;
}

void init_list(plink list)		//用第一個結點初始化迴圈連結串列 
{
	pnode ptr;
	ptr = getnode(1);
	list->phead = ptr;
	list->ptail = list->phead;
	ptr->next = list->phead;
	list->len = 1;
}

static void creat_list(plink list,int n) //將其餘資料存入迴圈單鏈表中 
{
	int i = 0;
	pnode pnew;
	for (i=2;i <= n;++i)
	{
		pnew = getnode(i);
		list->ptail->next = pnew;
		list->ptail = pnew;
		pnew->next = list->phead;
		list->len++;
	}
	printf ("原有佇列:\n");
}

void print_list(plink list)	//輸出連結串列內容	 
{
	pnode ptr;
	ptr = list->phead;
	do
	{
		printf ("%d ",ptr->data);
		ptr = ptr->next;
	}while(ptr != list->phead);
	printf ("\n佇列長度:%d\n",list->len);
}

void joseph(plink list,int m)	//約瑟夫迴環函式 
{
	int i;
	pnode ptr1 = list->ptail;
	pnode ptr2 = list->phead;
	while(list->len != 1)
	{
		i = 1;
		while(i <= m-1)
		{
			ptr1 = ptr1->next;
			++i;
		}
		ptr2 = ptr1->next;
		ptr1->next = ptr2->next;
		free(ptr2);
		list->len--;
	}
	printf ("\n最後的數字:%d\n",ptr1->data);
}

相關推薦

連結串列實現

寫的蠻繁瑣的,而且中間還出現了些問題 #include <iostream> #include <stdio.h> #include <cstring> using namespace std; typedef struct node { i

雙向連結串列實現

#include<stdio.h> #include<stdlib.h> const int N = 1000; int m, n, k; struct people { int id; people *last, *ne

--連結串列實現

# include <stdio.h> # include <malloc.h> typedef struct Node { int data; struct Node * next; }NODE,*pnode; typedef struc

問題——連結串列實現

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

-順序表實現

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

問題C++實現

題目就不說了,學過演算法或者看過一些程式設計思維故事的人應該都有了解這個經典的問題。這裡直接看程式碼和執行結果。 #include <bits/stdc++.h> using namespace std; int n,m; int main() { while(c

資料結構之C語言實現

資料結構,是很重要的一門學科,每年考研,資料結構是各大院校必考的科目。當然,資料結構,最令人頭疼的就是演算法設計題了。為了幫助大家理解和掌握資料結構常見的演算法,學長推出系列文章,為大家分享這些重要演算法的C語言完成實現,大家有條件的話,可以在電腦上除錯執行,加深

】Java實現:100個人開始從1開始報數,每當報數到3,報數3的人離開,求最後留下來人的位置。

問題背景:約瑟夫環問題  在這裡寫一個簡單的約瑟夫環的問題:100個人坐成一圈開始從1開始報數,每個報數為3的人離開座位,直到座位上只剩下一個人,求這個人的位置。 解決問題使用的工具&程式語言:  工具:Eclipse  程式設計:Java 程式碼如下: public class Yuesef

問題(迴圈連結串列實現

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

問題連結串列實現

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

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

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

Problem E: 用連結串列實現

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

迴圈連結串列的遞迴實現

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

單向迴圈連結串列實現

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

問題的連結串列實現

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

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

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

迴圈連結串列 實現

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

問題迴圈連結串列實現

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

迴圈連結串列()的建立及C語言實現

連結串列的使用,還可以把連結串列的兩頭連線,形成了一個環狀連結串列,稱為迴圈連結串列。和它名字的表意一樣,只需要將表中最後一個結點的指標指向頭結點,就形成了一個環。 圖1 迴圈連結串列 迴圈連結串列和動態連結串列相比,唯一的不同就是迴圈連結串列首尾相連,其他都完全一

單向迴圈連結串列實現以及實現

/* * single.h * * Created on: 2012-7-21 * Author: root */ #ifndef SINGLE_H_ #define SINGLE_H_ #include<stdio.h> #includ