ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

循环链表+动态约瑟夫问题

2021-05-23 12:04:24  阅读:163  来源: 互联网

标签:linklist cur temp int next 链表 Pnode 动态 约瑟夫


首先指定一个数为第几个人死,然后报数,到这个人死的时候他可以重新指定新从他后面开始的第几个人死,循环下去

#include<iostream>
using namespace std;
#include<ctime>
//循环链表
//动态约瑟夫问题,cur中储存下一次第几个人死
//创建结构体
typedef struct Pnode
{
	int data;
	int cur;
	Pnode *next;
}*linklist;
void creatlist(linklist &L, int n)
{
	linklist head, temp;
	head = (linklist)malloc(sizeof(Pnode));//创建头指针
	head->next = L;
	int i = 1;
	if (n > 0)
	{
		L->data =i;
		L->cur = rand() % 10+1;
		L->next = NULL;//给第一个结点赋值
		temp = L;
		for ( i = 1; i < n; i++)
		{
			linklist p = (linklist)malloc(sizeof(Pnode));
			p->data =i+1;
			p->cur = rand() % 10+1;
			temp->next = p;
			p->next = NULL;
			temp = p;
		}
		temp->next = L;//尾结点指向头结点
		free(head);//释放head
	}
	else
	{
		cout << "error to input" << endl;
	}
}
void print(linklist &L,int n)
{
	linklist p=L,k=L;
	cout << "data" << endl;
	for (int i = 0; i < n; i++)
	{
		cout <<p->data << " ";
		p = p->next;
	}
	cout << endl;
	cout << "cur" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << k->cur << " ";
		k = k->next;
	}
	cout << endl;
}
//在第n个位置插入元素e
void insertlist(linklist &L, int n, int e)
{
	linklist k=L,temp;
	for (int i = 1; i < n-1; i++)
	{
		k = k->next;
	}
	linklist p = (linklist)malloc(sizeof(Pnode));
	p->data = e;
	temp = k->next;
	k->next = p;
	p->next = temp;
}
int main()
{
	srand((unsigned int)time(NULL));
	linklist L=(linklist)malloc(sizeof(Pnode));
	creatlist(L, 41);
	print(L, 41);
	int i = 1,num=0;
	cin >> num;//第一次循环让第一个人死
	while (L->next!=L)
	{
		L = L->next;
		++i;
		if (i % num == num-1)
		{
			linklist temp;
			temp = L->next;
			num = temp->cur;//把死亡结点的cur赋值给num
			L->next = temp->next;
			cout << temp->data << "->";
			free(temp);//释放该元素
			L=L->next;
			i = 1;//重置数目,因为每次释放的结点数不一样,无法统一取整
		}
	}
	cout << endl;
	system("pause");
	return 0;
}

 

标签:linklist,cur,temp,int,next,链表,Pnode,动态,约瑟夫
来源: https://blog.csdn.net/weixin_53690625/article/details/117192073

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有