循环链表实现约瑟夫问题

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值