循环链表解决魔术师发牌问题
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; }
运行结果: