维基百科: 约瑟夫环问题
实验一 循环链表的应用
一、实验目的与基本要求
掌握数据结构中的循环链表的一些基本概念。
二.实验内容
- 认真阅读和掌握和本实验相关的教材内容及所给的程序代码。
- 通过循环链表实现约瑟夫环
- 要求:1)要求设计一个程序模拟次过程,输入总的人数n,所报的出列的数字k,计数开始的位置p;
- 程序所能达到的功能:构造链表;输入数据;执行报数;储存出列人的序号,删除出列人的信息以及把指向出列人的指针移到出列人的下一个人,然后重新开始执行报数;直到最后一个人报数完毕,程序结束。
- 测试数据:n=9,9个人的序号分别为:1,2,3,4,5,6,7,8,9。然后p=1,从第一个开始报数。k=5,则确定输出的序列为:5,1,7,4,3,6,9,2,8。
例: 41个人从1开始报数,报到3的出列,则最后剩下的是31号

代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef struct Node
{
int num;
struct Node *next;
} LinkList;
LinkList *creat(int n)
{
LinkList *p, *q, *head;
p = (LinkList *)malloc(sizeof(LinkList));
p->num = 1;
head = p;
for (int i = 2; i <= n; i++)
{
q = (LinkList *)malloc(sizeof(LinkList)); //Malloc()向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
q->num = i;
p->next = q;
p = q;
}
p->next = head; //使链表尾指向链表头 形成循环链表
return head;
}
void fun(LinkList *L, int pos, int cnt)
{
LinkList *p, *s, *q;
p = L;
printf("出列顺序为:");
while (p->next != p)
{
for (int i = 1; i < cnt; i++) /*从1开始*/
{
q = p;
p = p->next;
}
printf("%5d", p->num);
s = p;
q->next = p->next;
p = p->next; //使p指向新的起点
free(s);//free()与malloc()函数配对使用,释放malloc函数申请的动态内存
}
printf("%5d\n", p->num);
}
int main()
{
LinkList *L;
int n;
cin>>n;
int pos;
cin>>pos;//从pos开始报数
int cnt;//报到cnt的出列
cin>>cnt;
L = creat(n);
fun(L, pos,cnt);
return 0;
}
更加简单点的写法:
#include<iostream>
#include<stdio.h>
using namespace std;
struct node
{
int num;
node *next;
};
node *creat(int n)
{
node *p, *q, *head;
p = new node;
p->num = 1;
head = p;
for(int i = 2; i <= n; i++) {
q = new node;
q->num = i;
p->next = q;
p = q;
}
p->next = head;
return head;
}
void fun(node *L, int pos, int cnt)
{
node *p, *s, *q;
p = L;
cout<<"出列顺序为:";
while(p->next != p) {
for(int i = 1; i < cnt; i++) {
q = p;
p = p->next;
}
printf("%5d", p->num);
s = p;
q->next = p->next;
p = p->next;
}
printf("%5d\n", p->num);
}
int main()
{
node *L;
int n;
cin>>n;
int pos;
cin>>pos;
int cnt;
cin>>cnt;
L = creat(n);
fun(L, pos, cnt);
return 0;
}
这篇博客介绍了如何使用循环链表解决约瑟夫环问题,实验旨在掌握循环链表的基本概念。程序模拟报数过程,输入人数n、报数k和起始位置p,最终输出出列人的序号。示例给出了当n=9,p=1,k=5时的序列结果。代码展示了一种简洁的实现方式。
1万+

被折叠的 条评论
为什么被折叠?



