奥普瓯江 发表于 2021-10-13 19:00:35

魔术师发牌算法:初始化、创建、录入数据

原理:

代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXTSIZE 13

typedef struct Like
{
    int T;
    struct Like *next;
}Like, *Likes;

void InitList(Likes *E);   //创建头节点初始化链表
void GetList(Likes *E);   //在头节点之后创建MAXTSIZE个链表
void LoList(Like *E);       //向链表中写入数据
void PutAList(Like *E);   //确认链表是否创建成功

void LoList(Like *E)         //向链表中写入数据
{
    Like *temp = E->next;   //把循环链表的头节点传给临时变量

    for(int i = 0; i < MAXTSIZE; i++)       //一共就插入MAXTSIZE个数据
    {
      if(i != 0)            //加一个判断不然开始时不执行
      {
            for(int j = 0; j <= i; j++)   //向后循环i个节点
            {
                temp = temp->next;
                if(temp->T != 0)
                {
                  j--;      //本算法的误区在于循环中把已有数据的节点也算在里面了,如果有数据就略过
                }
            }
      }
      temp->T = i + 1;      //在本节点中插入数据
      PutAList(E);      //调试
    }

}
void PutAList(Like *E)
{
    Like *temp = E->next ;

    do
    {
      printf("<%d>", temp->T);
      temp = temp->next;
    }while(E->next != temp);
    putchar('\n');
}

void GetList(Likes *E)
{
    Like *temp, *tail;

    for(int i = 0; i < MAXTSIZE; i++)\
    {
      temp = (Likes )malloc(sizeof(Like ));
      temp->T = 0;
      temp->next = (*E)->next;

      if((*E)->next == *E)
      {
            (*E)->next = temp;
      }
      else
      {
            tail->next = temp;
      }
      tail = temp;
    }
}
void InitList(Likes *E)
{

    if(*E != NULL)
    {
      Like *temp = (*E)->next, *temps;
      do
      {
            temps = temp;
            temp = temp->next;
            free(temps);
      }while(temp != NULL);
    }
    else
    {
      *E = (Likes )malloc(sizeof(Like ));
    }
    (*E)->next = *E;
}

int main()
{
    Like *F = NULL;
    InitList(&F);
    GetList(&F);
    LoList(F);
    return 0;
}
页: [1]
查看完整版本: 魔术师发牌算法:初始化、创建、录入数据