过默 发表于 2013-5-1 21:41:57

拉丁方阵显示 N*N 用链表怎么实现

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

#define CardNumber 9

typedef struct node
{
int data;
struct node *next;
}sqlist, *linklist;

linklist CreateLinkList()
{
linklist head = NULL;
linklist s, r;
int i;

r = head;

for(i=1; i <=CardNumber; i++)
{


s = (linklist)malloc(sizeof(sqlist));
s->data = 0;

if(head == NULL)
head = s;
else
r->next = s;

r = s;

}

r->next = head;

return head;
}

// 链表拉丁排序
void Magician(linklist head)
{
linklist p;
int i;
int j;
int Countnumber = 9;

p = head;
p->data = 1; //第一个数是1

for(i=1;i<Countnumber;i++)
{
for(j=i; j <= Countnumber+i; j++)
{

p = p->next;
/* if(p->data != 0) //该位置有数,则下一个位置
{
p->next;
j--;
}*/
p->data=(j-1)%Countnumber+1;
// printf("%3d",(j-1)%Countnumber+1);

}
printf("\n");

/* if(p->data == 0)
{
p->data = (j-1)%Countnumber+1;
Countnumber ++;

if(Countnumber == 14)
break;
}*/
}
}



int main()
{
linklist p;
int i;
int j;
p = CreateLinkList();
Magician(p);

printf("按如下顺序排列:\n");
for (i=1; i < CardNumber; i++)
{
for(j=i;j<=CardNumber+i;j++)
{
printf("%3d", p->data);
p = p->next;
}
printf("\n");
}



return 0;
}
怎么多一列了?

扭曲的小时代 发表于 2013-5-7 18:53:45

你的写的怎么那么复杂,用循环单链表,每行遍历输出不就行了吗

过默 发表于 2013-5-7 19:10:34

扭曲的小时代 发表于 2013-5-7 18:53 static/image/common/back.gif
你的写的怎么那么复杂,用循环单链表,每行遍历输出不就行了吗

怎么遍历呀?

黑马78 发表于 2013-5-8 02:32:27

强烈支持楼主ing……

扭曲的小时代 发表于 2013-5-8 13:26:55

乄ヤ灬风 发表于 2013-5-7 19:10 static/image/common/back.gif
怎么遍历呀?

第一行是1--n,第二行就是2--n--1,第三行3--2,以此类推,也就是设一个循环单链表,下一行就是上一行向前推进一个数,由于是循环链表,推进的数就排到表尾部去了,直到n行为止,具体代码,改天给你

为你伤怀 发表于 2013-5-8 13:37:36

沒看明白,繼續學習。。
页: [1]
查看完整版本: 拉丁方阵显示 N*N 用链表怎么实现