c - 链表问题 - 循环迭代错误的节点

标签 c loops data-structures linked-list josephus

如果您不熟悉约瑟夫问题:

有N个士兵围成一圈,从1开始全部被处决,按M移动,最后只有一个活着。 下面的代码询问 N 和 M 并生成最后一个站立的玩家。

#include <stdio.h>
#include <stdlib.h>
int main()
{
int N, M;
struct node { int player_id; struct node *next; }
struct node *p, *q;
int i, count;

printf("Enter N (number of players): "); scanf("%d", &N);
printf("Enter M (every M-th payer gets eliminated): "); scanf("%d", &M);

// Create circular linked list containing all the players:

p = q = malloc(sizeof(struct node));

p->player_id = 1;

for (i = 2; i <= N; ++i) {
    p->next = malloc(sizeof(struct node));
    p = p->next;
    p->player_id = i;
}  

p->next = q;// Close the circular linkedlist by having the last node point to the 1st  

// Eliminate every M-th player as long as more than one player remains:

for (count = N; count > 1; --count) {
   for (i = 0; i < M - 1; ++i)
      p = p->next;

   p->next = p->next->next;  // Remove the eiminated player from the circular linkedl
}

printf("Last player left standing is %d\n.", p->player_id);

return 0;
}

假设 N=17;M=7 输出应该是 13 上面的程序生成 2 (会发生什么?它从 M 开始计数,而不是从 1 开始计数,所以不是 1,8,15...... 它消除了 7,14......) 这就是我需要您帮助的地方(因为链表对我来说仍然是一个困难的概念)。 这个要怎么修改呢?

最佳答案

您已将节点移除线放置在错误的位置。

for (count = N; count > 1; --count) {
   for (i = 0; i < M - 1; ++i)
      p = p->next;

   p->next = p->next->next;
}

您将此行放在从头开始计数 M 个节点的循环之后,因此它始终从删除第 (M+1) 个节点开始。您应该将其移到之前,以便它从第一个节点开始。

for (count = N; count > 1; --count) {
   p->next = p->next->next;
            for (i = 0; i < M - 1; ++i) p = p->next;

}

这是您要找的吗?

关于c - 链表问题 - 循环迭代错误的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16886678/

相关文章:

python - 如何在循环中打印特定数量的输入语句?

java - 求正数列表的算术平均值

c - 一棵树在任何级别都有多个 child ,找到两个节点之间的路径

haskell - 一棵单子(monad)玫瑰树可以有一个 MonadFix 实例吗?

c++ - 程序的参数格式有没有标准?

c - 在路由器上拦截 udp 数据包

c - 如何使用以下语句运行C程序 "filename -i inputfile.txt -o outputfile.txt"

计算机猜我的号码 C 编程

javascript - jquery 循环 - 添加然后删除 css 类 - 无限循环

Python 嵌套数据持久化