链表实现约瑟夫环问题

   约瑟夫环(约瑟夫问题)是一个数学的应用问题:
   已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
 从1开始报数,数到m的那个人出列;
 他的下一个人又从1开始报数,数到m的那个人又出列;
 依此规律重复下去,直到圆桌剩下最后一个人,求那个人的位置。
 总体思路:
   1:创建链表(用尾插法创建)
   2:当人数大于1的时候,循环删除m
   3:将最后一个人的地址传给数组。
   4:输出数组的值并且释放指针。

#include <stdio.h>
#include <stdlib.h>
//循环链表的方式
struct node
{
int data;
struct node *next;
};
int main()
{
int n,m;//n为总数,m为报出来的数
int i;
int answer[100];
int count=0;
struct node *head,*tail,*p,*q;//头结点尾节点,P为移动变量,q为循环变量
head=(struct node *)malloc(sizeof(struct node));//为头结点开辟空间
head->data=-1;//先赋值为-1
head->next=NULL;
while(1)//就是一直循环
{
scanf("%d%d",&n,&m);//输入人数和报号删除数
if(n0||m0)
{
free(head);
break;
}
else//m n不等于0的时候
{
tail=head;//尾节点指向头结点
for(i=0;i<n;i++)//尾插法创建循环链表
{
p=(struct node *)malloc(sizeof(struct node));//为p开辟新的节点
p->data=i+1;//为数据域赋值1-n
tail->next=p;//尾插法
p->next=head->next;
tail=p;
}
p=head->next;//初始化,p是头指针的下一个
q=tail;//q是尾指针
i=1;
while(p!=q)//当pq不相等的时候,也就是剩下的人数大于1时
{
if(i==m)//先执行else,后执行if,也就是当i++到m的时候,其实i的定义就是m
{
q->next=p->next;//删除的过程(如果i!=m就需要一直往下走)
free§;
p=q->next;
i=1;
}
else
{
q=p;
p=p->next;
i++;
}
}
head->next=q;//维持链表完整性若没有要求可以省略
answer[count]=p->data;//将找到的值赋给answer[0]。
count++;
free§;
head->next=NULL;
}
}
for(i=0;i<count;i++)
{
printf("%d\n",answer[i]);
}
free(head);
return 0;
}

猜你喜欢

转载自blog.csdn.net/jijijun/article/details/104924291