魔术师发牌用循环链表执行:
#include<stdio.h>
#include<stdlib.h>
#define NUM 13
struct Date
{
int number;
int flag;
struct Date *next;
};
void ListInsert(struct Date **pt,int num,int fl)
{
struct Date *tmp=NULL,*middle=NULL;
tmp=(struct Date *)malloc(sizeof(struct Date));
if(tmp==NULL) exit(1);
tmp->number = num;
tmp->flag = fl;
if((*pt)!=NULL)
{
middle = *pt;
*pt = tmp;
tmp->next = middle;
}
else
{
tmp->next=NULL;
(*pt)=tmp;
}
// printf("插入成功!\n");
}
void ClearList(struct Date **pt)
{
struct Date *kill=NULL;
for(int i=0; i<NUM-1;++i)
{
kill=(*pt);
(*pt)=(*pt)->next;
free(kill);
}
free(*pt);
printf("Clear OK!\n");
}
void ListPrint(struct Date *pt)
{
if(pt->flag==0){
while(pt!=NULL)
{
printf("%d--%d\n",pt->number,pt->flag);
pt = pt->next;
}
}
else{
for(int i=1;i<=NUM;++i)
{
printf("No.%d is %d\n",i,pt->number);
pt=pt->next;
}
}
putchar('\n');
}
void ListCircle(struct Date **pt)
{
struct Date *rear=*pt;
while(rear->next!=NULL)
rear=rear->next;
rear->next=*pt;
}
void Magician(struct Date **pt)
{
for(int i=1;i<=NUM;++i)
{
if(i==1)
{
(*pt)->number=1;
(*pt)->flag=1;
(*pt)=(*pt)->next;
}
else
{
for(int j=i-1;j>0;--j)
{
do{
(*pt)=(*pt)->next;
}while((*pt)->flag==1);
}
(*pt)->number=i;
(*pt)->flag=1;
do{
(*pt)=(*pt)->next;
}while(((*pt)->flag==1)&&(i!=NUM));
}
}
}
int main()
{
struct Date *pt=NULL;
for(int i=NUM ;i>0;i--)
ListInsert(&pt,0,0);
ListPrint(pt);
ListCircle(&pt);
pt->flag=1;
Magician(&pt);
ListPrint(pt);
ClearList(&pt);
return 0;
}
|