第二次作业:

习题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. 环境搭建 - 奥比中光3D摄像头(Astra Mini)
  2. 马云牛啊 从骑自行车到坐迈巴赫只用20年
  3. void func(int n)C语言,C语言高手帮忙分析一下复杂的函数声明
  4. 变速积分pid控制器matlab,变速积分PID控制系统设计.docx
  5. 如何手动连上mysql_如何手动安装MySql
  6. lottie android min sdk,跳一个Lottie无法回调开始播放动画事件的坑
  7. 莫烦Matplotlib可视化第三章画图种类代码学习
  8. qq群 voiceover_如何在iOS上使用VoiceOver为所有人构建应用程序
  9. [3] ADB 设备连接管理
  10. 知乎高赞!python能做这么多自动化,可开发效率真的有Java高?
  11. PYTORCH 定义模型
  12. hosts文件可以干嘛?
  13. python编码器用什么意思_通常提到的编码器是干什么用的
  14. 微信模拟位置想在哪就在哪(GPS欺骗)
  15. W10虚拟机一开机电脑蓝屏重启
  16. 1698无法登录mysql服务器_解决MySql ERROR 1698 (28000) 错误:Access denied for user 'root'@'localhost'...
  17. 独孤思维:赚钱的黄金法则
  18. Linux下干净卸载mysql详解
  19. 微信小程序:全新趣味测试
  20. @ConfigrationProperties + @EnableConfigrationProperties

热门文章

  1. 了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别,了解“USB/TTL转232“模块(以CH340芯片模块为例)的工作原理。
  2. 羊皮卷之六:今天我学会控制情绪
  3. SECURECRT中文乱码解决已设置UTF-8
  4. 2021年全球双稳态显示驱动IC行业调研及趋势分析报告
  5. [RS] 评价指标NDCG
  6. runnerw.exe: CreateProcess failed with error 5:
  7. 阿里巴巴笔试题:匹配模式(简单的以字符来写), 比如 aabb, 来判断该字符串是否符合该模式
  8. RSA连分数攻击实现
  9. 蓝牙耳机什么牌子好?盘点2022年性价比最高的蓝牙耳机品牌
  10. 2.基本电气控制电路