首页 > 编程语言 >【C/C++】循环链表实现约瑟夫问题

【C/C++】循环链表实现约瑟夫问题

时间:2024-04-07 11:33:05浏览次数:17  
标签:node curr int C++ next 链表 约瑟夫 data

#include <iostream>
using namespace std;
typedef struct node {
  int data;
  node* next;
  node() :data(0), next(nullptr) {}
  node(int x) :data(x), next(nullptr) {}
}node;

//循环链表实现约瑟夫问题
void ysflb(int n, int k) {
  if (n <= 0 || k <= 0) {
    cout << "Invalid input: n and k must be positive integers." << endl;
    return;
  }

  // 创建循环链表  
  node* head = new node;
  if (!head) {
    cout << "Memory Failed!\n";
    return;
  }
  head->data = 1; // 第一个人的编号从1开始  
  node* p = head;

  // 赋值  
  for (int i = 2; i <= n; i++) {
    node* r = new node;
    r->data = i;
    r->next = NULL;
    p->next = r;
    p = r;
  }
  p->next = head; // 形成循环链表  

  // 约瑟夫环的模拟  
  node* prev = NULL;
  node* curr = head;
  while (curr->next != curr) { // 当链表中不止一个节点时  
    for (int i = 1; i < k; i++) {
      prev = curr;
      curr = curr->next;
    }
    cout << curr->data << " "; // 输出出局者的编号  
    prev->next = curr->next; // 删除当前节点  
    node* tmp = curr;
    curr = curr->next;
    delete tmp; // 释放当前节点的内存  
  }
  cout << curr->data << endl; // 输出最后一个出局者的编号  
  delete curr; // 释放最后一个节点的内存  
}

int main(void) {
  ysflb(10, 3);
  return 0;
}

标签:node,curr,int,C++,next,链表,约瑟夫,data
From: https://www.cnblogs.com/smartlearn/p/18118732

相关文章