国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)—約瑟夫環(huán)問題(C語言版)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

首先什么是約瑟夫環(huán)

約瑟夫環(huán)實現(xiàn)方式

一、創(chuàng)建結(jié)構(gòu)體變量

二、初始化鏈表

三、構(gòu)建循環(huán)鏈表

四、刪除鏈表

?五、完整代碼及注釋講解

首先什么是約瑟夫環(huán)

約瑟夫環(huán)循環(huán)鏈表中的一個經(jīng)典問題;題目描述:n?個人圍成一圈,從第一個人開始報數(shù),數(shù)到?m?的人出列,再由下一個人重新從?1?開始報數(shù),數(shù)到?m?的人再出圈,依次類推,直到所有的人都出圈;

假設(shè)10個人圍成一圈,依次編號1到10,按從小到大順序報數(shù),報到3的人出局,流程示意圖如下

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

約瑟夫環(huán)實現(xiàn)方式

我個人傾向于循環(huán)鏈表;

一、創(chuàng)建結(jié)構(gòu)體變量

typedef struct Node{
    int data;  //數(shù)據(jù)域
    struct Node* next;  //指針域
}Node;

二、初始化鏈表

Node* Create(){
	 Node* head;
     head = (Node*)malloc(sizeof(Node));
     if (head == NULL) {
         exit(1);
     }
     head->next = NULL;
     return head;
}

三、構(gòu)建循環(huán)鏈表

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

?創(chuàng)建一個臨時結(jié)點tail,將頭結(jié)點head賦予tail,插入新結(jié)點p,讓tailnext指向p,p的next指向head的下一個結(jié)點即結(jié)點p;同時讓tail移到p的位置,為下個結(jié)點插入做準(zhǔn)備;這樣一個循環(huán)鏈表就初步完成了;

代碼塊

Node* Push(Node* head,Node* tail,int 1){
    p->data=i;
    tail->next =p;
    p->next = head->next;
    tail = p;
    return head;
}

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

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

?最重要的一件事,每次插入新結(jié)點后,要將tail移動到新結(jié)點位置!

四、刪除鏈表

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

?

void Print(Node* head){
    Node* q=head;
    q->next = p->next;
    printf("%d ", p->data);
    free(p);
    p = q->next;
}

?五、完整代碼及注釋講解

#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
    int data;
    struct Node* next;
}Node;
//創(chuàng)建結(jié)構(gòu)體變量
Node* Create(){
	 Node* head;
     head = (Node*)malloc(sizeof(Node));
     if (head == NULL) {
         exit(1);
     }
     head->next = NULL;
     return head;
}
int main()
{
     int n, m,i;
     Node * tail, * p, * q;
     Node* head=Create();
     scanf("%d %d", &n, &m);  //輸入n個人圍一圈及報數(shù)m的人出局
//判斷如果插入的數(shù)據(jù)為0或者以報數(shù)0為出局,則結(jié)束操作
     if (n == 0 || m == 0) {
         return 0;
     }
     else {
         tail = head;  //開始沒有數(shù)據(jù),故尾結(jié)點tail與頭結(jié)點重合
         for ( i = 0; i < n; i++) {
             p = (Node*)malloc(sizeof(Node));  //插入新結(jié)點需,先申請動態(tài)內(nèi)存
             if (p == NULL) {        //判斷動態(tài)內(nèi)存是否申請成功
                 printf("申請失敗!");
                 exit(1);
             }
             p->data = i+1; //以下4步為插入新結(jié)點及數(shù)據(jù)的操作,具體分析請看上面構(gòu)建循環(huán)鏈表
             tail->next =p;
             p->next = head->next;
             tail = p;
         }
     }
     p =head->next;  //插入完數(shù)據(jù)后,將最后一個結(jié)點的臨時結(jié)點移到第一個數(shù)據(jù)處
     q =tail;   //然后臨時結(jié)點到尾結(jié)點處
     i = 1;
     while (p != q) {      //首尾結(jié)點是否重合,重合則表示只剩一個數(shù)據(jù),結(jié)束循環(huán)
         if (i == m) {     //對報數(shù)m的人進(jìn)行出局操作
             q->next = p->next;  //以下四步為刪除操作
             printf("%d ", p->data);
             free(p);     //一定記得將刪除鏈表處的內(nèi)存釋放,以免內(nèi)存內(nèi)存泄漏
             p = q->next;
             i = 1;     //刪除后,重新從1開始報數(shù)
         }
         else {   //沒有報數(shù)到m,則p,q結(jié)點都往后移一位
             q = p;  //先q移到p的位置
             p = q->next;  //然后p移到q的下一個位置
             i++;
         }
     }
     printf("%d", p->data);  //打印最后一位出局的人的號數(shù)
     return 0;
}

有什么不足的地方希望個位大佬在評論區(qū)多多指點!

數(shù)據(jù)結(jié)構(gòu)—約瑟夫環(huán)問題(C語言版)文章來源地址http://www.zghlxwxcb.cn/news/detail-513554.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)—約瑟夫環(huán)問題(C語言版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】使用循環(huán)鏈表結(jié)構(gòu)實現(xiàn)約瑟夫環(huán)問題

    【數(shù)據(jù)結(jié)構(gòu)】使用循環(huán)鏈表結(jié)構(gòu)實現(xiàn)約瑟夫環(huán)問題

    目錄 1.循環(huán)鏈表的定義 2.約瑟夫環(huán)問題 3.創(chuàng)建循環(huán)鏈表 4.刪除節(jié)點操作 5.打印所有節(jié)點 6.實現(xiàn)約瑟夫環(huán)問題的完整程序代碼 ??嗨!我是Filotimo__??。很高興與大家相識,希望我的博客能對你有所幫助。 ??本文由Filotimo__??原創(chuàng),首發(fā)于CSDN??。 ??如需轉(zhuǎn)載,請事先與我聯(lián)

    2024年01月18日
    瀏覽(19)
  • C語言數(shù)據(jù)結(jié)構(gòu)篇——約瑟夫環(huán)的實現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)篇——約瑟夫環(huán)的實現(xiàn)

    作者名:Demo不是emo? 主頁面鏈接 : 主頁傳送門 創(chuàng)作初心: 對于計算機的學(xué)習(xí)者來說,初期的學(xué)習(xí)無疑是最迷茫和難以堅持的,中后期主要是經(jīng)驗和能力的提高,我也剛接觸計算機1年,也在不斷的探索,在CSDN寫博客主要是為了分享自己的學(xué)習(xí)歷程,學(xué)習(xí)方法,總結(jié)的經(jīng)驗等

    2023年04月08日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)-循環(huán)鏈表:處理約瑟夫環(huán)問題

    數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)-循環(huán)鏈表:處理約瑟夫環(huán)問題

    目錄 問題描述 一、基本概念 ?1.普通鏈表 2.單向循環(huán)鏈表? 二、問題處理 1.創(chuàng)建鏈表 2.查找 3.刪除 ?4.其他 ?三.實驗環(huán)節(jié) 四.總結(jié) 約瑟夫環(huán)問題的一種描述是:編號為1,2,...,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數(shù))。一開始任選一個正整數(shù)作為報數(shù)

    2024年02月07日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)實驗---順序表的合并---鏈表的基本操作---重點解析約瑟夫問題

    數(shù)據(jù)結(jié)構(gòu)實驗---順序表的合并---鏈表的基本操作---重點解析約瑟夫問題

    實驗的寫法多種多樣,但本文并未采用 #define 定義容量的寫法,這樣寫已經(jīng)是很老舊過時的寫法。所有實驗主體采用均為動態(tài)開辟,后續(xù)如果利用 C++ 來寫或許會應(yīng)用更多語法… 本篇展示數(shù)據(jù)結(jié)構(gòu)的兩個實驗 其中,重點分析約瑟夫問題 實驗中代碼的命名風(fēng)格等均與下方博客

    2024年02月16日
    瀏覽(33)
  • 數(shù)據(jù)結(jié)構(gòu)上機實驗——棧和隊列的實現(xiàn)、棧和隊列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題

    數(shù)據(jù)結(jié)構(gòu)上機實驗——棧和隊列的實現(xiàn)、棧和隊列的應(yīng)用、進(jìn)制轉(zhuǎn)換、約瑟夫環(huán)問題

    ??1.利用棧的基本操作實現(xiàn)將任意一個十進(jìn)制整數(shù)轉(zhuǎn)化為R進(jìn)制整數(shù)。 ??2.利用循環(huán)隊列實現(xiàn).約瑟夫環(huán)問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數(shù),數(shù)到k的那個人出圈;他的下一個人又從1開始報數(shù),數(shù)到k的那個人出圈;依

    2024年02月08日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)實驗1約瑟夫環(huán)

    剛開始m值為20 循環(huán)鏈表

    2024年02月08日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu)與算法——約瑟夫環(huán)

    數(shù)據(jù)結(jié)構(gòu)與算法——約瑟夫環(huán)

    目錄 一、例題引入 ? ? ? ? # 解題思路 ????????#圖例分析 ? ? ? ? #代碼段 ? ? ? ? #題解小結(jié) ?二、循環(huán)鏈表 ? ? ? ? 分析: ? ? ? ? 直接看代碼: ?三、標(biāo)記數(shù)組 ? ? ? ? 分析: ? ? ? ? 代碼: 四、遞歸算法? ? ? ? ? #沿用解釋 ? ? ? ? 設(shè)有n個人坐在圓桌周圍,

    2024年02月08日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】約瑟夫環(huán)(C/C++)

    【數(shù)據(jù)結(jié)構(gòu)與算法】約瑟夫環(huán)(C/C++)

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

    2024年02月12日
    瀏覽(22)
  • C語言:約瑟夫環(huán)問題詳解

    C語言:約瑟夫環(huán)問題詳解

    前言 哈嘍,寶子們!本期為大家?guī)硪坏繡語言循環(huán)鏈表的經(jīng)典算法題(約瑟夫環(huán))。 據(jù)說著名歷史學(xué)家Josephus有過以下的故事:在羅馬人占領(lǐng)喬塔帕特后,39個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被人抓到,于是決定了一個自殺方式,41個人

    2024年04月13日
    瀏覽(20)
  • C語言 | 約瑟夫問題(猴王爭奪戰(zhàn))

    C語言 | 約瑟夫問題(猴王爭奪戰(zhàn))

    ? ? ? ? ?約瑟夫問題有時也稱為約瑟夫斯置換,是一個出現(xiàn)在計算機科學(xué)和數(shù)學(xué)中的問題。在計算機編程的算法中,類似問題又稱為約瑟夫環(huán)。下面我們將用猴子爭大王這一故事以及采用單向循環(huán)鏈表這一方法來進(jìn)行講解這一問題。 ? ? ? ? 設(shè)編號為1,2,……n得n個猴子圍

    2024年02月01日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包