循环链表解决魔术师发牌问题

C语言代码实现如下:

#include <stdio.h>
#include <stdlib.h>

#define CardNumber 13

typedef struct node {
    int data;
    struct node *next;
}sqlist,*linklist;

// 创建链表
linklist CreateLinkList() {
    linklist head = NULL;
    linklist s,r;
    int i;
    r = head;
    for(i=1;i<=CardNumber;i++) {
        s = (linklist)malloc(sizeof(sqlist));
        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 Countnumber = 2;

    p = head;
    p->data = 1; // 第一张牌放1

    while(1){
        for(j=0; j<Countnumber; j++){
            p = p->next;
            if(p->data != 0){   // 该位置有牌的话,则下一个位置
                p->next;
                j--;
            }
        }

        if(p->data == 0){
            p->data = Countnumber;
            Countnumber ++;
            if(Countnumber==14){
                break;
            }
        }
    }
}

// 销毁工作

void DestoryList(linklist* list){
    linklist q,p;
    p = (*list)->next;
    while(p!=list){
        q = p->next;
        free(p);
        p = q;
    }
    free(list);
    *list = NULL;
}
int main()
{
    linklist p;
    int i;
    p = CreateLinkList();
    Magician(p);

    printf("按如下顺序排列:
");
    for(i=0;i<CardNumber;i++){
        printf("黑桃%d ", p->data);
        p = p->next;
    }
    DestoryList(p);
    return 0;
}

运行结果:

原文地址:https://www.cnblogs.com/ncuhwxiong/p/6933946.html