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

原创 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...

1. 双向约瑟夫问题

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

用双循环链表解决约瑟夫问题

约瑟夫问题:犹太历史学家约瑟夫他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀。41个人站成一个圆圈,从第一个人开始数数,每次数到3,则该人自杀;然后...

使用循环双链表求解约瑟夫环问题

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出...

SzNOI 双向约瑟夫(双向链表)

题意: 题解: #include #include const int N = 10000; struct List { int...

双向链表实现约瑟夫环 2016/6/12

今天实现了一个简单的双向链表,用来完成约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

用单链表解决约瑟夫问题 C语言实现

编号为1,2,3,…,n的n个人按顺序针方向围坐一张圆桌旁,每个人手中持有一个密码(正整数)。首先输入一个正整数作为报数上限值m,然后,从第一个人开始按顺序针方向自1开始顺序报数,报到m的人离开桌子,...

VC6.0配置Proc开发环境:

使用VC6进行Proc开发配置如下(编译器自然是VC6的CL编译工具): 第一步:配置proc编译器路径   在执行文件路径中添加proc路径,本例中proc为:D:\Oracle10....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用双向链表实现约瑟夫问题
举报原因:
原因补充:

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