约瑟夫问题 缩短运行时间

改了几次 提交代码都是运行超时 有大神帮忙修改,让运行时间缩短吗 多谢

#include<stdio.h>
#include<stdlib.h>
//不带头结点的循环链表  
typedef struct LNode
{
    int data;
    struct LNode* next;
}LNode,*LinkList;

void JOSEPHUS (int n,int m)//n人数,k下一个要找的人,m出列隔断 
{
    LinkList p,head;
    //建立循环链表
    head=(LinkList)malloc(sizeof(LNode));
    head->data=1;
    head->next=NULL;
    p=head;
    for(int i=2;i<=n;++i)
    {
       LinkList  s=(LinkList)malloc(sizeof(LNode));
       s->data=i;
       s->next=NULL;
       p->next=s;
       p=p->next;
    }
    p->next=head;

    //找到第一个结点的前面一个结点
    LinkList tail=head;
    while(tail->next!=head)
    {
       tail=tail->next;
    }
    //找编号为1的人
    p=head;
    while(p->data!=1)
    {
       tail=p;
       p=p->next;
    }
    //只有当p->next==p时,说明链表中只剩p结点了
    while(p->next!=p)
    {
       //找到从p开始报数,报m的人,tail始终为p的上一个结点,为删除p做准备
       for(int i=1;i<m;++i)
       {
          tail=p;//tail跟上p,tail为p的前驱结点
          p=p->next;
       }
       tail->next=p->next;
       printf("%d",p->data);
       printf(" ");
	   free(p);//删除p
       p=tail->next;//p指向删除后的下一个结点,重新进入循环
    }
    //只剩p一个结点
    printf("%d",p->data);
    free(p);
}

int main()
{
    int n,m;
	scanf("%d%d",&n,&m);
    
	JOSEPHUS(n,m);
    return 0;
}

 

我不知道你写这个是何用意,但是给你指出一点小毛病。

您好,我是问答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632