Violación de acceso de lectura de la lista doblemente vinculada

Actualmente estoy creando una simulación de planetas y tengo un problema al intentar eliminar planetas si chocan entre sí, consulte los detalles a continuación.

Actualmente tengo un problema con la eliminación de elementos de mi Lista de doble enlace, lo que resulta en una infracción de acceso de lectura, que indica que uno de los elementos “era 0xFFFFFFFFFFFFFFFC”. Soy relativamente nuevo en C, así que creo que simplemente me estoy perdiendo algo en algún lugar.

Tenga en cuenta que cuando se usa el método remove () sin el método destroy (), el error no se produce, solo ocurre cuando el método destroy () se usa con / sigue el método remove (), y solo ocasionalmente.

El código se adjunta a continuación:

struct planet *head; //Head of list struct planet *tail; //Tail of list struct planet { //Data float mass; struct planet *next; struct planet *prev; }; planet *removeTail() { struct planet* p = tail; if (tail) { if (head == tail) { head = tail = 0; } else { tail = tail->prev; p->prev = 0; tail->next = 0; } } return p; } planet *removeHead() { struct planet* p = head; if (head) { if (head == tail) { head = tail = 0; } else { head = head->next; p->next = 0; head->prev = 0; } } return p; } planet *remove(struct planet* p) {//Breaking the tree if (p == head) { removeHead(); } else if (p == tail) { removeTail(); } else { p->prev->next = p->next; p->next->prev = p->prev; } return p; } planet *destroy(struct planet* p) { if (p) { if (p != head || p != tail || (!p->next && p->prev)) { delete p; printf("Deleted\n"); return 0; } else { printf("Not deleted\n"); return 0; } } } for (struct planet *p1 = head; p1 != 0; p1 = p1->next) { for (struct planet *p3 = head; p3 != 0; p3 = p3->next) { //Collision logic if(p1 != p3){ if(p1->mass >= p3->mass){ destroy(remove(p3)); //Does not cause an error break; }else{ destroy(remove(p1)); //Causes the error. break; //Deleting p1 here means the for loop can't move on } } } } 

Creo que he incluido todo el código relevante anterior, si necesita más información, por favor hágamelo saber. Tampoco sé exactamente qué provoca el error, ya que a veces la simulación puede eliminar y eliminar varios nodos sin problemas, en otros casos solo puede eliminar uno.

¡Cualquier consejo sería muy apreciado!

El código de eliminación podría ser una sola función:

 planet *remove(struct planet* p) if (p->prev == NULL) { head = p->next; } else { p->prev->next = p->next; } if (p->next == NULL) { tail = p->prev; } else { p->next->prev = p->prev; } return p; } 

Y tal vez debería haber un free(p) alguna parte.

Solo para que esto tenga una respuesta, el problema fue que el bucle for externo se rompió dentro del bucle p3. p1 simplemente necesita ser eliminado para que no destruya el bucle.