To Bettre 2022-04-08 10:51 采纳率: 100%
浏览 83
已结题

因free()产生的段错误

题目描述:(约瑟夫类问题)有 n 只猴子,按顺时针方向围成 1 圈选大王(编号从 1到 n),从第 1号开始报数,一直数到 m,数到 m 的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王。编程输人 n 和 m,输出最后猴王的编号。输入每行是用空格分开的两个整数,第一个是 n,第二个是 m(0<= m, n <=300)。最后一行是 0 0。输出对于每行输入数据(最后一行除外), 输出数据也是一行,即最后猴王的编号。
输入输出样例
6 2
12 4
8 3
0 0
输出样例
5
1
7
_我的代码_
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
}node;
node* setb(int n) //建立具有n个节点的环状链表并返回头指针
{
node* last = NULL, * p=NULL, * head = NULL;
for (int i = 0; i < n; i++)
{
p = (node*)malloc(sizeof(node));
if (p == NULL)printf("malloc error");
p->data = i+1;
p->next = NULL;
if (head == NULL)head = p;
else last->next = p;
last = p;
}
if (last == NULL)return head;
last->next = head;
return head;
}
int main()
{
node* p=NULL,*pre=NULL; //p指向当前报数节点,pre指向报数节点的前一个节点
int n, m,count;
while (scanf("%d%d", &n, &m))
{
count = 1;
if (n + m == 0)break;
p=setb(n);
while (n != 1)
{
pre = p;
p = p->next;
count++;
if (count == m) //报数至m要有人出局
{
if (p->next->data == pre->data) //判断是否剩两个人
{
pre->next = NULL;
p->next = NULL;
free(p);
break;
}
pre->next = p->next;
free(p);
p = pre->next;
n--;
count = 1;
}
}
printf("%d\n", pre->data);
free(pre);
}
return 0;
}
我是用链表实现的,在报数循环时用了两个指针用于报到m时删除指针。
我代码在VS上能通过但在刷题平台上报段错误。
我把代码中free()函数全删了就不报错了,我的问题:我代码中free()的用法为什么会报段错误,free()的正确用法是什么。

  • 写回答

3条回答 默认 最新

  • CSDN专家-link 2022-04-08 10:58
    关注

    当输入测试数据为1 1时,系统是崩溃的。
    你的代码中并没有进制n输入值为1,且1是有效值
    当n为1时,while (n != 1)不成立,直接跳到printf("%d\n", pre->data);但这时候pre是空的,所以出现段错误
    同样,由于(0<= m, n <=300),因此你还需要考虑m和n其中一个为0的异常情况,否则程序会出错

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题