C语言 魔术师发牌问题

/*
黑桃: 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 
#include 

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

 

你可能感兴趣的:(C语言 魔术师发牌问题)