最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言數(shù)據(jù)結(jié)構(gòu)中約瑟夫環(huán)問題探究

 更新時(shí)間:2023年01月12日 16:30:42   作者:Li&&Tao  
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)中約瑟夫環(huán)問題,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路

數(shù)據(jù)結(jié)構(gòu)開講啦!??!

本專欄包括:

  • 抽象數(shù)據(jù)類型
  • 線性表及其應(yīng)用
  • 棧和隊(duì)列及其應(yīng)用
  • 串及其應(yīng)用
  • 數(shù)組和廣義表
  • 樹、圖及其應(yīng)用
  • 存儲(chǔ)管理、查找和排序

將從簡(jiǎn)單的抽象數(shù)據(jù)類型出發(fā),深入淺出地講解復(fù)數(shù)

到第二講線性表及其應(yīng)用中會(huì)講解,運(yùn)動(dòng)會(huì)分?jǐn)?shù)統(tǒng)計(jì),約瑟夫環(huán),集合的并、交和差運(yùn)算,一元稀疏多項(xiàng)式計(jì)算器

到最后一步一步學(xué)會(huì)利用數(shù)據(jù)結(jié)構(gòu)和算法知識(shí)獨(dú)立完成校園導(dǎo)航咨詢的程序。

希望我們?cè)趯W(xué)習(xí)的過程中一起見證彼此的成長(zhǎng)。

問題描述

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

基本要求

利用單向循環(huán)鏈表存儲(chǔ)結(jié)構(gòu)模擬此過程,按照出列的順序印出個(gè)人的編號(hào)。

測(cè)試數(shù)據(jù)

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

實(shí)現(xiàn)思路1

用的是數(shù)組索引。結(jié)合一點(diǎn)點(diǎn)的算法知識(shí)。

#include<stdlib.h>
#include<stdio.h>
//#用數(shù)組索引的模式 
int main(){
	int m;
	printf("請(qǐng)輸入m的值:");
	scanf("%d",&m);
	int n;
	printf("請(qǐng)輸入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;
	} 
}

實(shí)現(xiàn)思路2

利用單項(xiàng)循環(huán)鏈表的方式,上干貨

運(yùn)用的函數(shù):

  • 創(chuàng)建鏈表
  • 取得鏈表的下標(biāo)
  • 刪除鏈表指定下標(biāo)的元素
  • 得到第i個(gè)元素值

數(shù)據(jù)結(jié)構(gòu)的定義:

  • 結(jié)構(gòu)體 LNode,成員包括:原始下標(biāo),元素值
  • 主函數(shù)的思路:

其中上面的函數(shù)都是參考《數(shù)據(jù)結(jié)構(gòu)(C語言版)》上面。只是將創(chuàng)建鏈表的函數(shù)改成創(chuàng)建單向循環(huán)鏈表的函數(shù)。寫代碼主要時(shí)間消耗在主函數(shù)上。

主函數(shù)的思路:

創(chuàng)建一個(gè)指定大小(n)的循環(huán)鏈表,每一次循環(huán)得到第m個(gè)元素,記錄此元素的下標(biāo),然后移動(dòng)頭結(jié)點(diǎn)到刪除元素前面的結(jié)點(diǎn),再把此時(shí)的頭節(jié)點(diǎn)后面1一個(gè)結(jié)點(diǎn)給刪除。依次遍歷到n個(gè)。

#include<stdlib.h>
#include<stdio.h>
//用單項(xiàng)循環(huán)列表的方式 
//數(shù)據(jù)類型的定義 
typedef struct LNode{
	int data;		//定義密碼值 
	int index; 		//定義數(shù)據(jù)的下標(biāo) 
	struct LNode *next;
}LNode,*LinkList;
int GetElem_L(LinkList L,int i ,int &e){
	LNode* p;				//注意這里的*號(hào) 
	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;				//注意這里的*號(hào) 
	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;				//注意這里的*號(hào)
	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));          //注意這里的*號(hào)
	scanf("%d",&p->data);
	p->index = n;
	p->next = L->next;
	tmp->next = p;
}//創(chuàng)建循環(huán)鏈表 
int main(){
	int m;
	int cnt;
	printf("請(qǐng)輸入m的值:");
	scanf("%d",&m);
	int n;
	printf("請(qǐng)輸入n的值: "); 
	scanf("%d",&n);
	LNode* L;						//注意這里的*號(hào)
	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;
	}
}

結(jié)果

到此這篇關(guān)于C語言數(shù)據(jù)結(jié)構(gòu)中約瑟夫環(huán)問題探究的文章就介紹到這了,更多相關(guān)C語言約瑟夫環(huán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)手機(jī)電話簿管理系統(tǒng)

    C語言實(shí)現(xiàn)手機(jī)電話簿管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)手機(jī)電話簿管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例

    Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例

    去水印是個(gè)麻煩事,本文就來介紹一種方法Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • C++的函數(shù)與指針

    C++的函數(shù)與指針

    今天小編就為大家分享一篇關(guān)于C++函數(shù)與指針的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-10-10
  • Qt編寫自定義控件實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤

    Qt編寫自定義控件實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤

    這篇文章主要為大家詳細(xì)介紹了Qt編寫自定義控件實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++設(shè)計(jì)模式之橋接模式

    C++設(shè)計(jì)模式之橋接模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之橋接模式,本文講解了什么是橋接模式、為什么要使用橋接模式、什么時(shí)候使用橋接模式等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • window調(diào)用api列出當(dāng)前所有進(jìn)程示例

    window調(diào)用api列出當(dāng)前所有進(jìn)程示例

    這篇文章主要介紹了window調(diào)用api列出當(dāng)前所有進(jìn)程示例,需要的朋友可以參考下
    2014-04-04
  • C語言中的參數(shù)傳遞機(jī)制詳解

    C語言中的參數(shù)傳遞機(jī)制詳解

    這篇文章主要介紹了C語言中的參數(shù)傳遞機(jī)制,C語言中函數(shù)參數(shù)的傳遞有:值傳遞、地址傳遞、引用傳遞這三種形式。下面我們?cè)敿?xì)探討下
    2017-04-04
  • vs2022?qt環(huán)境搭建調(diào)試的方法步驟

    vs2022?qt環(huán)境搭建調(diào)試的方法步驟

    最近net6和vs2022發(fā)布,本文就詳細(xì)的介紹一下vs2022?qt環(huán)境搭建調(diào)試的方法步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 迷宮游戲控制臺(tái)版C++代碼

    迷宮游戲控制臺(tái)版C++代碼

    這篇文章主要為大家詳細(xì)介紹了迷宮游戲控制臺(tái)版C++代碼,可以調(diào)整大小的迷宮游戲,給定迷宮的入口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C++實(shí)現(xiàn)LeetCode(125.驗(yàn)證回文字符串)

    C++實(shí)現(xiàn)LeetCode(125.驗(yàn)證回文字符串)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(驗(yàn)證回文字符串).本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

五河县| 安化县| 曲阜市| 林芝县| 密云县| 大化| 泸水县| 兴山县| 体育| 无极县| 新化县| 忻城县| 武隆县| 长白| 固原市| 东丽区| 双柏县| 长垣县| 子洲县| 泗洪县| 威宁| 湖州市| 福清市| 兴国县| 乐安县| 宜兰县| 红安县| 华坪县| 杭锦旗| 冕宁县| 泰州市| 贵州省| 朝阳县| 北碚区| 高平市| 临朐县| 旺苍县| 永宁县| 梓潼县| 临泽县| 娱乐|