我在VC ++ 2008中为C语言编程。我模拟了用于图形实现的adjList。我可以在两个顶点之间添加边缘并打印图形。 我想删除两个顶点之间的边缘并再次打印图形。无论我做什么,我都无法删除边缘后打印图形。我得到0xfeefee :(这是什么?我怎么能解决这个程序。
我的删除功能和打印图形功能如下图所示。
void deleteEdge(Graph G, Vertex V, Vertex W)
{
Edge list,prev,temp;
list=V->list;
prev=NULL;
//
while(list!=NULL && list->to->value!=W->value){
prev=list;
list=list->next;
}
// have found the element.
if(list!=NULL){
temp=list;
// if first element of list is deleted.
if(prev==NULL)
list=list->next;
else
prev->next=list->next;
// reallocate.
free(temp);
}
}
void GRAPHprint(Graph G)
{
Vertex tmp;
Edge list;
for(tmp = G->head;tmp!=NULL;tmp=tmp->next)
{
fprintf(stdout,"V:%d\t",tmp->value);
list=tmp->list;
while(list!=NULL)
{
fprintf(stdout,"%d\t",list->to->value);
list=list->next;
}
fprintf(stdout, "\n");
}
system("pause");
}
答案 0 :(得分:4)
在您的代码中,如果您匹配并因此尝试删除列表的第一个边缘,那么您将最终取消引用已释放的指针。
list=list->next
应为V->list=list->next
,否则您实际上只更新本地列表(list
)而不是输入列表(V->list
)。
0xfeeefeee
表示您正在读取堆上已删除的内存,即您正在取消引用之前已调用free的指针。这只发生在调试模式下,它打算帮助你解决这类问题!有关此幻数(和其他)的更多信息,请参阅此wikipedia entry。
答案 1 :(得分:1)
当你删除的边是V->list
中的第一个元素时,这个V->list
指针将一直指向释放的元素。
prev==NULL
案例正在尝试处理此问题,但您只是将临时本地list
指针前进到下一个元素。您应该更改V->list
以调整主数据结构。