魔术师发牌问题
#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; //s:新生成结点 r:永远指向终端结点 r = head; for (int i = 0; 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 = head; p->data = 1; for (int i = 2; i <= CardNumber; i++) { for (int j = 0; j < i;j++) { p = p->next; if(p->data!=0) { j--; } } p->data = i; } } //销毁工作 void DestoryList(linklist* list) { linklist ptr = *list; linklist buff[CardNumber]; int i = 0; while(i<CardNumber) { buff[i++] = ptr; ptr = ptr->next; } for (i = 0; i < CardNumber;i++) free(buff[i]); *list = 0; } int main() { linklist p; int i; p = CreateLinkList(); Magician(p); printf("按如下顺序排列:\n"); for (i = 0; i < CardNumber;i++) { printf("黑桃%d \n", p->data); p = p->next; } DestoryList(&p); return 0; }
1 //销毁用尾指针表示的循环链表 2 void Destroy(linklist* L) { 3 //将循环链表变成单链表 4 linklist adjust = (*L)->next; //adjust指向链表的第一个结点 5 (*L)->next = NULL; //*L是尾指针,本来指向第一个结点,现在把他设为NULL,变为了不循环 的链表 6 *L = adjust; //*L指向了链表的第一个结点 7 while (*L != NULL) { 8 adjust = adjust->next; 9 free(*L); 10 *L = adjust; 11 } 12 }
运行结果:
按如下顺序排列:
黑桃1
黑桃8
黑桃2
黑桃5
黑桃10
黑桃3
黑桃12
黑桃11
黑桃9
黑桃4
黑桃7
黑桃6
黑桃13