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) {
    if (n < 2) {
        L = NULL;
        return;
    }
    
    LNode *head = new LNode;
    head->next = NULL;

    LNode *cur = head;
    for (int i = 1; i <= n; ++i) {
        LNode *node = new LNode;
        node->data = i;
        node->next = cur->next;
        cur->next = node;
        cur = node;
    }

    cur->next = head->next; // 构建循环链表
    delete head; // 删除头结点,注意:这里不使用头结点
    
}

// 约瑟夫环问题
int jose(LinkList L, int n, int m) {
    if (n < 2) {
        return FEW_PEOPLE;
    }
    
    if (m < 2) {
        return WRONG_JUMP;
    }

    LNode *pre, *p;

    pre = p = L;

   while(pre->next != pre){
       for(int i=1;i<m;i++){
           pre=p;//记录待删除节点的前驱
           p=pre->next;//更新待删除节点位置
            
       }//经过m-1个位置
        
       printf("出列人的编号:%d\n",p->data);
        
       pre->next=p->next;//改变删除节点前驱指针域
        
        
       free(p);//释放当前删除节点
        
       p=pre->next;//指向下一个节点
    
   }
    
   return p->data;
}

请注意,以上代码仅供参考,可能还有一些细节需要根据实际情况进行调整。此外,可能需要自行添加头文件引用和命名空间声明等。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?