# 循环双向链表 及 约瑟夫问题的解决

/******************************************
* 文件名:dnode.cpp
* 作用: 1, 实现双向循环链表
2, 用双向循环链表解决Josephus问题
* 创建日期: 2007-9-24
******************************************/

#include <iostream>
using namespace std;

template <typename T>
class dnode
{
public:
dnode()
{
init();
}
dnode(const T &v):value(v)
{
init();
}
private:
void init()
{
prev = this;
next = this;
}

public:
T value;
dnode<T> *prev;
dnode<T> *next;
};

/**********************************
* Insert()
* 入口参数: dnode<T> *curr, const T &v
* 功能: 在curr前面插入一个value = v 的结点
**********************************/
template <typename T>
void Insert(dnode<T> *curr, const T &v)
{
dnode<T> *newNode = new dnode<T>(v);

/* 先将newNode与curr->prev 连接 */
curr->prev->next = newNode;
newNode->prev = curr->prev;

/* curr 与newNode 连接 */
newNode->next = curr;
curr->prev = newNode;
}

/*******************************************
* erase()
* 入口参数:dnode<T> *curr;
* 功能: 从链表中删除curr结点
*******************************************/
template <typename T>
void erase(dnode<T> *curr)
{
/* 1,curr与curr->prev解除关系
* 2,curr->prev 与curr->next连接
* 3, delete curr
*/
curr->prev->next = curr->next;
curr->next->prev = curr->prev;

curr->prev = 0;
curr->next = 0;
delete curr;
}

/*******************************************
* clear()
* 功能: 清空链表内容
*******************************************/
template <typename T>
{
}

/******************************************
* display()
* 功能:输出链表内容
******************************************/
template <typename T>
{
dnode<T> *curr;

{
cout << "Empty!" << endl;
return ;
}

{
cout << curr->value << ' ';
curr = curr->next;
}
}

/*******************************************
* josephus()
* 入口参数:int n, int m;
* 功能:约瑟夫问题. 一个一个输出来
*******************************************/
void josephus(int n, int m)
{
dnode<int> *dList, *curr;
dList = new dnode<int>();

int i;
for( i = 1; i <= n; i++)
Insert(dList, i);

curr = dList->next;
while((dList->prev != dList) && (dList->prev != dList->next))
{
for(i = 1; i < m; i++)
{
curr = curr->next;

if(curr == dList) /* 越过头结点 */
curr = curr->next;
}

cout << " delete : " << curr->value << endl;
curr = curr->next;
erase(curr->prev);

if(curr == dList)
curr = curr->next;

}

cout << curr->value << " win! " << endl;

delete curr;
delete dList;
}

int main()
{
int n, m;

cout << "Enter the n : ";
cin >> n;

cout << "the gap m : ";
cin >> m;

josephus(n, m);

return 0;
}

Enter the n : 6
the gap m : 3
delete : 3
delete : 6
delete : 4
delete : 2
delete : 5
1 win!

• 本文已收录于以下专栏：

## 约瑟夫问题 双链表实现

/********************************* author : Grant Yuan algorithm; 双链表、 time ；2014/1...

## Delphi7高级应用开发随书源码

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

## Delphi7高级应用开发随书源码

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

## 数据结构基础之双向链表(约瑟夫问题)

• TChenjx
• 2016年02月05日 22:41
• 356

## 约瑟夫问题---list双向链表

poj 2746 http://bailian.openjudge.cn/practice/2746/总时间限制: 1000ms 内存限制: 65536kB 描述 约瑟夫问题：有ｎ只猴子，按顺时...

## 双向循环链表解决约瑟夫实验报告

• 2010年08月29日 18:05
• 124KB
• 下载

举报原因： 您举报文章：循环双向链表 及 约瑟夫问题的解决 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)