代码改变世界

数据结构作业二(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;
}