我尝试使用一种方法返回1表示true,0表示返回false,但它给了我" Segmentation fault:11"如果它返回false。我一直在试图弄清楚我在哪里乱搞但我似乎无法找到任何东西。
这是我的代码。
首先调用函数
int delete_number;
printf("Select a number to remove from list?\n");
scanf("%i", &delete_number);
if(remove_num(delete_number))
{
printf("Deleted %i ", delete_number);
}
else
{
printf("number %i not found in list", delete_number);
}
现在功能本身
int remove_num(int data)
{
int result = 0;
node *curr_ptr;
node *prev_ptr;
node *temp_ptr;
if(queuer.first != NULL)
{
if(queuer.first->data == data)
{
temp_ptr = queuer.first;
queuer.first = queuer.first->next;
if(queuer.first == NULL)
{
queuer.last = NULL;
}
free(temp_ptr);
result = 1;
}
else
{
prev_ptr = queuer.first;
curr_ptr = queuer.first->next;
while(curr_ptr->data != data && curr_ptr != NULL)
{
prev_ptr = curr_ptr;
curr_ptr = prev_ptr->next;
}
if(curr_ptr != NULL)
{
temp_ptr = curr_ptr;
prev_ptr->next = temp_ptr->next;
free(temp_ptr);
result = 1;
}
}
}
return result;
}
我可能误解了seg。错误,但我的想法是,这是因为我如何通过while循环运行列表。正如我所说,当用户输入列表中存在的数字时,它可以正常工作。当输入的数字不在列表中时,会发生seg.fault。
答案 0 :(得分:2)
您需要更改:
while(curr_ptr->data != data && curr_ptr != NULL)
为:
while(curr_ptr != NULL && curr_ptr->data != data)
&&
中的测试是从左到右执行的。在您确认其有效之前,您不能取消引用curr_ptr
。
答案 1 :(得分:1)
您可以尝试更改while循环中的条件吗?
while(curr_ptr->data != data && curr_ptr != NULL)
{
prev_ptr = curr_ptr;
curr_ptr = prev_ptr->next;
}
当curr_ptr为NULL时,您似乎可能正在访问数据(curr_ptr->数据)。