线性表的应用

这篇博客介绍了一个C++程序,用于解决约瑟夫环问题,采用单向循环链表存储结构。程序首先创建链表并读取每个人员的密码,然后按照设定的报数上限值模拟出列过程。出列顺序被打印出来,展示了链表操作的技巧。程序还提供了一个选作部分,要求添加顺序结构的实现。博客作者强调了在处理链表时需要注意的细节,并指出代码参考了多个来源,仅供学术交流。
摘要由CSDN通过智能技术生成

实习一 线性表应用
本次实习的主要目的在于熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉
链表的各种操作为侧重点。通过本次实习还可帮助读者复习高级语言的使用方法。
约瑟夫环
[问题描述]
约瑟夫(Joeph)问题的一种描述是:编号为 1,2,…,n 的 n 个人按顺时针方向围坐一圈,
每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值 m,从第一个人开始
按顺时针方向自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新
的 m 值,从他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有人全部
出列为止。试设计一个程序求出出列顺序。
[基本要求]
利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
[测试数据]
m 的初值为 20;密码:3,1,7,2,4,8,4(正确的结果应为 6,1,4,7,2,3,5)。
[实现提示]
程序运行后首先要求用户指定初始报数上限值,然后读取各人的密码。设 n≤30。
[选作内容]
向上述程序中添加在顺序结构上实现的部分。

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
typedef struct List_Node
{
	int number;
	int message;
	struct List_Node *next;
}*temp_p;
class Joeph
{
public:
	Joeph() {}
	void Joeph_start();
	void Joeph_create(temp_p &,int);
	int Joeph_judge(temp_p &,int);
	~Joeph() {}
private:
	List_Node List_Joeph;
};
void Joeph::Joeph_start()
{
	temp_p L;
	int message, n;
	Joeph_create(L, 0);
	cout << "请输入总人数:" << endl;
	cin >> n;
	cout << "请输入初始密码:"<<endl;
	cin >> message;
	Joeph_create(L, n);
	while (n--)
	{
		message = Joeph_judge(L, message);
	}
}
void Joeph::Joeph_create(temp_p &L,int i)
{
	temp_p p, s;
	L = (temp_p)malloc(sizeof(List_Node));
	L->next = NULL;
	p = L;
	for (int j = 0; j < i; j++)
	{
		s = (temp_p)malloc(sizeof(List_Node));
		s->number = j + 1;
		cout << "请输入第" << j + 1 << "个的密码:  " << endl;
		cin>>s->message;
		p->next = s;
		p = s;
	}
	p->next = L->next;
}
int Joeph::Joeph_judge(temp_p &L, int i)
{
	temp_p temp;
	int need_return;
	for (int j = 0; L && j < i - 1; j++)
	{
		L = L->next;
	}
	temp = L->next;
	L->next = temp->next;
	cout << "出列人的序号为" << temp->number << endl;
	need_return = temp->message;
	free(temp);
	return need_return;
}
int main()
{
	Joeph work;
	work.Joeph_start();
	return 0;
}

这次的注释并不在代码里完成,用类封装完成约瑟夫环,是学校的作业。
因为输出需要完成对位置的记录,所以我们索性将数字的位置记录记在结构体,同时定义一个结构体指针(纯粹是方便)。
在判断入队时,可以不用写一个复杂的,需要判断是否为头节点的函数,分开建立即可。
在判断出列时,需要提前判断一位该谁报数了,这样才能完成跳过该节点的处理,不然需要回溯,这个是单向链表肯定是不行的。
本程序有借鉴多篇不同平台的博客,发布仅为学术交流,侵删。
return code;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值