|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 qq1242009750 于 2018-7-18 00:40 编辑
算法思想在文章的尾部
- #ifndef xxx
- #define xxx
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
- struct Node
- {
- int data;
- Node *Next;
- };
- template <typename T1>
- class CLatin
- {
- public:
- void CreateLoopList(T1* &rear, const int num); //创建一个N*N的循环链表
- void Latin(T1* &rear, const int num);
- void Print(T1* &rear, const int num);
- };
- template <typename T1>
- void CLatin<T1>::CreateLoopList(T1* &rear, int num)
- {
- T1 *S = new T1;
- rear = S;
- rear->Next = rear;
- T1 *H = rear->Next;
- for (int i = 1; i < num * num; i++)
- {
- rear->Next = new T1;
- rear = rear->Next;
- rear->Next = H;
- }
- }
- template <typename T1>
- void CLatin<T1>::Latin(T1* &rear, const int num) //拉丁方阵
- {
- T1 *tmp = rear->Next;
- for (int i = 1; i <= num; i++) //要赋值的行数
- {
- for (int j = i; j <= num; j++) //列的赋值,从行数开始
- {
- tmp->data = j;
- tmp = tmp->Next;
- }
- if (i != 1) //如果行数不为1,则说明 1 到 i-1 的数没有写入方阵
- {
- for (int m = 1; m < i; m++)
- {
- tmp->data = m;
- tmp = tmp->Next;
- }
- }
- }
- }
- template <typename T1>
- void CLatin<T1>::Print(T1* &rear, const int num)
- {
- T1 *tmp = rear->Next;
- T1 *H = tmp;
- int i = 0;
- while (tmp->Next != H)
- {
- cout << tmp->data << " ";
- tmp = tmp->Next;
- i++;
- if (i == num)
- {
- cout << endl;
- i = 0;
- }
- }
- cout << tmp->data << endl;
- }
- #endif xxx
复制代码
算法思想:
1.输入一个大于等于2 小于等于9的数。
2.生成一个 N*N个节点的循环链表。
3.把循环链表抽象成一个N行N列的二维数组。
4.用1到N的数值对节点进行赋值。
5.每行的第一个节点用所在的行数赋值。 例如 ,第一行的第一个节点的值为1,第二行的第一个节点为2。
6.当行数不为1时,是不会1 到 N完整的赋值,所以当结束了列的赋值后要检测行数,把1 到 行数-1 的数值放入当前行的列中。
新手上路,自己写的,写得不好之处请大家指出 |
|