【发布时间】:2021-12-02 03:41:36
【问题描述】:
我打算在 C 中使用链表解决约瑟夫斯问题,但它不起作用。我尝试了多种方法,所以我很困惑。
#include "stdlib.h"
#include "stdio.h"
struct Node {
int num;
struct Node *Next;
};
typedef struct Node *PtrToNode;
int main() {
int n, m, i;
PtrToNode p, q;
printf("Please input n, m\n");
scanf("%d %d", &n, &m);
p = (PtrToNode)malloc(sizeof(struct Node));
p->num = 1;
p->Next = p;
for (i = 2; i <= n; i++) {
q = (PtrToNode)malloc(sizeof(struct Node));
q->num = i;
q->Next = p;
p->Next = q;
p = q;
}
while (q->Next != q) {
for (i = 1; i <= m; i++)
p = q->Next;
q = p;
printf("%d, ", q->num);
p->Next = NULL;
free(q);
}
printf("%d\n", p->num);
free(p);
//system("pause");
return 0;
}
我有点了解 struct 函数和 typedef,所以我想我在那里没有任何问题(?)。我猜我在 main 函数中犯了一个错误。
【问题讨论】:
-
p->Next = p;可能不正确。同样为某事分配两次将使第一次分配毫无意义。我建议你退后几步,拿一支铅笔和一些纸,在纸上画出你的列表操作,用方框表示节点(和其他变量),用箭头表示指针。写下操作列表,同时在这些操作之后擦除和重绘箭头。一旦这一切似乎都在纸上起作用,就在代码中实现它,但一次只做一点点,中间要进行大量测试。 -
我建议去掉 typedef。它不提供任何清晰度,仅用于混淆。此外,尽量消除对列表第一个元素的特殊处理。将列表的头部初始化为 NULL,并在与其他节点相同的循环中为其赋值。
标签: c linked-list josephus