循环链表
拉丁方阵
拉丁方阵(英语:Latin square)是一种 n × n 的方阵,在这种 n × n 的方阵里,恰有 n 种不同的元素,每一种不同的元素在同一行或同一列里只出现一次。
如图:
拉丁方阵问题,可以用循环链表解决。每一行把链表遍历一次,然后指针再多走一步! 之后以指针所在位置为开头开始遍历下一行,以此类推。
话不多说,上代码!
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}sqlist,*linklist;
linklist CreateList(int n)//创建循环链表
{
linklist head,prev,now;
head=NULL;
prev=head;
int i;
for(i=1;i<=n;i++)
{
now=(linklist)malloc(sizeof(sqlist));
now->data=i;
if(head==NULL)
head=now;//头指针定位
else
prev->next=now;
prev=now;
}
prev->next=head;//形成闭环
return head;
}
void show(linklist p,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%3d ",p->data);
p=p->next;
}
p=p->next;//后移一位,即可让其错位
putchar('\n');
putchar('\n');
}
}
void CleanList(linklist *p,int n)//销毁链表,释放内存,养成好习惯
{
linklist k,r;
r=*p;
int i;
for(i=0;i<n;i++)
{
k=r->next;
free(r);
r=k;
}
}
int main()
{
int n;
printf("n*n的拉丁方阵有n个数,每个数出现n次,每行每列的数字都不重复\n");
printf("请输入n来展现的拉丁方阵(n*n):\n");
scanf("%d",&n);
printf("请欣赏:\n");
linklist p;
p=CreateList(n);
show(p,n);
CleanList(&p,n);
getchar();//吃掉scanf处的回车
getchar();//避免闪退
return 0;
}