循环链表-约瑟夫问题

n个人围成一圈编号为1~n的结点 编号为k的结点进行1~m 报数 数到第m人出圈   输出出圈人的次序
/*n个人围成一圈编号为1~n  编号为k的人进行1~m 报数  数到第m人出圈
 * 输出出圈人的次序*/

//1.建立不带头结点的具有 n 个结点的循环链表
//2.不断删除结点,直到剩下一个结点为止

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100

typedef struct node
{
    int data;
    struct node * next;
}Lnode;

void Josephus(int n,int m,int k)
{
    int i = 0;
    Lnode *q = NULL;
    Lnode *p = NULL;
//////从编号k开始创建循环链表   p始终指向第一个结点  q始终指向刚创建的结点
    p = (Lnode *)malloc(sizeof(Lnode));
    q = p;
    for(i = 1;i < n;i++)
    {
        q->data = k;
        k = k%n + 1;
        q->next = (Lnode *)malloc(sizeof(Lnode));
        q = q->next;
    }
    q->data = k;
    q->next = p;
///////////////////////////////////////////////
    while(p->next != p)
    {
       //p指向m处,q为p的前一个结点,删除p后,p又为所删节点的后一个结点
       for(i = 1;i < m; ++i)
       {
           q = p;
           p = p->next;
       }
       q->next = p->next;
       printf("%d ",p->data);
       free(p);
       p = q->next;
    }
    printf("%d\n",p->data);
}
int main(int argc,char argv)
{
    int n = 0,m = 0,k = 0;
    printf("数据结点数n,删除报号结点m,报号起点编号k\n");
    scanf("%d%d%d",&n,&m,&k);
    Josephus(n,m,k);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值