您的位置:首页 > 其它

循环链表实现约瑟夫问题

2016-10-13 21:14 323 查看
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int num;
struct node *next;
} data;//自定义结构体另一个名字
int main()
{
int i,j,n;
int s=1;//从第几个开始数
int m=30;//总人数
data *p,*r,*head,*q ;
head=(data *)malloc(sizeof(data));//头结点
p=head;
printf("第几个人将会被扔向大海:\n");
scanf("%d",&n);//谁被扔向大海
for(i=1; i<=m; i++)
{
r=p;
p=(data *)malloc(sizeof(data));
r->next=p;
p->num=i;
}
p->next=head->next;//将最后一个与第一个连接起来,不是与头结点连接
p=p->next;//p指向第一个节点
j=1;
while(j<s)//控制p首先指向谁,即从第几个人开始数
{
p=p->next;
j++;
}
printf("被扔向大海的是:\n");
do
{
for(i=1; i<n-1; i++)//由for循环控制九次一循环,由循环链表移动
{
p=p->next;//for循环结束,p指向第八个节点
}
q=p->next;//q指向第九个节点
printf("%d   ",q->num);
p->next=q->next;//将第八个节点与第10个节点连接
free(q);//删除第八个节点
p=p->next;//p指向第10个节点
m--;//总数减一,控制循环15次,扔15人
}
while(m>15);
printf("\n\n\n我的心血!\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: