c實現循環鏈表

解決約瑟夫環問題核心步驟:node

1.創建具備n個節點、無頭的循環鏈表ios

2.肯定第一個報數人的位置spa

3.不斷從鏈表中刪除鏈節點,直到鏈表爲空指針

    

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

typedef struct lnode
{
    int data;
    struct lnode *link;
}lnode;

/**
 * @brief 約瑟夫環問題:
 *    n 我的,編號爲 1,2,...,n 
 *    從編號K的人開報數(從1開始)
 *    喊道 m 的人出列,也就是:從 1 數到 m,
 *
 * @param total    總人數
 * @param start    肯定第一個開始報數的人編號
 * @param outnum   指定出列者喊到的數
 */
void JOSEPHUS(int total, int start, int outnum)
{
    //1. 定義變量
    lnode *p;    
    lnode *r;
    lnode *curr; //curr 指向尾, curr->link 指向頭

    //2. 創建第一個節點
    p = (lnode*)malloc(sizeof(lnode));
    p->data = 1;
    p->link = p;
    curr = p;

    //3. 創建循環鏈表
    for (int i=2; i<=total; i++)
    {
        lnode *t = (lnode*)malloc(sizeof(lnode));
        t->data = i;
        t->link = curr->link;
        curr->link = t;
        curr = t;
        printf("%d\n", i);
    }

    //4. 指針移動到第一個報數的人
    while (start--)
    {
        r = p;
        p = p->link;
    }

    //5. 開始遍歷刪除
    while (total--)
    {
        //定位刪除點
        for (int s=outnum-1; s--; r=p,p=p->link);

        printf("%d->", p->data);
        
        //刪除節點
        r->link = p->link;
        free(p);
        p = r->link;
    }
    printf("\n");
}

int main()
{
    int total = 10; //總人數
    int start = 1;  //肯定第一個開始報數的人編號(1,2,...)
    int outnum = 4; //指定出列者喊到的數
    
    JOSEPHUS(total, start, outnum);
}
相關文章
相關標籤/搜索