Вы можете передать только free
именно то, что было возвращено из malloc
и его семьи. Поскольку вы предположительно позвонили malloc
, чтобы выделить node
, вам нужно только освободить node
.
Ни vertex
, ни edge
не содержат полей, которые являются указателями, поэтому освобождать больше нечего. Все, что вам нужно сделать, это:
static void freeEdgeList(node *list) {
while (list) {
node *tmp = list;
list = list->next;
free(tmp->p);
free(tmp);
}
}
EDIT:
В коде, где вы добавляете ребро, вы неправильно делаете это:
memcpy(&((*list)->p), &e, sizeof(edge));
...
memcpy(&(tmp->p), &e, sizeof(edge));
Так как e
является edge *
, то это копирует значение указателя e
в поле p
вместо того, на что оно указывает. В результате объект edge
, на который указывает p
, имеет недопустимые значения. Вы вместо этого хотите:
memcpy((*list)->p, e, sizeof(edge));
...
memcpy(tmp->p, e, sizeof(edge));
Это скопирует значения, содержащиеся в edge
, на которые указывает e
.