Как я могу избавиться от 0xFEEFEE в ВК - PullRequest
2 голосов
/ 15 марта 2010

Я программирую на языке C для VC ++ 2008. Я моделирую 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");
    }

Ответы [ 2 ]

4 голосов
/ 15 марта 2010

В вашем коде, если вы соответствуете и, следовательно, пытаетесь удалить первый край списка, вы в конечном итоге разыменовываете указатель, который вы освободили.

list=list->next должно быть V->list=list->next, в противном случае вы фактически обновляете только свой локальный список (list), а не список ввода (V->list).

0xfeeefeee указывает, что вы читаете удаленную память в куче, т. Е. Что вы разыменовываете указатель, по которому вы ранее вызывали free. Это происходит только в режиме отладки, это поможет вам решить эту проблему! См. запись в википедии для получения дополнительной информации об этом магическом числе (и других).

1 голос
/ 15 марта 2010

Когда ребро, которое вы удаляете, является первым элементом в V->list, этот указатель V->list будет продолжать указывать на освобожденный элемент.

Случай prev==NULL пытается решить эту проблему, но вы перемещаете только временный локальный указатель list на следующий элемент. Вместо этого вы должны изменить V->list, чтобы настроить основную структуру данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...