约瑟夫环C++笔试题

来源:互联网 发布:澳门网络真人博客官网 编辑:程序博客网 时间:2024/06/04 19:11
约瑟夫环经典问题,自己刚好学习到。记录一下,利用循环链表实现的。
场景: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;}


                                             
0 0
原创粉丝点击