第二次作业:

习题2 载具杀手与时停高手(约瑟夫环问题)

著名绅士简尚夫有一项特殊的天赋,他可以摧毁任意一辆载具(载具杀手)。他的朋友狄傲可以将时间暂停(时停高手)。他俩玩一个游戏。

有N辆车,编号1~N。其中编号A的是狄傲心爱的压路机。指定编号B的车作为起点,简尚夫首先摧毁这辆车;然后往后数K辆车,摧毁第K辆;然往后数K辆车,摧毁第K辆。数到最后一辆车,则回到剩余的第一辆车接着数。直到把所有车全部摧毁。当简尚夫将要摧毁狄傲的压路机时,狄傲会发动时停技能阻止他。

请你构建循环链表,模拟这个过程(模拟到发动时停技能时为止)
最后按顺序打印时停技能发动时,剩下的车的编号

输入:四个整数,空格隔开。
N : 车的数目。
A : 压路机的编号。
B : 作为起点的车的编号。
K : 每次跳过的车的数目。

输出:若干整数,空格隔开。
剩下的车的编号。

示例:
(输入)5 2 3 2
(输出)1 2 4
(说明)
初始:1->2->3->4->5->
摧毁第一辆车后:1->2->4->5->
摧毁第二辆车后:1->2->4->
下一辆要摧毁的车狄傲的压路机,于是他发动了时停,游戏结束。输出:1 2 4

循环链表节点类型定义(供参考):
struct ListNode {
int val;
ListNode *next;
};

刚开始总体骨架的构造出现问题,经过研究与提问,得到了最终的答案:
csdn版(有代码):

C循环链表程序出现Process returned -1073741819 (0xC0000005)的问题-编程语言-CSDN问答https://ask.csdn.net/questions/7521382?spm=1005.2025.3001.5141&weChatOA=StackOverflow版(原汁原味):

c - CodeBlocks gives "Process returned -1073741819 (0xC0000005)", with 0 error nd 0 warning when I create a linked list cycle - Stack Overflowhttps://stackoverflow.com/questions/69380138/codeblocks-gives-process-returned-1073741819-0xc0000005-with-0-error-nd-0/69380437#69380437

可是随后,我发现貌似使用结构体数组并没有什么意义,本来是为了好找每个结点,但是要是按照我在函数内部定义数组,那么由于 a[] 是一个自动变量(局部变量),我在外面仍然调用不了里面的 a[i] 的结点,因此我选择普通的结点,

但是要使用 *head 以及 *tail 来表示循环链表的头尾位置,这样,

(1)我们使用 *head 便于从头部向尾部进行遍历每个结点

(2)我们使用 *tail 便于进行尾插法的操作 *****

注:普通链表的头插法需要头指针,尾插法需要尾指针。


接下来:

在编程的过程中,出现了最大的问题就是:

在if判断条件的书写时,把比较是否相等的 == 当作了

于是,调了好长时间,终于在人眼 debug 的时候发现了

另外,告诉我一个道理,充分的运动有利于 bug 的寻找。

以下是目前的代码,
实现了基本的功能,但是在车车的总数为1的时候,程序会报错(如输入"1 1 1 1")。

#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode
{int val;struct ListNode* next;
} ListNode;///*
//makenode:
//input: *p(last node), val
//*/
//ListNode* makenode(ListNode* p, int value)
//{
//  ListNode* new_node = (ListNode*)malloc(sizeof(ListNode));
//  p->next = new_node;
//  new_node->val = value;
//  new_node->next = NULL;
//  return new_node;
//}/*
makecycle:
input: **head, **tail, N, A
*/
void makecycle(ListNode** head_ref, ListNode** tail_ref, int N, int A)
{int i;ListNode* new_node = NULL;(*head_ref)->val = 1;(*head_ref)->next = NULL;(*tail_ref) = (*head_ref);for(i = 1; i < N; i++){new_node = (ListNode*)malloc(sizeof(ListNode));(*tail_ref)->next = new_node;(*tail_ref)->val = i;printf("%d->", (*tail_ref)->val);//test(*tail_ref) = new_node;new_node->next = NULL;new_node->val = i+1;}printf("%d", (*tail_ref)->val);//testnew_node->next = (*head_ref);printf("\n------------------------------\n");
}/*
denode:
input: **head, **tail, N, A, B, K
*/
int denode(ListNode** head_ref, ListNode** tail_ref, int N, int A, int B, int K)
{ListNode* p = (*head_ref);ListNode* q = (*head_ref);//ListNode* r = NULL;int i, j;//if(B != 1){for(i = 1; i < B-1; i++){if(p != NULL) p = p->next;}}else{p->next = (*head_ref);}//for(i = 1; i < A; i++){if(q != NULL) q = q->next;}//for(;;){//if((p->next != NULL)&&(p->next != q)&&(p->next != (*head_ref))){printf("the deleted node: %d\n", p->next->val);p->next = p->next->next;}//if(p->next == q){return 0;}//if(p->next == (*head_ref)){(*head_ref) = (*head_ref)->next;printf("the deleted node: %d\n", p->next->val);p->next = p->next->next;}//for(j = 1; j < K; j++){p = p->next;}}}int main()
{int N, A, B, K;printf("N : 车的数目。\nA : 压路机的编号。\nB : 作为起点的车的编号。\nK : 每次跳过的车的数目。\n");ListNode* p = NULL;//inputscanf_s("%d %d %d %d", &N, &A, &B, &K);//head node, tail nodeListNode* head = (ListNode*)malloc(sizeof(ListNode));ListNode* tail = (ListNode*)malloc(sizeof(ListNode));//makecylcemakecycle(&head, &tail, N, A);//denodedenode(&head, &tail, N, A, B, K);//outputp = head;do{printf("%d ", p->val);p = p->next;}while(p != head);
}

数据结构与算法作业3——约瑟夫环问题(循环链表)相关推荐

  1. 北航算法作业一 约瑟夫环问题

    一.单向链表模拟 class Node:def __init__(self, num, next):self.num = numself.next = nexta = [] # n个人 n = 3 # ...

  2. 【数据结构与算法】逆约瑟夫问题

    约瑟夫问题可以说十分经典,其没有公式解也是广为人知的~ 目录 前言 一.约瑟夫问题与逆约瑟夫问题 1.约瑟夫问题 2.逆约瑟夫问题 二.思考与尝试(显然有很多失败) 问题分析 尝试一:递归/递推的尝试 ...

  3. c语言约瑟夫环问题,C++_详解约瑟夫环问题及其相关的C语言算法实现,约瑟夫环问题 N个人围成一圈 - phpStudy...

    详解约瑟夫环问题及其相关的C语言算法实现 约瑟夫环问题 N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3开始报数,报p的人再退出圈外,以此类推 ...

  4. 记一次数据结构与算法作业:利用循环和递归输出1-N的正整数的程序分析比较

    随便记录一次数据结构与算法的分析作业,内容为分析循环和递归实现输出1-N的正整数的对比.从时间和空间上分析了两种方式实现的递归方法和循环区别. 一.数据记录图表 二.分析 第一张图表制作时由于在打游戏 ...

  5. 【算法经典】 约瑟夫环问题

    [前言]本文讨论经典算法问题约瑟夫环问题的递归解法. 一.问题描述 作为算法中的经典问题,约瑟夫环问题自诞生以来有各种各样的变种描述,丢手绢.游戏获胜者.圆圈中最后剩下的数字.点名游戏等等,但都是同样 ...

  6. 【典型习题整理】数据结构与算法作业

    数据结构与算法 图的邻接表和邻接矩阵表示法以及kruskal&prim算法求最小生成树 图的邻接表表示 概念如下:邻接表        其实我们大可以使用hashmap构建邻接表,但是为了深入 ...

  7. 约瑟夫环 单向循环链表实现

    约瑟夫环 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围 ...

  8. 约瑟夫环之循环链表实现

    约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开 始报数,数到m的那个人又出列:依此规律 ...

  9. python约瑟夫环单向循环链表_约瑟夫环的单向循环链表的实现代码

    /************************************************************************* > File Name: JosephCir ...

最新文章

  1. 单个神经元在深度网络中的作用
  2. C++ 基本数据类型
  3. 两种获取Stream流的方式
  4. 解决Jenkins打不开浏览器问题
  5. 基于CFS算法的schedule()源码分析
  6. 一个maven错误:org/apache/maven/shared/filtering/MavenFilteringException
  7. 广告和间谍程序克星Spybot使用说明
  8. tp-801bs单板微型计算机,线切割应知应会
  9. 抖音短视频解析去水印 抖音视频编辑器伪原创
  10. vmd安装包_浅谈VMD(变分模态分解)
  11. 移动机器人室内定位技术综述
  12. 【网络问题】微软商店无法打开:重试该操作,无法加载页面。请稍后重试
  13. request+cheerio+iconv-lite+phantomJs制作简单漫画网站爬虫NodeJs项目
  14. CV——基于Stitcher类实现图片拼接
  15. SSI(串行同步接口)协议如何工作
  16. 奈雪的茶布局元宇宙 传统品牌如何转战元宇宙营销
  17. P1498 南蛮图腾---洛谷(分冶)
  18. 为什么复数域中使用共轭转置而不是转置
  19. 计算机二级小蒋在教务处负责学生成绩,小蒋是一位中学教师,在教务处负责初一年级学生的成绩管理。由于学校地处偏远地区,缺乏必要的教学_考题宝...
  20. VMware9 安装提示The MSI '' failed

热门文章

  1. What’s the jiffy?
  2. rssi java_关于RSSI的问题
  3. boke例子:用户登录
  4. Android Studio使用样机报错The application could not be installed: INSTALL_PARSE_FAILED_MANIFEST_MALFOR
  5. VS2015 对Excel读写操作
  6. 怎么裁剪照片尺寸?三种方法快速裁剪
  7. 路由器重温——PON接口配置管理
  8. CSS——CSS 背景应用
  9. 有趣的Android编程(1)九宫格解锁之二
  10. Maximum Tape Utilization Ratio