付费节点推荐
免费节点
节点使用教程
[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语言魔术师发牌问题(循环链表)
评论前必须登录!
登陆 注册