约瑟夫问题
问题:用循环链表模拟约瑟夫问题,把41个人自杀顺序编号输出。
代码:
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode* next;
}LinkNode;
// 尾插法建立不带头结点循环单链表{1,2,3,4,5,6,7}
LinkNode* Create(int n) {
LinkNode* Q = NULL, * s;
int i;
Q = (LinkNode*)malloc(sizeof(LinkNode));
Q->data = 1;//给首节点赋初值
Q->next = Q;//将指针指向自己
for (i = 2; i <= n; i++) {// 从第二个节点开始创建节点并赋值
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = i;
s->next = Q->next;
Q->next = s;
Q = s;// 指针指向最后一个节点
}
return Q;// 将指针返回,以便后续调用
}
void Joeph(LinkNode* Q, int m) {
LinkNode* pre = Q;
LinkNode* p = Q->next;//将指针指向首节点
int count = 1;// 计数器
printf("出环的顺序是:\n");
while (p->next != p) {//链表中有两个元素,则进入循环
if (count < m) {//开始遍历
pre = pre->next;
p = p->next;
count++;
}
else {
printf("%d ", p->data);
pre->next = p->next;//删除节点p
free(p);
p = pre->next;//让指针p一直处于pre的next位
count = 1;// 每次循环结束,计数归1,以便下一次循环
}
}
printf("%d ", p->data);//打印出最后一个节点
free(p);//释放最后一个节点
}
int main() {
int n = 41,
m = 0;
LinkNode* Q = NULL;
printf("请输入m的值:");
scanf("%d", &m);
Q = Create(n);
Joeph(Q, m);
return 0;
}