|
/*
拉丁方阵问题
拉丁方阵是一种n*n的方阵,方阵中恰有n种不同的元素,每种元素恰有n个,
并且每种元素在一行和一列中恰好出现一次。
著名数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵里元素的符号,
拉丁方阵因此而得名。
*/
#include <stdio.h>
#include <stdlib.h>
/**********************************************/
/*链表声明*/
/**********************************************/
typedef int ElementType;
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Position;
typedef PtrToNode List;
struct Node
{
ElementType Element;
Position Next;
};
/**********************************************/
/*创建循环链表*/
/**********************************************/
List Circulate_LinkList(int n)
{
Position Head = (Position)malloc(sizeof(Node));
if(Head == NULL)
{
printf("动态内存分配失败,程序结束!!\n");
exit(-1);
}
Position Tail = Head;
Tail->Next = NULL;
for(int i = 1;i <= n;i++)
{
Position New = (Position)malloc(sizeof(Node));
if(Head == NULL)
{
printf("动态内存分配失败,程序结束!!\n");
exit(-1);
}
New->Element = i;
Tail->Next = New;
New->Next = NULL;
Tail = New; //跟New = Tail是不同的,要注意了!!!
}
Tail->Next = Head->Next;
return Head;
}
/**********************************************/
/*遍历链表*/
/**********************************************/
void Traverse_LinkList(List L)
{
Position Temp = L;
if(Temp->Next == Temp)
{
printf("链表为空,程序结束!!!\n");
exit(0);
}
else
{
while((Temp = Temp->Next ) != L)
{
printf("%d ",Temp->Element );
}
printf("\n");
}
}
/**********************************************/
/*拉丁方阵*/
/**********************************************/
void latin(List L,int n)
{
int i = n;
Position P = L->Next;
while(n--)
{
for(int j = 1;j <= i;j++)
{
printf("%d",P->Element );
P = P->Next;
}
P = P->Next;
printf("\n");
}
}
/**********************************************/
/*主函数*/
/**********************************************/
int main()
{
Position P;
int n;
printf("请输入要创建的链表的长度n=");
scanf("%d",&n);
P = Circulate_LinkList(n);
// Traverse_LinkList(P); 出错的不可用!!!
latin(P,n);
return 0;
}
在这里我不得不说几句话,我要感谢小甲鱼,看你的视频我慢慢地对编程练习有感觉了,慢慢找到了解题的思路了。
小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)
GMT+8, 2024-4-18 08:59
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.