堆栈实验代码--约瑟夫环
#include<bits/stdc++.h> // 包含所有标准库using namespace std; // 定义节点结构体struct Node{ int number; // 存储节点的数值 int id; // 存储节点的ID(在约瑟夫环中表示其顺序编号) Node* next; // 指向下一个节点的指针}; // 初始化链表,返回头节点Node* initNode(){ Node* L = new Node(); // 创建一个新的节点 L->next = L; // 让头节点指向自己,形成一个空环 L->number = -1; // 头节点的number是-1,表示它不是有效的参与者 return L; } // 创建节点并形成约瑟夫环void createNode(Node* L, int n){ Node* p = L; // p指向链表的头节点 int a = 0; // 用来输入每个节点的值 // 循环输入n个节点的数值 for(int i = 1; i <= n; i++){ Node* newNode = new Node(); // 为每一个新节点分配内存 cin >> a; // 输入节点的值 newNode->number = a; // 设置节点的值 newNode->id = i; // 设置节点的ID newNode->next = NULL; // 当前节点的next暂时设为NULL p->next = newNode; // 让当前节点的next指向新节点 p = p->next; // 更新p为新节点,即p现在指向新节点 } p->next = L->next; // 最后让链表形成环,尾节点指向头节点} // 打印链表中的所有节点void printNode(Node* L){ Node* p = L->next; // 从头节点的下一个节点开始遍历 do { cout << p->number << " "; // 打印当前节点的值 p = p->next; // 移动到下一个节点 } while(p != L->next); // 如果回到头节点,则停止} // 删除下一个节点void deleteNode(Node* p) { Node* f = p->next; // f为下一个节点 if (f == p) return; // 如果链表中只有一个节点,直接返回 p->next = f->next; // 将p指向f的下一个节点,实际上就是删除f节点 cout << "删除节点: " << f->id << " "; // 打印被删除节点的ID delete f; // 释放f节点的内存} int main(){ Node* L = initNode(); // 初始化链表,获取头节点 int n; cin >> n; // 输入参与者的数量 createNode(L, n); // 创建n个节点并连接成一个环 printNode(L); // 打印初始的链表 cout << endl; int m; cin >> m; // 输入每次删除节点的间隔 int i = 1; Node* p = L; // p指向头节点 // 循环直到只剩下一个节点 while(p->next != p){ // 每次遍历m-1次,找到第m个节点 for(int i = 1; i < m; i++){ p = p->next; // p向后移动,直到指向第m-1个节点 } m = p->next->number; // 获取被删除节点的number,用它作为新的m值 deleteNode(p); // 删除第m个节点 } cout << "最后剩下的节点: " << p->id << endl; // 输出最后剩下的节点ID system("pause"); // 使程序暂停,等待用户按键 return 0;}