拉丁方阵问题。(数组版)

这个是用数组来实现拉丁方阵。

用循环链表进行赋值。

#if 0
	拉丁方阵
	需要的函数:
	1.链表的生成以及初始化;
	2.动态申请方阵数组函数
	3.拉丁化赋值;
	4.方阵式输出;

	思路:建立一个2维数组。通过用户设定的长度来生成循环链表
	通过链表,赋值到2维数组。
	每次链表节点位置向后移一位。循环赋值到每一维数组。
	例如:
	3*3的拉丁方阵。链表中存有1,2,3.
	那么LatinArray[0][] = 1,2,3
	链表头结点后移一位,即2,3,1
	那么LatinArray[1][] = 2,3,1
	其他同理;
#endif

#include <stdio.h>
#include <stdlib.h>

#define OK 'y'

typedef struct latin
{
	int data;
	struct latin *next;
}Latin, *Latins;


#if 0
	名称:CreateList[初始化链表]
	调用:CreateList(Latins head, int num)
	作用:生成并初始化设定长度的链表;
	参数:head,头结点。num,需要设定方阵的大小
	返回值:OK 表示调用成功
#endif
Latins CreateList(Latins head, int num)
{
	Latins p, r;
	p = head;
	
	p->data = num;
	num--;

	while(num != 0)
	{
		r = (Latins)malloc(sizeof(Latin));
		if(!r)
		{
			printf("申请内存出错!");
			exit(1);
		}

		r->data = num;

		r->next = p;
		p = r;								//头插法;

		--num;
	}
	head->next = p;							//头尾相接为循环
	head = p;								//因为是用的头插法,头结点为最后插入的节点
	
	printf("\n[初始化链表成功!]\n\n");
	return head;
}


#if 0
	名称:CreateLatin[拉丁化赋值]
	调用:CreateLatin(Latins head, int num, int LatinArray[][9])
	作用:通过建立好的拉丁链表对拉丁方阵数组进行赋值。
	参数:head,头结点;LatinArray[][9],需要进行赋值的拉丁方阵数组的指针;
		 num,拉丁方阵的长

	注意:因为数组里的维度不能用变量表示,所以用了二维指针来解决。这样才可以由用户控制数组的大小。
#endif
char CreateLatin(Latins head,int num, int LatinArray[][9])
{
	Latins p;
	int i, j;
	i = j = 0;
	p = head;

	while (i < num)
	{
		while(j < num)
		{
			LatinArray[i][j] = p->data;
			
			p = p->next;					//循环移位赋值。
			j++;
		}
		j = 0;
		p = p->next;						//将头结点后移一位;
		i++;
	}

	return OK;
}


#if 0
	名称:PrintLatin[方阵输出]
	调用:PrintLatin(int LatinArray[][9], int num)
	作用:将拉丁方阵输出
	参数:LatinArray[][9],需要输出的二维数组的二维指针;num,拉丁方阵长度;
#endif
char PrintLatin(int LatinArray[][9], int num)
{
	int i, j;
	i = j = 0;
												//样品:
	while (i < num)								//1 2 3
	{											//2 3 1
		printf("\t\t");							//3 2 1
		while (j < num)
		{
			printf(" %d ", LatinArray[i][j]);
			j++;
		}
		j = 0;
		i++;
		printf("\n");
	}

	return OK;
}


int main()
{
	Latins head;
	int Lary[9][9], num;						//想到c不能动态申请数组,所以做了最大限制的数组申请;
	char choose;								//后悔药。。可以选择是否重新输入方阵的长度

	head = (Latins)malloc(sizeof(Latin));
	if(!head)
	{
		printf("申请内存出错!");
		exit(1);
	}

	do{

	printf("请输入要设定的方阵的长度,2~9:");

	do{
		if( scanf_s("%d", &num, 1) == 1)
		{
			if( num < 2 || num > 9 )
			{
				printf("\n输入错误请重新输入:");
			}
			else
			{
				break;
			}
		}
		else
		{
			printf("\n输入错误请重新输入:");
		}

	}while(1);

	printf("\n您设定的方阵为 %d*%d\n", num, num);
	getchar();

	printf("\n按回车键确定/重新请按0 : ");
	choose = getchar();

	}while(choose == '0');


	head = CreateList(head, num);

	if(CreateLatin(head, num, Lary) == OK)
	{
		printf("\n[拉丁方阵赋值成功!]\n\n");
	}
	else
	{
		printf("\n[拉丁方阵赋值失败!]\n");
	}

	printf("建立的拉丁方阵为:\n");
	PrintLatin(Lary, num);

}

 

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