数据结构作业二(2)
2012-04-10 21:45 璋廊 阅读(166) 评论(0) 编辑 收藏 举报/*************** (2)约瑟夫环问题:设有n个人围坐在圆桌周围, 从某个位置开始编号为1,2,3,…,n, 坐在编号为1的位置上的人从1开始报数, 数到m的人便出列;下一个(第m+1个)人又从1开始报数, 数到m的人便是第二个出列的人;如此重复下去, 直到最后一个人出列为止,得到一个出列的编号顺序。 例如,当n=8,m=4时,若从第一个位置数起, 则出列的次序为4,8,5,2,1,3,7,6。试编写程序确定出列的顺序。 要求用不带头结点的单向循环链表作为存储结构模拟此过程, 按照出列顺序打印出个人编号 ****************/ #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct point//建立结构体; { int data; struct point *next; }Link,*List; List built(int n)//建立循环链表: { int i; List s,t,h; h=(List)malloc(sizeof(Link)); t=h; t->data=1; for(i=2;i<=n;i++) { s=(List)malloc(sizeof(Link)); s->data=i; t->next=s; t=s; } s->next=h; return h; } int shu(List head,int m,int n) { int i=0; List p,h; p=head; if(m==1)//如果是m是1最后一个一定是n; return n; while(p->next!=p) { i++; if(m-1==i)//数到m时把此节点删除掉; { h=p->next; p->next=h->next; free(h); i=0; } p=p->next; } return p->data; } int main() { int n,m; List head; scanf("%d%d",&n,&m); head=built( n); int count=shu(head,m,n); printf("%d\n",count); return 0; }