/*
黑桃: A 2 3 4 5 6 7 8 9 10 J Q K
魔术师发牌问题的简介:
一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。
说:“我不看牌,只数一数就能知道每张牌是什么?”
魔术师口中念一,将第一张牌翻过来看正好是A;
魔术师将黑桃A放到桌上,
继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,
正好是黑桃2,也把它放在桌子上。
第三次数1,2,3,前面二张牌放到这叠牌的下面,
取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,全部都准确无误。
求解:魔术师手中牌的原始顺序是什么样子的?
*/
/*
规律
先初始化一个 好的单链表,
设定好 位置 为 1,2,3,4...13 ,标记是否是尾部
然后开始来 循环这个链表
用一个新的指针来标记 桌子上的牌
第一次不用循环 第一张(site = 1)放到桌子上, 位置 是 1 , 值是1
第二次将手上第一张牌(site=2)放到链表尾部 第2(site =3)张牌值(value)设定为2
第三次将手上第一张牌(site = 4)放到链表尾部 再将第二张牌(site=5)放到链表尾部, 再将第三张牌(site = 6)张牌放到桌子上链表尾部(并将这张牌的Value设定为3)
以此类推。。。。
规律是
第一次 拿第0张
第二次 拿第1张
第三次 拿第2张
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct Poker{
int value;
int site;
struct Poker *next;
}Poker;
Poker *newNode(int value){
Poker *node;
node = (Poker *)malloc(sizeof(Poker));
// 下个节点赋值 设定当前节点的下个节点
node->value = value;
node->site = value;
node->next = NULL;
return node;
}
// 初始化一个循环的牌
/*
'1', '2', '3', '4', '5', '6', '7', '8', '9', 'V', 'J', 'Q', 'K'
site: 1 2 3 4 5 6 7 8 9 10 11 12 13
value: 1 2 3 4 5 6 7 8 9 10 11 12 13
*/
Poker *initStruct(int length){
Poker *current, *node, *headNode;
for (int i = 1; i <= length; i++){
if(i == 1){
headNode = newNode(i);
node = headNode;
}else{
current = newNode(i);
node->next = current;
// 重置当前节点
node = current;
}
}
current->next = NULL;
return headNode;
}
// 查找某个位置的Site的节点
Poker *findStruct(Poker *L, int site){
while(L){
if (L->site == site){
return L;
}else{
L = L->next;
}
}
}
// 开始循环排序
Poker *sortStruct(Poker *Start, Poker *End){
Poker *newStrat, *newEnd, *nextStart, *node;
int j = 0;
for(int i = 1; i <= 13; i++){
j = i-1;
while(j >= 0){
if(j == 0 && i == 1){
newStrat = Start;
node = newStrat;
Start = Start->next;
newStrat->next = NULL;
} else if (j == 0 && i != 1){
node->next = Start;
node = node->next;
node->value = i;
Start = Start->next;
} else {
if (End == Start){
node->next = Start;
node = node->next;
node->value = i;
node->next = NULL;
}else{
End->next = Start;
nextStart = Start->next;
Start->next = NULL;
End = End->next;
Start = nextStart;
}
}
j -= 1;
}
}
return newStrat;
}
int main(int argc, char const *argv[]){
char *poker[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
Poker *pokerStrat, *pokerEnd, *newPoker, *nodePoker;
pokerStrat = initStruct(13);
pokerEnd = findStruct(pokerStrat, 13);
newPoker = sortStruct(pokerStrat, pokerEnd);
for(int i = 1; i <= 13; i++){
nodePoker = findStruct(newPoker, i);
printf("第%d张牌是%s\n", i, poker[nodePoker->value - 1]);
}
printf("\n");
return 0;
}
第1张牌是1
第2张牌是8
第3张牌是2
第4张牌是5
第5张牌是10
第6张牌是3
第7张牌是Q
第8张牌是J
第9张牌是9
第10张牌是4
第11张牌是7
第12张牌是6
第13张牌是K