近幾日比較火的一個(gè)問題?為啥呢?因?yàn)槲覀冊趯W(xué)數(shù)據(jù)結(jié)構(gòu)

一般說來,學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),都會寫一個(gè)約瑟夫環(huán)的算法?下面我就簡單說說,
對于這個(gè)規(guī)則就不細(xì)述了。

分析:1 .首先要創(chuàng)建鏈表,創(chuàng)建一個(gè)循環(huán)鏈表?是要頭結(jié)點(diǎn)呢? 其實(shí)都可以
2 .整個(gè)實(shí)現(xiàn)過程其實(shí)就是循環(huán)鏈表的刪除操作。但是要把握細(xì)節(jié)。廢話不多說

便于測試,我就把密碼寫成了隨機(jī)數(shù)

具體的細(xì)節(jié)我就寫在注釋里面了

#define _CRT_SECURE_NO_WARNINGS     //預(yù)編譯處理
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef struct node     // 定義節(jié)點(diǎn)
{
    int num;    //編號
    int pwd;    //密碼
    struct node *next;
}Node, *LinkList;


void CreatList(LinkList &L, int n)  // 創(chuàng)建鏈表
{
    int data;
    LinkList LNew, pCur;

    pCur = L;

    int i;
    srand((unsigned)time(NULL));


    for (i = 0; i < n; i++) {
        LNew = (LinkList)malloc(sizeof(Node));
        LNew->num = i + 1;
        LNew->pwd = (rand() % 5 + 1);

        pCur->next = LNew;
        pCur = LNew;
    }

    pCur->next = L->next;

    return;
}

void Print(LinkList L)  // 打印鏈表
{
    if (L->next == NULL) {      //判斷空鏈表
        printf("此鏈表為空!\n");
        return;
    }

    LinkList pCur;
    pCur = L->next;

    while (1) {
        printf("%-4d%-4d\n", pCur->num, pCur->pwd);
        pCur = pCur->next;
        if (pCur == L->next)
            break;
    }
    return;
}

void Game(LinkList &L, int n)
{
    int count_All;  //計(jì)數(shù)器,用于標(biāo)記當(dāng)前的個(gè)數(shù)
    int count_Every;    //單次循環(huán)計(jì)數(shù)器

    LinkList pPre;
    LinkList FreeTemp;

    count_All = 0;  
    count_Every = 1;

    int flagPwd;    
    srand((unsigned)time(NULL));    /* 設(shè)置初始密碼為隨機(jī)值(1~n) */
    flagPwd = rand()%n+1;
    
    pPre = L;
    
    printf("初始密碼為:flagPwd=%d\n", flagPwd);

    while (1) {
        if (flagPwd == count_Every) {

            printf("%d ", pPre->next->num);     //打印 出局者 的序號

            printf("%d\n", pPre->next->pwd);    // 打印 出局者 的 pwd

            flagPwd = pPre->next->pwd;      //重置密碼 pwd 為 出局者密碼

            FreeTemp = pPre->next;      // 記錄出局者 待后續(xù)釋放空間

            pPre->next = pPre->next->next;      //刪除節(jié)點(diǎn)(出局者)

            free(FreeTemp);     //釋放出局者 

            count_All++;    //計(jì)數(shù) 刪除節(jié)點(diǎn)的個(gè)數(shù)

            count_Every = 0;    // 刪除節(jié)點(diǎn)之后,計(jì)數(shù)為置為 0
        }
        else {

            pPre = pPre->next;  //游標(biāo)后移
        }

        count_Every++;  //當(dāng)前計(jì)數(shù)加 +1 

        if (count_All == n) {
            L->next = NULL;
            break;
        }

        fflush(stdin);  //清除緩存
    }
}


int main()      //主函數(shù)
{
    LinkList L; // 

    L = (LinkList)malloc(sizeof(Node));
    L->next = NULL;     //頭結(jié)點(diǎn)指針域?yàn)榭眨乐篂楹喜⒅鬄榭盏妮敵霎惓?
    int n;  //游戲人數(shù)
    printf("請輸入游戲人數(shù):");
    scanf("%d", &n);

    CreatList(L, n);    //初始化游戲
    printf("游戲初始化結(jié)果:\n");
    Print(L);           //打印初始化結(jié)果

    printf("游戲結(jié)果:\n");  //游戲處理
    Game(L, n);

    //printf("結(jié)果:\n");
    //Print(L);

    system("pause");

    return 0;
}


Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容