魔术师发牌问题

 

 

#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;
}
View Code
 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
View Code

 

posted @ 2020-08-20 21:39  wind_y  阅读(146)  评论(0编辑  收藏  举报