约瑟夫环问题(结构体、链表)(C语言实现)

【题目描述】

设有n个人围坐一圈并按顺时针方向从1到n(n<500)编号,从第1个人开始进行1到m的报数,报数到第个m人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所剩下一人为止。求每一行中最后剩下这个人的编号,编号从1开始。要求利用链表完成编程。

【输入说明】

输入有一行数据,2个数,分别表示n和m.

【输入样例】

10 3

【输出样例】

4

代码实现

#include <stdio.h>

#include <stdlib.h>

int i;

typedef struct node{

    int pos;//编号

    struct node *next;

} LINK;

//创建圆圈,返回链表的头指针

LINK *p1,*p2,*head=NULL;

LINK *CreateList(int n)

{

    for(i=1;i<=n;i++)

    {

        p1=(LINK*)malloc(sizeof(LINK));

        p1->pos=i;

        if(i==1) head=p1;

        else p2->next=p1;

        p2=p1;

    }

    p2->next=head;

    return head;

}

// 删除第x个结点

void DeleteList(LINK *p, int x)

{

    int t=1;

    while(p->next!=p)

    {

        if(t==x-1)p1=p;

        if(t==x+1)

        {

            p1->next=p;

            t=1;

        }

        p=p->next;

        t++;

    }

    head=p;

}

int main()

{

    int m,n,t;

    scanf("%d%d",&n,&m);

    head=CreateList(n);

    DeleteList(head,m);

    printf("%d",head->pos);

    return 0;

 }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是约瑟夫问题的循环链表实现C语言代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct ListNode { int val; struct ListNode *next; } ListNode; // 创建循环链表 ListNode* createList(int n) { ListNode *head = (ListNode*)malloc(sizeof(ListNode)); head->val = 1; head->next = NULL; ListNode *prev = head; for (int i = 2; i <= n; i++) { ListNode *node = (ListNode*)malloc(sizeof(ListNode)); node->val = i; node->next = NULL; prev->next = node; prev = node; } prev->next = head; return head; } // 解决约瑟夫问题 int josephus(int n, int m) { ListNode *head = createList(n); ListNode *p = head; while (p->next != p) { for (int i = 1; i < m-1; i++) { p = p->next; } printf("%d ", p->next->val); p->next = p->next->next; p = p->next; } int res = p->val; free(p); return res; } int main() { int n = 5, m = 3; int res = josephus(n, m); printf("\nThe last number is: %d\n", res); return 0; } ``` 在这个代码中,我们首先定义了链表节点结构体 `ListNode`,然后通过 `createList()` 函数创建了一个包含 `n` 个节点的循环链表。接着,我们使用 `josephus()` 函数来解决约瑟夫问题。该函数通过循环遍历链表,找到要删除的节点,并将其从链表中删除。最后,我们返回最后一个被删除的节点的值作为结果。 注意,由于约瑟夫问题是一个经典问题,因此这个代码中的实现方式并不唯一。可能会有更高效的算法或者更简洁的代码实现方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值