Q:略
A:
为了简化过程,类中只有3个函数即可,构造,增加,约瑟夫环解决函数
Ps:做这道题是为了巩固链表知识,在这过程中,this指针很隐蔽,,
Code;
#include<iostream>
using namespace std;
template<class T>
struct LinkNode
{
T data;
LinkNode<T>*link;
LinkNode(LinkNode<T>*ptr=NULL) { link=ptr;}
LinkNode(T item,LinkNode<T>*ptr=NULL) { data=item;link=ptr;}
};
template<class T>
class CList
{
private:
LinkNode<T>*first;
public:
CList() { first=NULL;}
// ~CList() { makeEmpty();}
// void makeEmpty();
bool Insert(int i,T x);
void Print();
bool Delete(int i,T& x);
void Josephs(CList<T> A,int n,int m);
};
template<class T>
bool CList<T>::Insert(int i,T x)
{
if(first==NULL)
{
first=new LinkNode<T>(x);
first->link=first;
return true;
}
else
{
int j=1;
LinkNode<T>*current=first;
while(j<i)
{
current=current->link;
++j;
}
LinkNode<T>*newNode=new LinkNode<T>(x);
newNode->link=current->link;
current->link=newNode;
return true;
}
}
template<class T>
void CList<T>::Print()
{
LinkNode<T>*current=first->link;
cout<<first->data<<” “;
while(current!=first)
{
cout<<current->data<<” “;
current=current->link;
}
}
template<class T>
bool CList<T>::Delete(int i,T& x)
{
LinkNode<T>*current=first;
if(i==1)
{
while(current->link!=first)
{
current=current->link;
}
first=first->link;
current->link=first;
}
else
{
int j=1;
LinkNode<T>*p=first;
while(j<i)
{
p=current;
current=current->link;
++j;
}
p->link=current->link;
delete current;
}
}
template<class T>
void CList<T>::Josephs(CList<T> B,int n,int m)
{
for(int i=0;i<n;++i)
B.Insert(i,i+1);
int j,x,n1;
LinkNode<T>*current=B.first;
LinkNode<T>*p=NULL;
for(j=1;j<n;++j)
{
for(n1=1;n1<m;++n1)
{
p=current;
current=current->link;
}
cout<<“出列的人是”<<current->data<<” “;
p->link=current->link;
delete current;
current=p->link;
}
}
int main()
{
CList<int> A;
CList<int> B;
A.Josephs(B,10,3);
system(“pause”);
return 0;
}
2.数组实现
思路:每次把出列的数移到数组最后一项,这样方便得出下一次报数时下标的规律
Code:
#include<iostream>
using namespace std;
#define MAX 10
int main()
{
int a[MAX];
int n,m,s;
cin>>n>>m;
for(int i=0;i<n;++i)
cin>>a[i];
void Josephs(int a[],int n,int m);
Josephs(a,n,m);
system(“pause”);
return 0;
}
void Josephs(int a[],int n,int m)
{
int s=0;
int k=n,temp,b=n;
for(int j=1;j<n;++j) //删除n-1次
{
s=(m-1+s)%b;
cout<<“出列的是”<<a[s]<<” “;
//改变数组
temp=a[s];
for(int m=s;m<k-1;++m)
{
a[m]=a[m+1];
}
a[k-1]=temp;
b–;
}
}