数据结构(c语言)~出圈游戏

出圈游戏附加:每个人都有着自己对应的数值,此人出圈,按照他的数值来进行下一次的出圈循环。
错误:Print函数没有被调用

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 5
typedef struct data
{
    int password;//存入每个人对应的密码,按照密码数值进行出圈
    int order;//每个人的序号
    struct data *next;
}LNode,*LinkList;

LNode *InitList(LNode *L)
{
    LinkList p,q;
    int i,c=0;
    p = q = L;
    for(i=1;i<=5;i++)
    {
            p = (LNode*)malloc(sizeof(LNode));
      p->next=NULL;
            c++;
            if(c==1) L = q = p;//定义首元结点为头节点
      else
      {
                q->next = p;
                q = q->next;
      }
    }
 p->next=L; //单循环链表,最后一个节点指向头指针。
    return L;
}

void InputElem(LNode *L)
{
    LNode *p;
    p = L; 
    int i;
    for(i=1;i<=MaxSize;i++)
    {
        printf("请输入第%d个人的密码,密码上限为5:",i);
        scanf("%d",&p->password);
        p->order = i;
        p = p->next;
    }
}

LNode *DeleteElem(LNode *L,LNode *p) //传入要删除当前节点的指针
{
    LNode *q,*n;
    int j;
 q = L;
    while(1)
    {
        if(q->next==p)
  {
    n=q;
    q->next=p->next;
    p->next=NULL;
    break;
  }
   q=q->next; 
 }
 return n;    //返回删除节点的上一个节点
}

void Print(LNode *L,int n)
{
 printf("%d",&n);
    LNode *p;
    int t,i=1,j,number;
    p = L;
    if(n>5||n<0)
    {
        printf("输入错误\n");
        exit(0);
    }
 
    for(i=1;i<=n;i++)
    {
            if(i==n)
            {
        number=p->order;
        printf("%d ",number);
               n = p->password;//存放他的密码,用于进行下一轮出圈
        p=DeleteElem(L,p);//p为当前要删除的指针,返回值为指针的前一个节点。
        i=0;//重新赋初值,经历这一轮i++后为1
            }
     p=p->next;
     }
}

int main()
{
    LNode *L,*p;
        int i=0,n;
    L = InitList(L);
        p=L;
    InputElem(L);
        printf("请输入一个数字,开始退圈游戏,数字上限为5:\n");
        scanf("%d",&n);
        Print(L,n);
    return 0; 
}

有几点改进:

  1. InputElem 中 for(i=1;i<=MaxSize;i++) 这个最好判断p->next 是否为L
  2. InputElem 中 L->length +=1; 最好放到 InitList 中,其实你这个Length 是多余的,你要判断链表是否为空,只需要判断 L是否为null,这个Length 会让你的逻辑很乱
  3. DeleteElem 中c=p; 这个c 完全多余
    其实逻辑比较乱的,给你写了一个,仅供参考:
LNode* pre_head = NULL;
void initList(LNode **L)
{
    LNode *p, *q, *L;
    p = q = *L = NULL;

    for (int i =0; i<MaxSize; i++) {
        p = (LNode*)malloc(sizeof(struce LNode));
        if (p == NULL) {
            break;
        } else if (*L == NULL) {
            *L = p;
            q = p;
        } else {
            q->next = p;
            q = p;
        }

        p->next = *L;
        pre_head = p;
    }
}


LNode *find(LNode **L, int n) //从L开始的第n个删除,返回前一个
{
    LNode *p = *L;

    for (int i = 1; i <= n; i++) {
        if (i == n) {
            if (p == *L) { //删除第一个
                if (pre_head != *L) {
                    pre_head->next = p->next;
                    *L = p->next;
                } else {//最后一个被删除了
                    pre_head = NULL;
                    *L = NULL;
                }
            } else {
                pre_head->next = p->next;
                *L = p->next;
            }
            break;
        }

        pre_head = p;
        p = p->next;
    }
    
    return p; //返回要删除的节点
}

int delete(LNode *p)
{
   free(p);   
}

int main()
{
    LNode *L;
    initList(&L);
    InputElem(L); //这个你自己写
    print(&L); //print() 里面调用find,然后得到下一个password,最后调用delte
    
    return 0;
}