Loading...

堆栈实验代码--约瑟夫环

2024-12-03
0
-
- 分钟
|

堆栈实验代码--约瑟夫环

#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;}

文章目录