ZBLOG

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

根据任务描述,下面是满足要求的代码:

  1. #include "linklist.h"
  2. #define FEW_PEOPLE -1
  3. #define WRONG_JUMP -2
  4. // 创建循环链表
  5. void createCycle(LinkList &L, int n) {
  6. if (n < 2) {
  7. L = NULL;
  8. return;
  9. }
  10. LNode *head = new LNode;
  11. head->next = NULL;
  12. LNode *cur = head;
  13. for (int i = 1; i <= n; ++i) {
  14. LNode *node = new LNode;
  15. node->data = i;
  16. node->next = cur->next;
  17. cur->next = node;
  18. cur = node;
  19. }
  20. cur->next = head->next; // 构建循环链表
  21. delete head; // 删除头结点,注意:这里不使用头结点
  22. }
  23. // 约瑟夫环问题
  24. int jose(LinkList L, int n, int m) {
  25. if (n < 2) {
  26. return FEW_PEOPLE;
  27. }
  28. if (m < 2) {
  29. return WRONG_JUMP;
  30. }
  31. LNode *pre, *p;
  32. pre = p = L;
  33. while(pre->next != pre){
  34. for(int i=1;i<m;i++){
  35. pre=p;//记录待删除节点的前驱
  36. p=pre->next;//更新待删除节点位置
  37. }//经过m-1个位置
  38. printf("出列人的编号:%d\n",p->data);
  39. pre->next=p->next;//改变删除节点前驱指针域
  40. free(p);//释放当前删除节点
  41. p=pre->next;//指向下一个节点
  42. }
  43. return p->data;
  44. }

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?