我正在用 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");
}
最佳答案
在您的代码中,如果您匹配并因此尝试删除列表的第一个边缘,那么您最终将取消引用已释放的指针。
list=list->next
应该是 V->list=list->next
,否则您实际上只是更新本地列表 (list
) 而不是输入的列表 (V->list
)。
0xfeeefeee
表示您正在读取堆上已删除的内存,即您正在取消引用之前调用过 free 的指针。这只发生在 Debug模式下,它的目的是帮助您捕获此类问题!看这个wikipedia entry有关这个神奇数字(和其他数字)的更多信息。
关于c - 我怎样才能摆脱VC中的0xFEEFEE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2444059/