题目描述:(约瑟夫类问题)有 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()的正确用法是什么。
因free()产生的段错误
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
悬赏问题
- ¥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