当前位置 博文首页 > 用心编码:算法-循环链表[约瑟夫问题]

    用心编码:算法-循环链表[约瑟夫问题]

    作者:[db:作者] 时间:2021-09-07 13:26

    1. 链表属于线性表的一种,数据逻辑内存相邻,物理内存不相邻。
    2. 常见链表有:单向链表,双向链表,循环链表。
    3. 约瑟夫问题:有n个人围在一起,初始化时编号相邻,例如:1~41;从任何一个人开始报数为1,当有人报数为3时,该人死亡,从下一个人开始报数为1,一直循环,直到最后剩下不足3个人时游戏结束。需要求出死亡顺序和可能存在有人不死亡的情况。
    4. 代码:
    /**
    * 约瑟夫问题
    * 循环链表
    */
    #include "stdafx.h"
    #include "stdlib.h"
    
    #define LEN 41
    
    using namespace std;
    typedef int TYPE;
    
    typedef struct Node {
        TYPE data;
        Node* next;
        Node* prev;
    }LNode,*PNode;
    
    PNode head;
    
    void create_list() {
        PNode node = (PNode)malloc(sizeof(LNode));
        if (NULL != node) {
            node->data = 1;
            node->next = NULL;
            node->prev = NULL;
            head = node;
        }
        PNode newhead = head;
        for (int i = 2; i <= LEN;i++) {
            PNode newnode = (PNode)malloc(sizeof(LNode));
            newnode->data = i;
            if (i == LEN) {
                newnode->next = head;
                head->prev = newnode;
            }
            else {
                newnode->next = NULL;
            }
            newhead->next = newnode;
            newnode->prev = newhead;
            newhead = newnode;
        }
    }
    
    // index == 3
    void joseph(int index) {
        int i = 1, j = LEN;
        PNode newhead = head;
        printf("dead people:\0");
        while (i++ <= LEN) {
            newhead = newhead->next;  
            if (j==2) {
                printf("remainder:%d \0",newhead->data);
                printf("%d",newhead->prev->data);
                return;
            }
            if (i == index) {
                PNode nextTemp = newhead->next;
                PNode prevTemp = newhead->prev;
                prevTemp->next = nextTemp;
                nextTemp->prev = prevTemp;
                printf("%d \0",(newhead->data));
                //newhead = NULL;
                //free(newhead);  // 释放内存
                j--;
                i = 0;
            }
        }
    }
    int main()
    {
        create_list();
        joseph(3);
        return 0;
    }
    cs