【数据结构实验】循环链表的应用:约瑟夫环问题

实验二 循环链表的应用:约瑟夫环问题

1.实验目的

熟悉单链表的定义,单链表的建立方法及相关基本操作,理解单链表的基本思想,能够根据实际情况选择合适的存储结构。

2.实验内容

已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到只剩下一个人为止。

输入:n,m (m < n)

输出:剩下最后一个人的编号

3.正文部分

①什么是循环链表

在单链表的基础上,尾结点的指针指向链表的头结点。

在初始化一个普通单链表时,将其头指针指向表头,而不是指向NULL,这样就会成为一个闭环。

【数据结构实验】循环链表的应用:约瑟夫环问题_第1张图片

②创建循环链表

与创建单链表类似,只不过最后一个结点的next指向头结点。

void createlink()
{
Node* head = NULL, * p = NULL, * r = NULL;//初始化
	head = (Node*)malloc(sizeof(Node));//申请空间给头结点
	if (head == NULL)//若head为空,申请失败
	{
		printf("申请失败。");
		return;
	}
}

③如何指定从k开始报数而不是从1?

在这我设定了一个参数flag,初始化flag的值为1,设定当flag的值为1的时候执行程序,在程序的最后将flag的值设为0,这样就不会再执行这一段了。

while (flag == 1)//flag值为1时执行
		{
			for (int i = 0; i < k; i++)
			{
				r = p;
				p = p->next;
			}
			flag = 0;//结束前赋值为0
		}

上面这一段代码的意义是,在报数之前将指针指向指定位置,循环次数为k。

④完成代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include
int n, m, k;
typedef struct Node //创建结构体
{
	int data;//数据域
	struct Node* next;//指针域
}Node;

void circleLink(int n, int m)//总共有n个人,报到数字为m出局
{
	//创建循环链表
	Node* head = NULL, * p = NULL, * r = NULL;//初始化
	head = (Node*)malloc(sizeof(Node));//申请空间给头结点
	if (head == NULL)//若head为空,申请失败
	{
		printf("申请失败。");
		return;
	}
	head->data=n;//赋值为n指定值
	head->next = NULL;
	p = head; //p指向头结点
	//尾插法创建循环链表
	for (int i = 1; i <n; i++)
	{
		r = (Node*)malloc(sizeof(Node));
		r->data = i;//用i将数据域进行填充
		r->next = NULL;
		p->next = r;
		p = r;
	}
	p->next = head;//最后的next域指向头结点
	p = head; //指针归位
	int flag = 1;
	while (p->next != p)//当不止有一个结点时
	{
		while (flag == 1)
		{
			for (int i = 0; i < k; i++)
			{
				r = p;
				p = p->next;
			}
			flag = 0;
		}
		for (int i = 1; i < m; i++)//第二次开始从1开始报数,报到为m出局
		{
			r =p;//r保存出局前的一个节点
			p = p->next;//保证当我们从for循环退出时,p指针指向的就是出局结点 
		}
		printf("%d ", p->data);
		r->next = p->next;//删除p
		p = p->next;
	}
	printf("最后一个人的编号是%d", p->next->data);//最后一个人的编号
}

int main()
{
	printf("几个人?");  scanf("%d",&n);
	printf("从第几个人开始报数?"); scanf("%d", &k);
	printf("报到数字多少出局?");  scanf("%d",&m);
	circleLink(n, m);
	return 0;
}

你可能感兴趣的:(零散的学习日常,学习,数据结构,c语言)