以下是用循环链表实现约瑟夫环的C++代码示例:

#include <iostream>
using namespace std;

struct Node {
    int data;
    Node* next;
};

Node* createCircularLinkedList(int n) {
    Node* head = new Node();
    head->data = 1;
    head->next = nullptr;
    Node* prev = head;
    
    for (int i = 2; i <= n; i++) {
        Node* newNode = new Node();
        newNode->data = i;
        newNode->next = nullptr;
        prev->next = newNode;
        prev = newNode;
    }
    
    prev->next = head;  // 将最后一个节点的next指针指向头节点,形成循环链表
    
    return head;
}

void josephus(int n, int p) {
    Node* head = createCircularLinkedList(n);
    
    Node* curr = head;
    while (n > 0) {
        for (int i = 1; i < p; i++) {
            curr = curr->next;
        }
        
        Node* nextNode = curr->next;
        cout << curr->data << " ";
        
        curr->next = nextNode->next;
        delete nextNode;
        
        curr = curr->next;
        n--;
    }
    
    delete head;
}

int main() {
    int n, p;
    cin >> n >> p;
    
    josephus(n, p);
    
    return 0;
}

该代码首先创建一个循环链表,然后使用循环遍历链表,每次找到第p个节点并删除,直到链表为空。在删除节点之前,会将其原序号输出。最后释放内存并结束程序

1 约瑟夫环 c++要求用循环链表实现N 个人围成一圈顺序编号从 1 号开始按 1、2、3顺序报数报p者退出圈外其余的人再从 1、2、3 开始报数报 p 的人再退出圈外以此类推。请按退出顺序输出每个退出人的原序号。 输入格式输入只有一行包括一个整数 N1=N=3000及一个整数 p1=p=5000。输出格式按退出顺序输出每个退出人的原序号数据间以一个空格分隔但行尾无空格。输入样例在这里给出一组输入

原文地址: https://www.cveoy.top/t/topic/hNlT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录