}
if (flag==0) // flag==1 则两占位矩阵列集合不相等,否则相等
{
for (i=0; i<N; i++) //两占位矩阵的列集合相等,相应的两拉丁方阵可以通过置换相互得到,故删除tail指向的拉丁方阵,占位矩阵和节点
{
free(tail->Pa[i]);
free(tail->Pb[i]);
}
free(tail->Pa);
free(tail->Pb);
pm->next=tail->next; //让pm的指针域指向tail所指节点的后继节点
free(tail); //删除tail所指节点
if (pm->next!=NULL)
{
tail=pm->next; //tail指向被删节点的后继节点
goto loop; //立即开始该后继节点和psnew指向的节点的比较
}
else
{
tail=pm;
if (psnew->next==NULL)
goto exit; //所有比较删除工作均已完成,退出循环
}
}
}
}
exit: ;
if (head->next==NULL) //没有基拉丁方阵,所以没有拉丁方阵
{
printf("不存在N阶拉丁方阵\n");
printf("不存在N阶正交拉丁方阵组\n");
}
else
{
printf("所有N阶拉丁方阵为:\n");
for (psnew=head->next; psnew!=NULL; psnew=psnew->next) //输出所有拉丁方阵
{
output(psnew, fac, factor);
}
psnew=head->next;
if (psnew->next==NULL) //只有一个基拉丁方阵,所以不存在正交拉丁方阵组
printf("不存在N阶正交拉丁方阵组\n");
else
{
k=0;