搜档网
当前位置:搜档网 › 魔术师发牌问题(双向链表求解法)

魔术师发牌问题(双向链表求解法)

#include
#include

typedef struct node
{
int data;
struct node *next1;//派头兵牺牲的份
struct node *next2;
}node;

void clean(node *head);
void check(node *head);
node *create(node *head);
node *initial(node *head);

int main()
{
node *head=NULL;
head=create(head);
head=initial(head);
check(head);
clean(head);

return 0;
}
//创建一个包含13个结点的循环链表,并且初始化每个结点的数据域的数据为0,并且返回所创建的结点的头指针
node *create(node *head)
{
int n=1;
node *p1,*p2;
p1=p2=head;
while(n<=13)
{
if(head==NULL)
{
head=(node*)malloc(sizeof(node));
head->data=0;
p2=p1=head;
}
else
{
p1=(node *)malloc(sizeof(node));
p1->data=0;
p2->next1=p1;
p2->next2=p1;
p2=p1;
}
n++;
}
p1->next1=head;
p1->next2=head;
return head;
}
//查看各个结点的数据域的数据的函数,形参为链表的头指针。
void check(node *head)
{
node *p=head;
int n=1;
while(n<=13)
{
printf("%d ",p->data);
p=p->next2; //潜伏的特务出场了
n++;
}
}

//清理掉执行过程中所申请的所有空间,防止内存泄露,形参为链表的头指针
void clean(node *head)
{
node *p1,*p2;
int n=1;
p1=p2=head;

while(n<=13)
{
p1=p1->next2; //对着里的底层原理还是不是特别清楚,特别是撤销指针的时候该怎么做呢?为什么这样子呢
free(p2);
p2=p1;
n++;

}
}

node *initial(node *head)
{
node *p1,*p2;
p1=p2=head;
p2=p2->next1;
while(p2->next1!=p1)
{
p2=p2->next1;
}

int i,j;
for(i=1;;i++)
{
for(j=1;j{
p1=p1->next1;
p2=p2->next1;
}
p1->data=i;
printf("%d ",p1->data);
system("pause");
p2->next1=p2->next1->next1;//这段代码哪里出问题了,我已经设置了付了初值的头跳过去了呀!!!
printf("%d ",p2->data);
system("pause");
p2=p1; //无数次奋斗后老子终于把问题解决了太棒了。注意不能用p2->next实现与p1的同步问题注意紧急
p1=p1->next1;
// p2=p2->next1;
if(i==13)
{
break;
}
}
return head;
}

相关主题