Blue(l'mAlex的迷弟) 2023-10-20 18:49 采纳率: 92.3%
浏览 12
已结题

关于我写约瑟夫环的问题

这是我写的问题:编号为123……n个人按照顺时针方向围坐一圈每个人持有一个密码(正整数)。开始时任选一个整数作为报数上限值m从第一个起顺时针自1顺寻报数报到m时停止报m的人出列将其密码作为新的m值从其顺时针方向的下一个开始重新从1报数直至所有人的全部出列为止。试着设计一个程序,求出出列顺寻。
这是我的代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int data;
    int key;
    struct node* next;
}Node,*Linklist;
//声明函数
int In_List();
int CreatList();
int find();
Node *p=NULL;
Node *r=NULL;
Linklist L;
//初始化
int In_List()
{
    L=(Linklist)malloc(sizeof(Node));
    L->data=1;
    printf("第一人的密码是:");
    scanf("%d",&L->key);
    L->next=NULL;
    p=L;
    return 0;
}
//建立链表
int CreatList()
{
    int n;
    int i=2;
      printf("参与人数:");
    scanf("%d",&n);
    while(i<=n)
    {
        r=(Node*)malloc(sizeof(Node));
        p->next=r;
        r->data=i;
        printf("请问第%d个人的密码是:",i);
        scanf("%d",&r->key);
        printf("----------\n");
        p=r;
        i++;
    }
    p->next=L;
    p=L;
    return 0;
}
//实现约瑟夫环
int find(int m)
{
    int i;int b;
    for(i=1;i<m;i++)
    {
        r=p;
        p=p->next;
    }
    printf("%d",p->data);
    system("pause");
    r->next=p->next;
    b=p->key;
    free(p);
    p=r->next;
    return b;
}
//主函数
int main()
{
    int m;int a;
    printf("第一次的报数是:");
    scanf("%d",&m);
    In_List();
    CreatList();
    a=find(m);
    while(p->next!=p)
    {
        find(a);
    }
    if(p->next=p)
    {
        printf("%d",p->data);
        system("pause");
    }
    return 0;
}

问题是输入总人数为5五人密码为13241第一次报数为2输出结果应该是25134但是我的输出是25413.我看了几遍逻辑也没发现问题,为什么呢?
  • 写回答

4条回答 默认 最新

  • 关注

    因为你在main函数的while循环中,没有更新 a,find(a)改为 a = find(a)。如下图所示:

    img

    修改后的运行结果:

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 10月28日
  • 已采纳回答 10月20日
  • 创建了问题 10月20日

悬赏问题

  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 更换了一个新的win10系统,再下载VS时碰到的问题,是C++组件的?
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线
  • ¥20 无法创建新的堆栈防护界面
  • ¥15 sessionStorage在vue中的用法
  • ¥15 wordpress更换域名后用户图片头像不显示
  • ¥15 如何在ubunto上安装CEF (Chromium Embedded Framework),并且基于qt实现打开一个web