改了几次 提交代码都是运行超时 有大神帮忙修改,让运行时间缩短吗 多谢
#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