约瑟夫环经典问题,自己刚好学习到。记录一下,利用循环链表实现的。场景:N个人围一桌,从第k个人开始报数,报到m的人离开桌子,再从下一个人开始报数直到所有人均离开桌子。
基本思路:建立一个循环链表,不断按上述规律删除第m个元素,直到所有元素被删除。
1) 首先建立节点结构体(数据+下一节点地址)
2)借鉴网上其他代码建立linklist类,感觉其实不用这个类一样可以实现,使用后反而迷惑初学者。
该类建立的目的主要是建立种子节点链表,并声明子函数。
3)然后输子函数,重点在建立包含全部节点的循环链表、然后找准起始节点,其后找到第K个节点;以该节点为起点数到要删除的节点,删除之;然后将下一节点next作为当前节点。依次循环n次
#include<iostream> using namespace std; struct node { int date; node *next; }; class linklist { public: linklist() { node *p = new node(); p->date = 1; p->next = p; first = p; }; void josephus(int n,int k,int m); private: node *first; }; void linklist::josephus(int n, int k, int m) { node *p=first; for (int i = 2; i < n+1; i++) { node *q = new node(); q->date = i; q->next = p->next; p->next = q; p = q; } //数到第k个节点,使其为当前节点 p = first; node *temp = p;//这个temp初始值保证了第一次开始计数到m的第一个元素与其后各循环删除元素起始点不一致情况下,循环体可正常运行。 while (--k) p = p->next; while (n--) { for (int i = 1; i < m; i++) { temp = p; p = p->next; } cout << p->date<<" "; temp->next = p->next; p = temp->next; } cout <<endl; } int main() { int n = 9, k = 1, m =5; linklist L; L.josephus(n, k, m); system("pause"); return 0; }
约瑟夫环C++笔试题
最新推荐文章于 2023-07-01 20:54:40 发布