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

约瑟夫环问题的具体描述是:设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。
代码如下:

define _CRT_SECURE_NO_WARNINGS

include <stdio.h>

include <stdlib.h>

define N 6

typedef struct Node {
int data;
struct Node *next;
}ElemSN;
ElemSN *CreateLink(int *a) {
ElemSN *h = NULL, *t = NULL, *p;
//创建单向循环链表
for (int i = 0; i < N; i++) {
p = (ElemSN *)malloc(sizeof(ElemSN));
p->data = a[i];
if (!h) {
p->next = p;
h = t = p;
}
else {
p->next = h;
t = t->next = p;
}
}
//返回头结点,本质上返回尾结点在删除等情况下更方便操作
return h;
}
void *DelKeyNode(ElemSN *h, int M) {
ElemSN *p, *q = NULL;
int m = 1;
p = h;
do {
//判断如果够几个就将此时这个出局
if (m == M) {
q->next = p->next;
printf(“要出局的为;%d\n”, p->data);
free§;
p = q->next;
m = 1;
}
//如果不够个数就继续指针联动跑
else {
q = p;
p = p->next;
m++;
}
} while (p->next!=p);
printf(“最后一个出局的:%d\n”, p->data);
printf(“已经全部转完”);
}
void PrintLink(ElemSN *h) {
ElemSN *p;
p = h;
//与单向链表不同的是在输出链表时需要先处理一次
do{
printf("%5d", p->data);
p = p->next;
} while (p != h);
}
int main() {
int a[N] = { 1, 2, 3, 4, 5, 6 };
ElemSN *head;
int M;
head = CreateLink(a);
//调用输出函数先将创建好的链表输出一遍
PrintLink(head);
printf("\n");
printf(“请输入每几次删:”);
scanf("%d", &M);
DelKeyNode(head, M);
printf("\n");
system(“pause”);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值