用循环单链表(两个模板类:结点类,循环链表类)解决拉丁方阵问题。

拉丁方阵就是这样的

比如4阶拉丁方阵

1 2 3 4

2 3 4 1

3 4 1 2

4 1 2 3

 

每行每列没重复的数字,这里借助循环单链表来实现,思路:第一遍历(第一行的数据)从第一个结点(注意不是头结点)开始,第二次遍历(第二行的数据)从第二个结点开始,一次类推。。。。。。

代码如下:(比较容易看懂,没分.H文件很.CPP文件)

 

//CirListNode类 #include<stdio.h> template <class T> class CirListNode { T data; CirListNode<T>* link; public: CirListNode():link(NULL){} CirListNode(T value):link(NULL),data(value){} ~CirListNode(){} void SetLink(CirListNode<T>* next); CirListNode<T>* GetLink(); T& GetData(); void SetData(T value); }; template<class T> void CirListNode<T>::SetData(T value) { data=value; } template<class T> void CirListNode<T>::SetLink(CirListNode<T>* next) { link=next; } template<class T> CirListNode<T>* CirListNode<T>::GetLink() { return link; } template<class T> T& CirListNode<T>::GetData() { return data; } //CirList类 template<class T> class CirList { CirListNode<T>* head; CirListNode<T>* tail; CirListNode<T>* cur; public: CirList(); ~CirList(){}; bool AddTail(T value); void RemoveThis(); void RemoveAll(); void SetBegin(); int GetCount(); CirListNode<T>* GetCur(); bool IsEmpty(); T GetNext(); CirListNode<T>* GetNextNode(); void SetData(T value); }; //CirList成员函数实现 template<class T> void CirList<T>::SetData(T value) { cur->SetData(value); } template<class T> CirListNode<T>* CirList<T>::GetNextNode() { cur=cur->GetLink(); return cur; } template<class T> CirList<T>::CirList() { head=tail=new CirListNode<T>; cur=NULL; head->SetLink(head); } template <class T> bool CirList<T>::AddTail(T value) { CirListNode<T>* add=new CirListNode<T>(value); tail->SetLink(add); tail=tail->GetLink(); tail->SetLink(head->GetLink()); if(tail!=NULL) { return true; } else return false; } template<class T> void CirList<T>::RemoveThis() { if(cur==head) { cur=cur->GetLink(); } CirListNode<T>* preCur=cur; for(int i=0;i<this->GetCount();i++) { preCur=preCur->GetLink(); } preCur->SetLink(cur->GetLink()); cur=preCur->GetLink(); preCur=NULL; } template<class T> void CirList<T>::RemoveAll() { SetBegin(); int length=GetCount(); for(int i=0;i<length;i++) { RemoveThis(); } cur=head; } template<class T> void CirList<T>::SetBegin() { cur=head; } template<class T> int CirList<T>::GetCount() { int num=0; CirListNode<T>* here=cur; while(cur->GetLink()!=here) { cur=cur->GetLink(); ++num; } cur=cur->GetLink(); return num; } template<class T> CirListNode<T>* CirList<T>::GetCur() { return cur; } template<class T> bool CirList<T>::IsEmpty() { return head->GetLink()==head; } template<class T> T CirList<T>::GetNext() { if(cur==head) { cur=cur->GetLink(); } T num =cur->GetData(); cur=cur->GetLink(); return num; } #include<iostream> using namespace std; int main() { int num; cout<<“请输入拉丁方阶数(2<=N<=9)”; cin>>num; CirList<int> latin; for(int i=1;i<=num;i++) { latin.AddTail(i); } latin.SetBegin(); latin.GetNextNode(); for(int j=0;j<num;j++) { for(int k=0;k<num;k++) { cout<<latin.GetCur()->GetData()<<” “; latin.GetNextNode(); } cout<<endl; latin.GetNextNode(); //latin.GetNextNode(); } return 0; }

    原文作者:拉丁方阵问题
    原文地址: https://blog.csdn.net/yiruirui0507/article/details/5942835
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞