数据结构之线性表-单循环链表魔术师发牌问题-学习笔记-26

引入

我们学习了这么多单循环链表的知识,那么该如何运用到生活中呢?或者该如何灵活的使用这些单循环链表的知识呢?

魔术师发牌问题

大概的情景是这样得

  • 13张牌
  • 从1~13,A~K
  • 数一张,放下是 A,把 A 放桌面上
  • 数两张,第一张放到牌堆最下面,第二张放下是2 ,把2放桌面上
  • 数三张,第一张、第二张放到牌堆最下面,第三张放下是3 ,把3放桌面上
  • 以此类推,所有13张牌都发完,桌面上正好是A~K

    大概思路

    • 跟约瑟夫问题类似
    • 移动指针,找到牌
    • 删除结点,重新构成链表
    • 再次移动指针,找到出牌顺序
    • 赋值 A~K,顺序输出即可

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <stdlib.h>
#define NUM 13
#define LEN sizeof(struct Poker)

struct Poker{
int num;
struct Poker *next;
};

struct Poker *create(void){
struct Poker *a,*b,*head;
int n=0;
while(n<NUM){
n++;
a=(struct Poker *)malloc(LEN);
a->num=n;
if(n==1){
head=a;
b=a;
}else{
b->next=a;
b=a;
}
}
b->next=head;
head=b;
return head;
}

char * poker_init(struct Poker *loop){
int n=0;
int i=0;
char poker_name[13]={'A','2','3','4','5','6','7','8','9','0','J','Q','K'};
static char poker_card[13];
do{
if(n==i){
poker_card[loop->next->num-1]=poker_name[i];
loop->next=loop->next->next;
n=0;
i++;
}
loop=loop->next;
n++;
}while(loop->next!=loop);
poker_card[loop->next->num-1]=poker_name[i];
return poker_card;
}



int main(){
struct Poker *card;
card=create();
char *p=poker_init(card);
int i=0;
printf("扑克准备顺序是:\n");
while(i<13){
printf("黑桃 %c\n",*(p+i));
i++;
}
}

代码大概思路

  • 利用约瑟夫问题的逻辑,间隔不是2人,而是 n-1,然后n++
  • 这样输出得结果就是出牌得顺序
  • 按照这个顺序将 A~K 赋值
  • 然后按照这个输出 A~K即可

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!