使用链表描述的约瑟夫环的问题,输入n个数构成一个循环,并设置一个间隔m,从第一个结点开始,循环淘汰第m个结点,直到剩下一个结点为止。
#include <iostream>
#include "LinkedList.h"
using namespace std;
//
template<class T>
List<T>::List(List<T> &L) //复制构造函数
{
T value;
LinkNode<T> *srcptr = L.getHead();
LinkNode<T> *destptr = first = new LinkNode<T>;
while(srcptr->link != NULL)
{
value = srcptr->link->data;
destptr->link = new LinkNode<T>(value);//不断创建新的LinkNode,并用value初始化
destptr = destptr->link;
srcptr = srcptr->link;
}
destptr->link = NULL;
}
//
template<class T>
void List<T>::makeEmpty()
{
LinkNode<T> *q;
while(first->link != NULL)
{
q = first->link;
first->link = q->link;//将附加头结点后的结点摘下,只保留一个头结点
delete q;
}
}
//
template<class T>
int List<T>::Length()const
{
LinkNode<T> *p = first->link;//头结点不计算长度
int count = 0;
while(p != NULL)
{
p = p->link;
count++;
}
}
//
template<class T>
LinkNode<T> * List<T>::Search(T x)
{
LinkNode<T> *current = first->link;
while(current != NULL)
{
if(current->data == x)
break;
else
current = current->link;
}
return current;
}
//
template<class T>
LinkNode<T> * List<T>::Locate(int i)
{
if(i < 0) return false;
LinkNode<T> *current = first; int k = 0;
while(current != NULL && k < i) //注意使用不同的循环语句,循环跳出条件也不同
{
current = current->link; k++;
}
return current;
}
//
template<class T>
bool List<T>::getData(int i, T &x)const
{
if(i < 0) return NULL;
LinkNode<T> *current = Locate(i);
if(current == NULL) return false;
else
{x = current->data;return true;}
}
//
template<class T>
bool List<T>::Insert(int i, T &x)
{
LinkNode<T> *current = Locate(i);
if(current == NULL) return false;
LinkNode<T> *newNode = new LinkNode<T>(x);
newNode->link = current->link;
current->link = newNode;
return true;
}
//
template<class T>
bool List<T>::Remove(int i, T &x)
{
LinkNode<T> *current = Locate(i-1);
if(current == NULL || current->link == NULL) return false;
LinkNode<T> *del = current->link;
current->link = del->link;
x = del->data;delete del;
return true;
}
//
template<class T>
void List<T>::Output()
{
LinkNode<T> *current = first->link;
while(current != NULL)
{
cout<<current->data<<endl;
current = current->link;
}
}
//
template<class T>
List<T>& List<T>:: operator= (List<T> &L)
{
T value;
LinkNode<T> *srcptr = L.getHead();
LinkNode<T> *destptr = first = new LinkNode<T>;
while(srcptr->link != NULL)
{
value = srcptr->link->data;
destptr->link = new LinkNode<T>(value);//不断创建新的LinkNode,并用value初始化
destptr = destptr->link;
srcptr = srcptr->link;
}
destptr->link = NULL;
return *this; //返回操作对象的地址,即新建的List对象的地址
}
//
template<class T>
void List<T>::FormInput(T endTag)
{
LinkNode<T> *newNode; T val;
makeEmpty();
cin>>val;
while(val != endTag)
{
newNode = new LinkNode<T>(val);
if(newNode == NULL){cerr<<"存储非配错误!"<<endl;exit(1);}
newNode->link = first->link;
first = newNode;
cin>>val;
}
}
//
template<class T>
void List<T>::LastInput(T endTag)
{
LinkNode<T> *newNode,*last; T val;
makeEmpty();
cin>>val;last = first;
while(val != endTag)
{
newNode = new LinkNode<T>(val);
if(newNode == NULL){cerr<<"存储非配错误!"<<endl;exit(1);}
last->link = newNode;
last = newNode;
cin>>val;
}
last->link = NULL;
}