ZBLOG

任务描述 本关任务:编写一个能解决约瑟夫环的程序。 相关知识 参考PPT。 创建无头结点的单循环链表 使用尾插法,将1,2,...,n,依次插入到链表 出圈 数到m,出圈。 两种做法:1 删除,将指针移到待删除的结点前面,删除 2: 直接调用链表的删除函数删除。删除后改变链表头的指针位置。 编程要求 编程完成jose.cpp中的2个函数: 创建环 void createCycle( LinkList &L, int n); n: 结束的数字 创建从1开始,到n结束的单循环链表(...

下面是一个解决约瑟夫环问题的示例代码:

#include "linklist.h"
#define FEW_PEOPLE -1
#define WRONG_JUMP -2

void createCycle(LinkList &L, int n) {
    L = new LNode;
    L->next = L; // 循环链表初始时指向自己

    for (int i = 1; i <= n; i++) {
        LinkList newNode = new LNode;
        newNode->data = i;

        // 将新节点插入到循环链表尾部
        newNode->next = L->next;
        L->next = newNode;
        L = newNode;
    }
}

int jose(LinkList L, int n, int m) {
    if (n < 2) {
        return FEW_PEOPLE;
    }
    if (m < 2) {
        return WRONG_JUMP;
    }

    LinkList p = L;
    while (p->next != p) { // 当只剩一个人时结束循环
        for (int i = 1; i < m-1; i++) {
            p = p->next; // 数数,每次移动m-1步
        }
        
        LinkList delNode = p->next; // 要删除的节点
        p->next = delNode->next; // 删除节点
        
        delete delNode;

        p = p->next; // 移动到下一个节点继续数数
    }

    return p->data;
}

你可以将上述代码放在jose.cpp文件中,然后编译运行测试主函数即可。记得引入相应的头文件和定义错误码。希望对你有所帮助!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9456

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?