一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++實現約瑟夫環(huán)的循環(huán)單鏈表

C++實現約瑟夫環(huán)的循環(huán)單鏈表

2022-02-16 15:58些許草率罷了 C/C++

這篇文章主要為大家詳細介紹了C++實現約瑟夫環(huán)的循環(huán)單鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

約瑟夫環(huán)(約瑟夫問題)是一個數學的應用問題:已知 n 個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。. 從編號為 k 的人開始報數,數到 m 的那個人出圈;他的下一個人又從 1 開始報數,數到 m 的那個人又出圈;依此規(guī)律重復下去,直到剩余最后一個勝利者。. 例如:有10個人圍成一圈進行此游戲,每個人編號為 1-10 。. 若規(guī)定數到 3 的人出圈。. 則游戲過程如下。. (1)開始報數,第一個數到 3 的人為 3 號,3 號出圈。. 1, 2, 【 3 】, 4, 5, 6, 7, 8, 9, 10。. (2)從4號重新從1開始計數,則接下來數到3的人為6號,6號出圈。

廢話不多說,直接上代碼:

下面是頭文件,命名為”約瑟夫環(huán).h“

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef Josephus_circle//判斷是否被定義過Josephus_circle
#define Josephus_circle
 
struct Node//定義一個結構體,用來表示每一個結點
{
 int data;//表示每一個結點的數字,也就是序號
    Node* next;//定義一個結構體指針,用來指向后一個結點
};
 
class Josephus//定義一個類,里面包含有三個接口,和兩個私有成員變量
{
public :
 Josephus(int n);//定義一個構造函數,用來創(chuàng)建一個約瑟夫環(huán)
 ~Josephus();//析構函數,用以銷毀一個約瑟夫環(huán)
 void ResultShow(int m);//展示出圈順序
private :
 Node * rear,*first;//定義一個節(jié)點形指針,用來指向最后一個結點
};
#endif

下面是接口的具體實現,命名為“約瑟夫環(huán).cpp”

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include<iostream>//引入輸入輸出流
#include"約瑟夫環(huán).h"//引入約瑟夫環(huán)頭文件
 
using namespace std;
 
 Josephus::Josephus(int n)
{
  first=rear = new Node;//將頭指針和尾指針指向第一個新建的結點,也就是初始化指針
  rear->data = 1;//首先,將第一個結點數據域賦值為1
  for (int i = 2; i <= n; i++) //從2開始
  {
   Node* s = new Node;//定義一個Node形指針s,指向新建的一個結點
   rear->next = s;//將指向頭結點的尾指針指向下一個結點,也就是s所指的結點
   s->data = i;//將新建的結點數字域賦值為i
   rear = s;//將尾結點移動到新建結點s
  }
  rear->next = first;//在循環(huán)過后,將尾結點和頭節(jié)點連接起來,構成循環(huán)鏈表
}
Josephus::~Josephus()
{
 if (first!=rear)//判斷環(huán)是否為空
 {
  while (first != rear)//每次循環(huán)都是當頭節(jié)點不等于尾結點時候,開始刪除:……
  {
   Node * p = first;//定義一個新的節(jié)點形指針,指向頭節(jié)點,用作暫存要刪去的結點
   first = first->next;//將頭節(jié)點移動到下一個結點
   delete p;//刪除之前頭節(jié)點所指向的結點
  }
  delete rear;//在刪除完成后,剩下的最后就只有尾結點了,刪除即可
 }
 else
 {
  cout << "約瑟夫環(huán)為空,請先建立新環(huán)!" << endl;//空表提示
 }
}
void Josephus::ResultShow(int m)
{
 cout << "出環(huán)順序為:" << endl;
 Node * p = first;//定義一個Node類型的p,等于first
 Node * pre=first,* reserve=nullptr;//定義pre等于first,和一個代替p指針被刪除的結點的指針
 int count = 1;//定義一個計數的count使其為一
 while (p->next != p)//如果p->next所指向的結點是p的話,表示,這已經是最后一個結點了,該節(jié)點為最后出圈
 {
  if (count < m)//count來計數,每次到了m就出圈對應結點
  {
   pre = p;//將pre等于p,以便于表示p變換前的結點
   p = p->next;//p向下一結點移動
   count++;//移動一次count加一次
  }
  else//每次count=m時候就開始刪除對應結點
  {
   pre->next = p->next;//首先從環(huán)中摘去要刪除的p所指的結點
   reserve = p;//使用reserve來保存被摘去的結點p
   cout << p->data << "\t";//輸出結點p所數據域,輸出在屏幕上表示p結點的出圈
   p = p->next;//p指向下一結點,以便于下一輪的循環(huán)
   delete reserve;//刪除保存p的reserve所對應的結點
   count = 1;//將計數恢復為1,以便下一輪計數
  }
 }
 cout << p->data << endl;//這最后一個就是最后出圈的結點,也就是所謂的勝利者,最后單獨輸出屏幕
 delete p;//輸出最后再刪除這一結點,釋放內存
 pre=first=rear=p = NULL;//避免野指針出現使其指向空
}

下面是main函數,命名為“約瑟夫環(huán)_main.cpp”

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>//引入輸入輸出流
#include"約瑟夫環(huán).h"//引入頭文件
 
using namespace std;
 
//主函數區(qū)域
int main() {
 int m, n;
 cout << "請輸入約瑟夫環(huán)人數以及密碼\n";
 cout << "人數n:";
 cin >> n;
 cout << endl << "密碼m:";
 cin >> m;
 Josephus L(n);//創(chuàng)建一個約瑟夫環(huán),環(huán)數為10
 L.ResultShow(m);//定義密碼m,輸出出圈順序
 return 0;
}

下面是運行截圖:

C++實現約瑟夫環(huán)的循環(huán)單鏈表

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_56715530/article/details/120990262

延伸 · 閱讀

精彩推薦
  • C/C++c++ 單線程實現同時監(jiān)聽多個端口

    c++ 單線程實現同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 男人天堂网页 | 亚洲精品免费观看 | 天天做天天玩天天爽天天 | 精品视频中文字幕 | 欧美亚洲高清日韩成人 | 国产亚洲精品自在线亚洲情侣 | 国产精品乱码高清在线观看 | 国产自在自线午夜精品之la | 亚洲AV久久久噜噜噜久久 | 大桥未久midd—962在线 | 草逼吧 | 变形金刚第一部 | 色色色色色色网 | 1313午夜精品久久午夜片 | 国产色在线观看 | 亚洲情射 | 精品久久久久亚洲 | 91伊人网| 国内精品麻豆 | 美女扒开屁股让我桶免费 | 午夜亚洲一区二区福利 | 国产麻豆麻豆 | 亚洲人成网站在线观看90影院 | 91素人约啪 | 国产精品久久久久久 | 国产精品吹潮香蕉在线观看 | 羞羞色男人的天堂伊人久久 | 91看片淫黄大片欧美看国产片 | 舔大逼| 男人影院在线观看 | 91视频综合网| 国产免费又粗又猛又爽视频国产 | 大陆性出航 | 日本加勒比在线播放 | 性派对videos18party | 成人免费网站视频ww | 日韩欧美一区二区不卡 | 亚洲男gay同性同志 亚洲免费在线看 | 手机看片国产免费现在观看 | 调教小龙女 | 免费网站看v片在线成人国产系列 |