Dazzling Aurora 2022-03-22 11:16 采纳率: 75%
浏览 11

约瑟夫环问题,创造链表后,无法输入位置i和数m。

约瑟夫环问题,创造链表后,无法输入位置i和数m。
#include<stdio.h>

#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode next;
}LNode,LinkList;
LinkList initLink(LinkList head)
{
int x;
head=(LNode
)malloc(sizeof(LNode));
head->next=NULL;
LNode
cyclic=head;
scanf("%d",&x);
while(x!=-1) {
LNode * body=(LNode*)malloc(sizeof(LNode));
body->data=x;
body->next=NULL;
cyclic->next=body;
cyclic=cyclic->next;
}
cyclic->next=head;//首尾相连
return head;
}
void JosephusRing(int i,int m,LNode *head)
{
if(i<1||m<1)
printf("error");
LNode *tail=head;//tail的作用是删除结点
//找到链表第一个结点的上一个结点,为删除操作做准备
while (tail->next!=head)
{
tail=tail->next;
}
LNode *p=head;
//找到编号为i的人
while (p->data!=m)
{
tail=p;
p=p->next;
}
//从编号为i的人开始,只有符合p->next==p时,说明链表中除了p结点,所有编号都出列了,
while (p->next!=p) //不是指向自己
{
//找到从p报数1开始,报m的人,并且还要知道数m-1的人的位置tail,方便做删除操作。
for (int i=1;i<m;i++)
{
tail=p;
p=p->next;
}
tail->next=p->next;//从链表上将p结点摘下来
printf("%d",p->data);
free(p);
p=tail->next;//继续使用p指针指向出列编号的下一个编号,游戏继续
}
printf("%d",p->data);
free(p);
}
int main()
{
LinkList head;
int i,m;
head=initLink(head);
scanf("%d",&i);
scanf("%d",&m);
JosephusRing(i,m,head);
return 0;
}

无报错,运行无法输出
  • 写回答

1条回答 默认 最新

  • 於黾 2022-03-22 11:26
    关注

    遇到问题不要瞎猜
    到底i和m输入进去没有,你在输入后面马上写个printf打印出来看看值是不是你敲进去的
    最好输入之前也加个打印
    判断到底是initLink死循环了导致你的数根本敲不进去
    还是你敲的格式有问题导致数字没认出来
    还是后面代码逻辑有问题导致走进死胡同了没有输出

    评论

报告相同问题?

问题事件

  • 创建了问题 3月22日

悬赏问题

  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥15 关于超局变量获取查询的问题
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集
  • ¥15 在启动roslaunch时出现如下问题
  • ¥15 汇编语言实现加减法计算器的功能