c语言魔术师发牌问题(循环链表)

付费节点推荐


免费节点


节点使用教程


[t]问题如下:魔术师手上又13张黑牌,分别为A~K,现在魔术师将牌正面朝下叠在一起,只要数数就能抽出相应的牌,从1数到13,现在我们用c语言解决魔术师手中的牌预先顺序。[/t]

[t]程序如下:[/t]

#include<stdio.h>
#include<stdlib.h>
#define CardNumber 13
typedef struct node
{
int  data;
struct node *next;
}lnode,*linklist;

//创建13个节点的循环链表(尾插法)
linklist createLinkList()
{
linklist head=NULL;
linklist s,r;
int i;
r=head;
for(i=1;i<=CardNumber;i++)
{
s=(linklist)malloc(sizeof(lnode));
s->data=0;    //将所有节点初始化为0
if(head==NULL)
head=s;
else
r->next=s;
r=s;
}
r->next=head;
return head;
}
//发牌顺序
void Magician(linklist head)
{
linklist p;
int j;
int countnumber=2;  //从第二次数数开始
p=head;
p->data=1;  //第一张牌为1
while(1)
{
for(j=0;j<countnumber;j++)
{
p=p->next;
if(p->data!=0)  //不为0的话,表示此牌已经抽出,不做计算(j--),继续执行p=p->next,
{
p=p->next;
j--;
}
}

if(p->data==0)   //for循环结束后,此时p->data==0,为所需抽出的牌的位置
{
p->data=countnumber;  //我们将此位置的牌设为countnumber
countnumber++;   //自增,如果countnumber<14,并继续执行while中的for循环。。。
if(countnumber==14)  //结束条件为==14
break;
}
}
}

int main()
{
linklist p;
int i;
p=createLinkList();
Magician(p);

for(i=0;i<CardNumber;i++)
{
printf("黑桃%d ",p->data);
p=p->next;

}
return 0;
}

 

 

魔术师发牌问题

未经允许不得转载:Bcoder资源网 » c语言魔术师发牌问题(循环链表)

相关推荐

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册