中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言數據結構中約瑟夫環問題如何解決

發布時間:2023-01-13 10:06:17 來源:億速云 閱讀:114 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“C語言數據結構中約瑟夫環問題如何解決”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C語言數據結構中約瑟夫環問題如何解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

問題描述

約瑟夫環問題的一種描述是:將編號為1,2,...n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報道m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止。設計一個程序求出出列順序。

基本要求

利用單向循環鏈表存儲結構模擬此過程,按照出列的順序印出個人的編號。

測試數據

m的初值為20;n = 7,7個人的密碼依次為:3,1,7,2,4,8,4,首先m值為6(正確的出列順序應為6,1,4,7,2,3,5)。

實現思路1

用的是數組索引。結合一點點的算法知識。

#include<stdlib.h>
#include<stdio.h>
//#用數組索引的模式 
int main(){
	int m;
	printf("請輸入m的值:");
	scanf("%d",&m);
	int n;
	printf("請輸入n的值:"); 
	scanf("%d",&n);
	int a[100];
	for(int i = 0;i<n;i++){
		scanf("%d",&a[i]);
	}
	int cnt = 0;
	int cnt1 = 0;
	int i = 0;
	while(1){
		if (a[i]!=0){
			cnt++;
			if(cnt==m){
				m = a[i];
				a[i] = 0;
				cnt = 0;
				printf("%d ",i+1);
				cnt1++;
			}
			if(cnt1==n){
				break;
			}
		}
		i = (++i)%n;
	} 
}

實現思路2

利用單項循環鏈表的方式,上干貨

運用的函數:

  • 創建鏈表

  • 取得鏈表的下標

  • 刪除鏈表指定下標的元素

  • 得到第i個元素值

數據結構的定義:

  • 結構體 LNode,成員包括:原始下標,元素值

  • 主函數的思路:

其中上面的函數都是參考《數據結構(C語言版)》上面。只是將創建鏈表的函數改成創建單向循環鏈表的函數。寫代碼主要時間消耗在主函數上。

主函數的思路:

創建一個指定大小(n)的循環鏈表,每一次循環得到第m個元素,記錄此元素的下標,然后移動頭結點到刪除元素前面的結點,再把此時的頭節點后面1一個結點給刪除。依次遍歷到n個。

#include<stdlib.h>
#include<stdio.h>
//用單項循環列表的方式 
//數據類型的定義 
typedef struct LNode{
	int data;		//定義密碼值 
	int index; 		//定義數據的下標 
	struct LNode *next;
}LNode,*LinkList;
int GetElem_L(LinkList L,int i ,int &e){
	LNode* p;				//注意這里的*號 
	p = L->next;
	int j = 1;
	while(p&&j<i){
		p = p->next;
		++j;
	} 
	if(!p || j>i)
	{
		return -1;
	}
	e = p->data;
//	printf("%d ",e);
	return e;
}//GetElem_L
int GetIndex_L(LinkList L,int i ,int &e){
	LNode* p;				//注意這里的*號 
	p = L->next;
	int j = 1;
	while(p&&j<i){
		p = p->next;
		++j;
	} 
	if(!p || j>i)
	{
		return -1;
	}
	e = p->index;
//	printf("%d ",e);
	return e;
}//GetIndex_L
int ListDelete_L(LinkList &L,int i,int &e){
	LNode* p;				//注意這里的*號
	p  = L;
	int j = 0;
	while(p->next&&j<i-1){
		p = p->next;
		++j;
	}
	if(!(p->next)||j>i-1){
		return -1;
	}
	LNode* q;
	q = p->next;
	p->next = q->next;
	e = q->data;
	free(q);
	return e; 
}//ListDelete_L
void CreateList_L(LinkList &L,int n){
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	LNode* tmp = (LinkList)malloc(sizeof(LNode));
	tmp = L;
	for(int i = 0;i<n-1;++i){
		LNode* p = (LinkList)malloc(sizeof(LNode));
		scanf("%d",&p->data);
		p->index = i+1;
		p->next = tmp->next;
		tmp->next = p;
		tmp = tmp->next;
	}
	LNode* p = (LinkList)malloc(sizeof(LNode));          //注意這里的*號
	scanf("%d",&p->data);
	p->index = n;
	p->next = L->next;
	tmp->next = p;
}//創建循環鏈表 
int main(){
	int m;
	int cnt;
	printf("請輸入m的值:");
	scanf("%d",&m);
	int n;
	printf("請輸入n的值: "); 
	scanf("%d",&n);
	LNode* L;						//注意這里的*號
	CreateList_L(L,n);	
	int e = 0 ;
	int index = 0;
	for(int i = 0;i<n;i++){
		GetElem_L(L,i+1,e);
	}
	for(int i = 0;i<n;i++){
		int l = 0;
		l = GetIndex_L(L,m,index);
		printf("%d ",l);
		int tmp = GetElem_L(L,m,e);
		for(int i = 0;i<m-1;i++){		
			L = L->next;
		}
		ListDelete_L(L,1,e);
		m =  tmp;
	}
}

結果

C語言數據結構中約瑟夫環問題如何解決

讀到這里,這篇“C語言數據結構中約瑟夫環問題如何解決”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桑植县| 奇台县| 板桥市| 岫岩| 昌图县| 石台县| 若尔盖县| 康乐县| 武胜县| 德州市| 济阳县| 徐州市| 天全县| 衡山县| 扎兰屯市| 西和县| 高平市| 云南省| 奈曼旗| 阿尔山市| 余干县| 巴塘县| 鲜城| 郎溪县| 成都市| 炉霍县| 达孜县| 四子王旗| 新民市| 洛阳市| 连城县| 徐州市| 库伦旗| 同仁县| 宣威市| 襄城县| 七台河市| 榆社县| 博客| 剑川县| 平南县|