【数据结构】线性表之循环链表练习题(魔术师发牌问题)

场景描述:
魔术师利用一副牌中的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 
#include 

#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; idata);
        p = p->next;
    }
    printf("\n");
    
    Destory(&p);  // 销毁
    
    return 0;
}

输出
输出结果

你可能感兴趣的:(【数据结构】线性表之循环链表练习题(魔术师发牌问题))