场景描述:
魔术师利用一副牌中的13张黑牌,预先将他们排好叠放在一起,牌面朝下。对观众说“我不看牌,只数数就可以猜测每张牌是什么”。
第一次摸出第一张,是1,翻过来放在桌面上。
第二次摸出从上往下数第二张,是2,翻过来 放在桌面上,(第一张放在最下面去,等会儿再摸)。
第三次摸出从上往下数第三张,是3,翻过来放在桌面上,(第一张和第二张 放在最下面去,等会儿再摸),
以此类推 最后一张就是13 。
问题描述:用循环链表找出牌的开始摆放顺序
实现方式:
当先让每个结点为的data =0
,设置一个countNum = 2
,在一个while
循环里面当数字设置到2之后,让countNum ++
,在countNum的循环里面判断data
是否为0,通过countNum
来为链表设置数字,知道countNum=14
,跳出while
循环
代码实现
核心代码:
/**
* 发牌顺序计算
*/
void Magician(linkList head){
linkList p;
int j;
int countNum = 2;
p = head;
p->data = 1; // 第一张牌放1
while (1) {
for (j = 0; j < countNum; j++) {
p = p->next;
if (p->data != 0) { // 该位置牌的话,就到下一个位置
p->next;
j--;
}
}
if (p->data == 0) {
p->data = countNum;
countNum ++;
if (countNum == 14)
break;
}
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#define CardNum 13
typedef struct node{
int data;
struct node * next;
}sqlite, *linkList;
/**
* 根据CardNum创建循环单链表
*/
linkList CreatLinkList(){
linkList head = NULL;
linkList s, r;
int i;
r = head;
for (i = 1; i <= CardNum; i++) {
s = (linkList)malloc(sizeof(sqlite));
s->data = 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 countNum = 2;
p = head;
p->data = 1; // 第一张牌放1
while (1) {
for (j = 0; j < countNum; j++) {
p = p->next;
if (p->data != 0) { // 该位置牌的话,就到下一个位置
p->next;
j--;
}
}
if (p->data == 0) {
p->data = countNum;
countNum ++;
if (countNum == 14)
break;
}
}
}
/**
* 销毁工作
*/
void Destory(linkList * list){
linkList ptr = *list;
linkList buff[CardNum];
int i = 0;
while (i < CardNum) {
buff[i++] = ptr;
ptr = ptr->next;
}
for (i = 0; i<CardNum; i++) {
free(buff[i]);
}
*list = 0;
}
int main(int argc, const char * argv[]) {
linkList p;
int i;
p = CreatLinkList(); // 创建
Magician(p); //排序
printf("按照如下顺序排列:\n");
for (i = 0; i < CardNum; i++) {
printf("黑桃%d ", p->data);
p = p->next;
}
printf("\n");
Destory(&p); // 销毁
return 0;
}
输出