循环链表解决约瑟夫问题(简化版)

来源:互联网 发布:好听的淘宝客服昵称 编辑:程序博客网 时间:2024/05/07 07:18

约瑟夫环是一个经典的数学的应用问题:已知N个人(以编号1,2,3...N分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到M的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

这个代码非常简短,但还是利用循环链表完成了求解约瑟夫问题的功能

代码如下:

#include<iostream>#include<cassert>using namespace std;typedef struct Node{int item;struct Node *next;}ListNode,*List;int main(){int M;//规则(隔M个数)int N;//人数(N个人)int a;//编号int i;cout<<"input the N and M"<<endl;cin>>N>>M;List head=(List)malloc(sizeof(ListNode));assert(head!=NULL);cin>>a;head->item=a;head->next=head;ListNode *p=head;for(i=2;i<=N;i++)//构造循环链表,值为1的结点为链表头{cin>>a;p->next=(List)malloc(sizeof(ListNode));p=p->next;p->item=a;p->next=head;}while(p!=p->next)//while循环开始时,p指向链表的尾结点{for(i=1;i<M;i++)p=p->next;ListNode *targetnode=p->next;cout<<targetnode->item<<"出局"<<endl;p->next=p->next->next;free(targetnode);}cout<<p->item<<endl;return 0;}




0 0
原创粉丝点击