约瑟夫环问题,循环链表建立
/*已知n个人(以编号1,2,3,。。。n分别表示) 围坐在一张圆桌周围。从编号为K的人开始报数, 数到m的那个人出列;他的下一个人又从k开始报数, 数到m的那个人出列;依次规律重复下去, 直到圆桌周围的人全部出列。*/ //约瑟夫环问题,循环链表 #include<iostream> #include<cstring> #include<cstdio> using namespace std; typedef struct lnode { int data; struct lnode *next; }node; node *link_create(int n)//创建n个节点的循环链表 { node *p,*q,*head; int i; p=new node; head=p; p->data=1; for(i=2;i<=n;i++) { q=new node; q->data=i; p->next=q; p=q; } p->next=head;//最后一个节点指向头部,形成循环链表 return head; } void josephus(node *head,int k,int m) { node *p=head,*tmp1; int i; while(p->data!=k) p=p->next; while(p->next!=p) { for(i=0;i<m;i++) { tmp1=p; p=p->next; } printf("%d",p->data); tmp1->next=p->next; delete p; p=tmp1->next; } printf("%d ",p->data); } int main() { node *head=link_create(5); josephus(head,3,1); return 0; }