首页 > 代码库 > C++循环链表实现约瑟夫退圈(类封装)

C++循环链表实现约瑟夫退圈(类封装)

node.h

 1 #pragma once 2 #include <iostream> 3 #include <iomanip> 4 using namespace std; 5  6 struct number 7 { 8     int n; 9     number *_next;10 };//结构体定义11 class node12 {13     int m,k;//m报数上限 k人数14     number *s;15 public://成员函数16     node(void);17     ~node(void);18     void Joseph();19     void set(int x);20     void Delete(int x);21 };

node.cpp

 1 #include "node.h" 2 node::node(void) 3 { 4     s=NULL;//构造函数 令指针s指向空 5 } 6 node::~node(void) 7 { 8 } 9 void node::Joseph()10 {11     int i=0,l=0;12     cout<<"请输入总人数、报数上限:"<<endl;13     cin>>k>>m;14     cout<<"依次退圈的人:"<<endl;15     set(k);16     number *p=s,*q;17     while(l<k-1)18     {19         q=p;20         p=p->_next;21         i++;22         if(i==m)23         {24             l++;25             cout<<q->n<<""<<endl;//报数报到上限 记录退出成员号码26             Delete(q->n);//该成员退圈 及删除该节点27             i=0;28         }29     }30     cout<<"最后剩下的人: "<<s->n<<""<<endl;//最后链表中剩下的最后一个节点31 }32 void node::set(int x)//建立循环链表33 {34     int i;35     s=new number;36     s->n=1; s->_next=NULL;//没有设头结点37     number *p=s,*q=NULL;38     for(i=2;i<=x;i++)39     {40         q=new number;41         q->n=i;42         q->_next=NULL;43         p->_next=q;44         p=q;45     }46     p->_next=s;//最后一个节点指针指向第一个节点实现循环47 }48 void node::Delete(int x)//删除链表中数据为x的节点49 {50     number *p=s,*q=NULL;51     if(s->n==x)52     {53         while(p->_next!=s)54         {55             q=p;56             p=p->_next;57         }58         s=s->_next;59         p->_next=s;60     }61     else62     {63         while(p->n!=x)64         {65             q=p;66             p=p->_next;67         }68         q->_next=p->_next;69     }70 }

main.cpp

1 #include "node.h"2 void main()3 {4     node a;5     a.Joseph();6 }

结果截图:

技术分享技术分享

 

C++循环链表实现约瑟夫退圈(类封装)