设有n个人围成一圈,每个人的编号依次1,2,3...n。现从编号?
设有n个人围成一圈,每个人的编号依次1,2,3...n。现从编号为k的人开始报数, 报到m的人出列,再从出列的下一个人开始重新报数,报到m的人又出列,以此类推,直到所有人都出列,求这n个人的出列顺序. 用编写算法,将结果以顺序表和单链表两种方法分别实现 注意:这种约瑟夫问题没有所谓的"输入密码"!
#include #include typedef struct list { int data; struct list *next; }linklist; void main() { int n,m,k,i=1; linklist head,*p,*q,*l; printf("enter n:\n"); scanf("%d",&n); printf("enter m:\n",&m); scanf("%d",&m); printf("enter k:\n",&k); scanf("%d",&k); l=&head; p=l; for(;i<=n;i++) { q=(linklist *)malloc(sizeof(head)); p->next=q; q->data=i; p=q; } p->next=l->next; /*创建循环表*/ p=l->next; for(i=1;inext; while(p->data!=p->next->data) { for(i=1;inext; q=p->next; printf("%3d",q->data); p->next=q->next; p=q->next; /*p指向第k+1个人的位置*/ free(q); /*释放空间*/ } printf("%3d\n",p->data); free(l); free(p); }