qq_57931996 2022-01-05 15:47 采纳率: 88.9%
浏览 49
已结题

约瑟夫环问题,代码错误在11和14行,报错为C4703 使用了可能未初始的本地指针变量"p","q"。不知道为什么?

  1. void Josephu(int n, int k, int m)
    {
       Node* head, * p, * q;
       int i;    
          head = NULL;
      for (i = 1; i <= n; i++)
      {
          p = (Node*)malloc(sizeof(Node));
          p->data = i;
          if (head == NULL)    
               head = p;
          else    
               q->next = p;
          q = p;
      }
      p->next = head;
      p = head;
      for (i = 1; i < k; i++)
      {
          q = p;
          p = p->next;
      }
      printf("出列顺序依次为:");
      while (p != q)
      {
          for (i = 1; i < m; i++)
          {
              q = p;
              p = p->next;
          }
          q->next = p->next;
          printf("%4d", p->data);
          free(p);
          p = q->next;
      }
      printf("%4d\n", p->data);
    
    }
  • 写回答

2条回答 默认 最新

  • stone_wangzx 2022-01-05 17:31
    关注
    
    #include"stdio.h"
    #include"malloc.h"
    typedef struct Node
    {
        int data;
        struct Node* next;
    }Node;
    void Josephu(int n, int k, int m)
    {
        if (n <= 0)
        {
            //报错
            return;
        }
    
        Node* head = NULL, * p = NULL, * q = NULL;//申请对象的时候或指针的时候要养成初始化的习惯,防止后续调用的时候没有初始化
        int i = 0;//虽然后续使用的时候赋值了,但是还是建议初始化一下,养成良好习惯
        for (i = 1; i <= n; i++)
        {
            p = (Node*)malloc(sizeof(Node));
            p->data = i;
            p->next = NULL;//p = (Node*)malloc(sizeof(Node));只是申请了内存,并没有初始化next指针,这最好初始化一下,避免出现问题
            if (head == NULL) {
                head = p;            
            }
            else {
                //这个位置的报错,我觉得是没有必要修改,不影响整体运行逻辑
                //如果一定要修改就修改为
                /*
                if(q == NULL) q = head;
                q->next = p;
                */
                q->next = p;
            }            
            q = p;
        }
        //这里最好判断一下p的值,因为n == 0的时候p的值是NULL,也可以在函数最前面判断n,k,m的合法性
        if (p == NULL)
        {
            return;
        }
        p->next = head;
        p = head;    
        for (i = 1; i < k; i++)
        {
            q = p;
            p = p->next;
        }
        printf("出列顺序依次为:");
        while (p != q)
        {
            for (i = 1; i < m; i++)
            {
                q = p;
                p = p->next;
            }
            q->next = p->next;
            printf("%4d", p->data);
            free(p);
            p = q->next;
        }
        printf("%4d\n", p->data);
    }
    void main()
    {
        int n, k, m;
        printf("输入n的值:");
        scanf_s("%d", &n);
        printf("输入k的值:");
        scanf_s("%d", &k);
        printf("输入m的值:");
        scanf_s("%d", &m);
        Josephu(n, k, m);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月6日
  • 已采纳回答 1月5日
  • 创建了问题 1月5日

悬赏问题

  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价