由于用数组有限制,所以用calloc来动态申请内存。
#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
名称:CreateArray[初始化数组]
调用:CreateArray(int num)
作用:生成方阵所需要的内存;
参数:num,需要设定方阵长
返回值:返回数组指针;
#endif
int *CreateArray(int num)
{
int *Lary;
Lary = (int *)calloc(num*num, sizeof(int));
return Lary;
}
#if 0
名称:CreateLatin[拉丁化赋值]
调用:CreateLatin(Latins head, int num, int *LatinArray)
作用:通过建立好的拉丁链表对拉丁方阵数组进行赋值。
参数:head,头结点;*LatinArray,需要进行赋值的拉丁方阵数组的指针;
num,拉丁方阵的长
注意:因为数组里的维度不能用变量表示,所以用了二维指针来解决。这样才可以由用户控制数组的大小。
#endif
char CreateLatin(Latins head,int num, int *LatinArray)
{
Latins p;
int i, j;
i = j = 0;
p = head;
while (i < num)
{
while(j < num)
{
LatinArray[j+i*num] = p->data;
p = p->next; //循环移位赋值。
j++;
}
j = 0;
p = p->next; //将头结点后移一位;
i++;
}
return OK;
}
#if 0
名称:PrintLatin[方阵输出]
调用:PrintLatin(int *LatinArray, int num)
作用:将拉丁方阵输出
参数:*LatinArray,需要输出的二维数组的二维指针;num,拉丁方阵长度;
#endif
char PrintLatin(int *LatinArray, 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[j+i*num]);
j++;
}
j = 0;
i++;
printf("\n");
}
return OK;
}
int main()
{
Latins head;
int *Lary, num;
char choose; //后悔药。。可以选择是否重新输入方阵的长度
head = (Latins)malloc(sizeof(Latin));
if(!head)
{
printf("申请内存出错!");
exit(1);
}
do{
printf("请输入要设定的方阵的长度:");
do{
if(scanf_s("%d", &num, 1) != 1)
{
printf("输入错误请重新输入");
}
else
{
break;
}
}while(1);
printf("\n您设定的方阵为 %d*%d\n", num, num);
getchar();
printf("\n按回车键确定/重新请按0 : ");
choose = getchar();
}while(choose == '0');
//生成方阵所需要的空间
Lary = CreateArray(num);
head = CreateList(head, num);
if(CreateLatin(head, num, Lary) == OK)
{
printf("\n[拉丁方阵赋值成功!]\n\n");
}
else
{
printf("\n[拉丁方阵赋值失败!]\n");
}
printf("建立的拉丁方阵为:\n");
PrintLatin(Lary, num);
}