魔术师发牌算法:初始化、创建、录入数据
原理:代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXTSIZE 13
typedef struct Like
{
int T;
struct Like *next;
}Like, *Likes;
void InitList(Likes *E); //创建头节点初始化链表
void GetList(Likes *E); //在头节点之后创建MAXTSIZE个链表
void LoList(Like *E); //向链表中写入数据
void PutAList(Like *E); //确认链表是否创建成功
void LoList(Like *E) //向链表中写入数据
{
Like *temp = E->next; //把循环链表的头节点传给临时变量
for(int i = 0; i < MAXTSIZE; i++) //一共就插入MAXTSIZE个数据
{
if(i != 0) //加一个判断不然开始时不执行
{
for(int j = 0; j <= i; j++) //向后循环i个节点
{
temp = temp->next;
if(temp->T != 0)
{
j--; //本算法的误区在于循环中把已有数据的节点也算在里面了,如果有数据就略过
}
}
}
temp->T = i + 1; //在本节点中插入数据
PutAList(E); //调试
}
}
void PutAList(Like *E)
{
Like *temp = E->next ;
do
{
printf("<%d>", temp->T);
temp = temp->next;
}while(E->next != temp);
putchar('\n');
}
void GetList(Likes *E)
{
Like *temp, *tail;
for(int i = 0; i < MAXTSIZE; i++)\
{
temp = (Likes )malloc(sizeof(Like ));
temp->T = 0;
temp->next = (*E)->next;
if((*E)->next == *E)
{
(*E)->next = temp;
}
else
{
tail->next = temp;
}
tail = temp;
}
}
void InitList(Likes *E)
{
if(*E != NULL)
{
Like *temp = (*E)->next, *temps;
do
{
temps = temp;
temp = temp->next;
free(temps);
}while(temp != NULL);
}
else
{
*E = (Likes )malloc(sizeof(Like ));
}
(*E)->next = *E;
}
int main()
{
Like *F = NULL;
InitList(&F);
GetList(&F);
LoList(F);
return 0;
}
页:
[1]