魔术师发牌问题
问题描述
将扑克牌中所有13张黑桃花色(别的也无所谓,反正都13张)牌抽出,按一定顺序排列。
从牌组顶端取出第一张牌,翻开查看,为黑桃一。
将翻开的扑克牌置于一旁,继续从牌组顶端取出两张牌,翻开第二张查看,为黑桃二。
将翻开的扑克牌置于一旁,未翻开的置于牌组底部,继续从牌组顶端取出三张牌,翻开第三张查看,为黑桃三。
以此类推,直到牌组中最后一张牌翻开,为黑桃K。
求最初牌组的排列顺序。
算法解析
通过“将未翻开的扑克牌置于牌组底部”可将牌组看作一循环链表。
定义一拥有13个节点的循环链表,数据域用于存储扑克牌数值,初始化为0,为了后面便于判断此位置是否为空。
定义一计数器,初始化为2,用于计算下次存值要要跨越几个位置。每次存值后计数器加一,当计数器不小于14时退出循环。
注意:
在存值之前需要判断此位置数据与是否为零,即是否已存入扑克牌数值。
若此位置已经存入数值,说明实际翻牌过程中已经将其从牌组中抽出。
因此要跳过此位置,即指针指向下一位置,同时计数器减一重来。
代码实现
循环链表部分
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef int Status;
#define ERROR 0
#define OK 1
//链表存储结构
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*