利用双向链表实现约瑟夫问题

原创 2012年03月25日 14:25:49

输入n个数,围城一圈,输入数字m,从第一个数开始数,数到第m个数删除这个数,然后继续数,数到下一个第m个数时,删除该数,直到剩下最后一个数。输出最后一个数。

利用双向循环链表实现:

LinkNode.h

#include<iostream>
using namespace std;
template<typename Type>class LinkNode
{
public:
	Type m_data;
	LinkNode<Type>*m_next;
	LinkNode<Type>*m_pre;
public:
	LinkNode(Type item):m_data(item)
	{
		m_next=this;
		m_pre=this;
	}
	Type GetData()
	{
		return this->m_data;
	}
};


DoubleLink.h

#include<iostream>
#include"LinkNode.h"
using namespace std;
#define Defaultsize 100;
template<typename Type>class DoubleLink
{
private:
	LinkNode<Type>*head;
	int m_cursize;
	int m_maxsize;
public:
	DoubleLink(Type item)
	{
		m_maxsize=Defaultsize;
		m_cursize=1;
		head=new LinkNode<Type>(item);
	}
	~DoubleLink()
	{
		while(head->m_next!=NULL&&head->m_next!=head)
		{
			LinkNode<Type>*temp;
			temp=head->m_next;
			head->m_next=temp->m_next;
			delete temp;
		}
		delete head;
	}
	int GetSize()
	{
		return this->m_cursize;
	}
	bool Insert(Type item);
	bool Delete(Type item);
	int GetData(LinkNode<Type> *Node)
	{
		return Node->m_data;
	}
	Type Jsf(int m);
	void Print()
	{
		if(this->m_cursize==0)
		{
			cout<<"the link is empty!"<<endl;
			return ;
		}
		LinkNode<Type>*temp=this->head->m_next;
		cout<<"head ("<<head->m_data<<")-->";
		while(temp!=head)
		{
			cout<<temp->m_data<<"-->";
			temp=temp->m_next;
		}
		cout<<"head"<<endl;
	}
};
template<typename Type>bool DoubleLink<typename Type>::Insert(Type item)
{
	if(this->m_cursize==this->m_maxsize)
	{
		cout<<"the Doublelink is full!"<<endl;
		return 0;
	}
	LinkNode<Type>*temp=new LinkNode<Type>(item);
	LinkNode<Type>*p=this->head;
	while(p->m_next!=head)
	{
		p=p->m_next;
	}
	temp->m_next=p->m_next;
	p->m_next->m_pre=temp;
	p->m_next=temp;
	temp->m_pre=p;
	this->m_cursize++;
	return 1;
}
template<typename Type>bool DoubleLink<typename Type>::Delete(Type item)
{
	if(this->m_cursize==0)
	{
		cout<<"the DoubleLink is empty!"<<endl;
		return 0;
	}
	while(this->head->m_data==item)
	{
		if(this->m_cursize==1)
		{
			cout<<"the node of item is head,can't be deleted!"<<endl;
			return 0;
		}
		else
		{
			this->m_cursize--;
			LinkNode<Type>*q=this->head->m_next;
			this->head->m_pre->m_next=q;
			q->m_pre=head->m_pre;
			delete head;
			head=q;
		}
	}
	LinkNode<Type>*temp=this->head,*p=this->head;
	while(temp->m_next!=head)
	{
		p=temp;
		temp=temp->m_next;
		if(temp->m_data==item)
		{
			this->m_cursize--;
			p->m_next=temp->m_next;
			temp->m_next->m_pre=p;
			delete temp;
		}
	}
	return 1;
}
template<typename Type>Type DoubleLink<typename Type>::Jsf(int m)
{
	LinkNode<Type>*temp=this->head;
	int j=1;
	while(this->m_cursize>1)
	{
		if(j==m)
		{
			LinkNode<Type>*p=temp->m_next;
			if(temp==head)
			{
				head=p;
			}
			temp->m_pre->m_next=temp->m_next;
			temp->m_next->m_pre=temp->m_pre;
			delete temp;
			temp=p;
			j=1;
			this->m_cursize--;
		}
		else
		{
			temp=temp->m_next;
			j++;
		}	
	}
	return head->m_data;
}


test.cpp

#include<iostream>
#include"DoubleLink.h"
using namespace std;
int main()
{	
	int n,m;
	while(cin>>n>>m)
	{
		DoubleLink<int> Link(1);
		for(int i=2;i<=n;i++)
		{
			Link.Insert(i);
		}
		Link.Print();
		cout<<"the winner is :"<<Link.Jsf(m)<<endl;
	}
	return 0;
}


 

数据结构——双向约瑟夫问题

这道题目理解题意后,其实不难 #include "stdio.h" #include "stdlib.h" typedef struct NODE{ int data; struct...
  • begin_hunter
  • begin_hunter
  • 2012年10月30日 12:50
  • 682

双向约瑟夫问题

约瑟夫问题是一个经典的问题,我们不妨将这个经典问题进行扩展,变成一个双向的约瑟夫问题。   已知 n 个人(不妨分别以编号 1,2,3,...,n 代表 )围坐在一张圆桌周围,首先从编号为 k 的人...
  • yugemengjing
  • yugemengjing
  • 2017年04月02日 22:13
  • 419

1. 双向约瑟夫问题

1. 双向约瑟夫问题 成绩 10 开启时间 2014年10月21日 Tuesday 12:00 折扣 0.8 折扣时间 2014...
  • liuyi005
  • liuyi005
  • 2014年12月10日 22:58
  • 753

c++ 数据结构 用循环单链表解决约瑟夫问题

循环链表为单链表的变形,与单链表的区别在于循环链表的尾结点的指针域不是空,存放的是首结点的地址,因此判断表空的条件不是first->Link==NULL;而是first->Link==first; 约...
  • sinat_34927324
  • sinat_34927324
  • 2016年11月08日 23:10
  • 974

golang LRU实现(使用双向链表实现)

LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 lru.go type ...
  • ppppppppp2009
  • ppppppppp2009
  • 2017年03月27日 17:27
  • 416

双向约瑟夫问题

约瑟夫问题是一个经典的问题,我们不妨将这个经典问题进行扩展,变成一个双向的约瑟夫问题。   已知 n 个人(不妨分别以编号 1,2,3,...,n 代表 )围坐在一张圆桌周围,首先从编号为 k 的人...
  • yugemengjing
  • yugemengjing
  • 2017年04月02日 22:13
  • 419

【数据结构基础】双向约瑟夫问题

双向约瑟夫问题(15) 成绩 15 开启时间 2017年09月27日 星期三 00:05 折扣 0.8 折扣时间 2017年10...
  • TKS_Tenkey
  • TKS_Tenkey
  • 2017年10月20日 23:08
  • 100

循环单链表实现约瑟夫环问题

问题: 编号为1,2,3,,,n的n个人按顺时针围坐一起,每人有一个正整数密码。一开始任选一个整数作为报数上限值m,从第一个人开始按顺时针向自1开始顺序报数,报到m的停止,出列,并把出列的人手中的密码...
  • SAYA_
  • SAYA_
  • 2015年10月19日 13:40
  • 1631

约瑟夫问题(单向循环链表应用实例)

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,4...
  • mengzhisuoliu
  • mengzhisuoliu
  • 2015年05月07日 15:28
  • 1050

数据结构中双向约瑟夫问题

  • 2011年04月28日 17:46
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用双向链表实现约瑟夫问题
举报原因:
原因补充:

(最多只允许输入30个字)