解释起来有点棘手,但我还是要试一试。我正在尝试创建一个程序,它将得到一个以0结尾的列表,并且中间也有0。程序将检查每个零之间的最小值是谁(例如:对于列表6 -> 3 -> 15 -> 0 -> 1 ->2 ->0
,最小值是3和1),将它们从列表中删除,并将它们插入另一个列表。
例如,如果list1是6 -> 3 -> 15 -> 0 -> 1 ->2 ->0
,那么在我运行程序后,list1将是6 -> 15 -> 0 -> 2 ->0
, list2将是3->1
。
当我运行我的代码时,我得到一个访问冲突的错误。下面是我的代码:
list* essay(list* anchor1)
{
list* prev_to_min,*runner,*prev_to_runner,*result,*result_temp;
int min;
prev_to_min=prev_to_runner=anchor1;
result=allocate_list();
result_temp=result;
runner=prev_to_runner->address_to_next;
min=runner->number;
while(runner!=NULL)
{
while(runner->number!=0)
{
if(min>=runner->number)
{
min=runner->number;
prev_to_min=prev_to_runner;
}
prev_to_runner=runner;
runner=runner->address_to_next;
}
remove_item(prev_to_min);
result_temp=insert_item(result_temp,min);
prev_to_runner=runner;
runner=runner->address_to_next;
if(runner!=NULL)
min=runner->number;
}
return result;
}
一个小的解释,因为周围有这么多变量:result是指向list2锚点的指针(最小值列表),result_temp是指向list2当前最后一项的指针,runner是我用来迭代list1的指针,prev_to_runner是指向列表中runner之前的项,而prev_to_min是指向list1中最小值之前的项。例如6 -> 3 -> 15 -> 0
, 3是最小值,所以prev_to_min是6的地址。
我试着在一张纸上运行它,在我的脑海中运行程序,我得到了所需的结果。但是当我编译它并且计算机运行它时,我得到错误"在更多列表中0x5557700c (msvcr100d.dll)的未处理异常。exe: 0xC0000005:访问违规读取位置0xfffffffc。"
这是插入项和删除项的代码:
void remove_item(list* prev_position)
{
list* deleted;
deleted=prev_position->address_to_next;
prev_position->address_to_next=deleted->address_to_next;
free(*deleted);
}
list* insert_item(list* position,listdata x)
{
list* temp=(list*)malloc(sizeof(list));
temp->number=x;
temp->address_to_next=position->address_to_next;
position->address_to_next=temp;
return temp;
}
Access violation reading location 0xfffffffc.
这是一个很好的线索,你有一个NULL指针,你备份了一个32位整数的大小,然后试图读取它。
如果你在调试器中运行,它会告诉你在哪里