约瑟夫问题

本文介绍了一个使用C语言实现的循环单链表数据结构,并通过该结构模拟了循环报数的过程。具体实现了创建链表、获取指定位置元素、删除指定节点等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<stdlib.h>

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;

LinkList Build(int n)//建立有n个结点的循环单链表 
{
    int i;
    LinkList head;
    head = (LinkList)malloc(sizeof(LNode));
    LinkList s,p = head;
    p->data = 1;
    for(i = 2; i <= n; i ++)
    {
        s = (LinkList)malloc(sizeof(LNode));
        s->data = i;
        p->next = s;
        p = s;
    }
    p->next = head;
    return head;
}
LinkList GetElem(LinkList p,int n)//找到从head开始的第n个结点 
{
    int i;
    LinkList s = p;
    for( i = 1; i < n; i ++)
    {
        s = s->next  ;
    }
    return s;
}
int Delete(LinkList p)//删除p的后继结点 
{
    int num;
    LinkList s;
    s = (LinkList)malloc(sizeof(LNode));
    s = p->next ;
    p->next = s->next ;
    num = s->data ;
    free(s);
    return num;
 } 
void CountOff(int n,int m,int k,LinkList head)//模拟循环报数全过程 
{
    int i,num;
    LinkList p  = head;

    for(i= n; i >= 1; i --)
    {
        p = GetElem(p,m-1);
        num = Delete(p);
        if( i <= k)
            printf("%d ",num);
        p = p->next ; 
    }
}
int main()
{
    int n,m,k;
    LinkList head;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        head = Build(n);
        CountOff(n,m,k,head);
     } 
    return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值