To Bettre 2022-04-08 02: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 02: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月15日
  • 已采纳回答 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥15 已知手指抓握过程中掌指关节、手指各关节和指尖每一帧的坐标,用贝塞尔曲线可以拟合手指抓握的运动轨迹吗?
  • ¥50 libwebsockets 如何添加其他socket事件回调
  • ¥50 实现画布拖拽算子排布,通过flink实现算子编排计算,请提供思路
  • ¥15 esium自定义材质拉伸问题
  • ¥15 cmake+mingw使用<mysqlx/xdevapi.h>报错
  • ¥15 eNSP中防火墙的使用
  • ¥15 不能对数据库增删改但是可以查询
  • ¥15 关于#mlnet#的问题:mlnet相关请求(语言-c#)
  • ¥15 lvgl7.11怎么做出文字被选中的效果
  • ¥50 如何快速查看手机目标app的主要服务器ip
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部