2020-08-21[循環(huán)鏈表模擬約瑟夫問題]

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node
{
    int num;
    struct Node* Next;
} Person;

typedef struct Node* PersonList;

// 創(chuàng)造一個包含41個人的單循環(huán)鏈表
// 并給她們按1~41開始編號
void CreatePersonList(PersonList* PL, int n)
{
    int length = 0;
    *PL = (PersonList)malloc(sizeof(Node));
    (*PL)->Next = *PL;
    (*PL)->num = length; // 頭結(jié)點(diǎn)數(shù)據(jù)域保存鏈表的長度 
    PersonList pHead = *PL;
    PersonList pNew;
    int i = 1;
    while(i <= n){
        length++; 
        pNew = (PersonList)malloc(sizeof(Node));
        pNew->num = i++;
        pHead->Next = pNew;
        pHead = pNew;
    }

    pNew->Next = (*PL)->Next;
    (*PL)->num = length;
}

// 打印鏈表
void PrintList(PersonList L)
{
    PersonList pt = L->Next;

    while (pt->Next != L->Next) {
        printf("%d ", pt->num);
        pt = pt->Next;
    }
    printf("%d ", pt->num);
    printf("\n");
}

// 約瑟夫問題
// 打印死亡編號
void PrintDeadNo(PersonList *PL)
{
    PersonList p = *PL; // 第一個人開始報數(shù)
    PersonList q;
    int i = 0;
    
    printf("死者編號:");
    while (p != p->Next) {
        p = p->Next;
        i++;
        if (i == 2) {
            i = 0;
            q = p->Next;
            printf("%d ", q->num);
            p->Next = q->Next;
            free(q);
            (*PL)->num--;
            if((*PL)->num < 3){
                break;
            }
        }
    }
    printf("\n幸存者:");
    for(int i = 0; i < (*PL)->num; i++){
        q = p->Next;
        printf("%d ", q->num);
        p->Next = q->Next;
    }
    printf("\n");
}

int main()
{
    /*
        用循環(huán)鏈表模擬約瑟夫問題,把41個人自殺的順序編號輸出
    */
    PersonList pl;

    CreatePersonList(&pl, 41);
    
    PrintDeadNo(&pl);

    return 0;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容