约瑟夫环的实现

来源:互联网 发布:建表语句属于sql 编辑:程序博客网 时间:2024/05/21 05:56


废话少说,贴代码


结构部分

template<class T>struct LinkNode{LinkNode *r_Link;T data;LinkNode(const T &x,LinkNode *ptr=NULL){data=x;r_Link=NULL;}};template<class T>class Circle{public:LinkNode<T> *head,*last;Circle(const T &x){head=new LinkNode<T>(x);last=head;}void Insert(const T &x){LinkNode<T> *newNode=new LinkNode<T>(x);last->r_Link=newNode;last=newNode;last->r_Link=head;}bool Remove(T x){LinkNode<T> *p=head,*cur=last;while(1){if(p->data==x)break;cur=p;p=p->r_Link;}cur->r_Link=p->r_Link;if(p==head)      //判断被删节点是否为头节点 head=p->r_Link;delete p;return true;}};

算法实现


id Josefu(Circle<T> &cir,int n,int m){LinkNode<T> *p=cir.head,*cur;if(n==1){printf("只剩一个人员:%d",p->data);return;}while(n>1){for(int i=1;i<m;i++){p=p->r_Link;}cur=p->r_Link;printf("%d 号被淘汰\n",p->data);cir.Remove(p->data);p=cur;n--;}printf("最后留下人员: %d",p->data);}

主函数


int main(){int n,m;printf("输入人数和间隔\n");scanf("%d%d",&n,&m);Circle<int> cir(1);for(int i=1;i<n;i++) cir.Insert(i+1);Josefu(cir,n,m);return 0;}

约瑟夫环核心是用循环链表,单、双链表都行

敢死队问题、淘汰问题都是基于约瑟夫环来实现的






0 0
原创粉丝点击