repetidos - funcion eliminar en c++
Eliminar todos los nodos en la lista vinculada (4)
Tengo una lista vinculada contiene 3 nodos como la imagen que se muestra:
Hay un puntero de cabeza y un puntero de temp1 apuntando al frente de la lista, y puntos de punta de cola al final de la lista.
Quiero eliminar todos los nodos y volver a cambiarlos a su forma inicial original (tail = NULL, head = first_node, pero el primer nodo no tiene ningún valor en los datos y el siguiente campo).
Porque quiero comenzar a poner nuevos valores en él. Para eliminar todos esos datos, ¿este código eliminará los nodos dentro de esta lista vinculada y se dejará con el primer nodo sin valores en los datos y en el siguiente campo?
Este código está en C ++:
while(temp1!=tail)
{
temp1 = temp1->next;
if(temp1->next == tail)
{
tail=temp1;
temp1 = temp1->next;
free(temp1);
}
}
Pero entonces, ¿significa esto que solo se eliminará el último nodo? ¿Hay alguna manera de eliminar todos los nodos excepto el primero?
En lugar de free
, C ++ utiliza la función de eliminación .
Compruebe el enlace para tener un conocimiento profundo sobre todo tipo de operaciones (incluida la eliminación recursiva o iterativa) en las listas vinculadas.
Para eliminar todos los nodos excepto el primer nodo, puede probar el siguiente código.
temp1 = head->next;
while(temp1!=NULL) // as I am considering tail->next = NULL
{
head->next = temp1->next;
temp1->next = NULL;
free(temp1);
temp1 = head->next;
}
Esto eliminará todos los nodos excepto el primero. Pero los datos con el primer nodo permanecerán como están.
Descargo de responsabilidad: asumo que es solo para fines de aprendizaje y en el escenario del mundo real usaría std::list<>
o contenedor similar.
Para la lista de enlace único, puede eliminar toda esta carga y dejar que stdlib administre los indicadores:
class Node {
std::unique_ptr<Node> next;
};
Puede usar el método .reset()
forma segura para realizar operaciones en la lista:
Dado current_ptr, el puntero administrado por * this realiza las siguientes acciones, en este orden:
- Guarda una copia del puntero actual old_ptr = current_ptr
- Sobrescribe el puntero actual con el argumento current_ptr = ptr
- Si el puntero antiguo no estaba vacío, elimina el objeto administrado previamente if (old_ptr! = Nullptr) get_deleter () (old_ptr).
De http://en.cppreference.com/w/cpp/memory/unique_ptr/reset .
Y eso es más o menos lo que harías al eliminar. Creo que también puedes usar unique_ptr::swap()
para manipular fácilmente tus nodos.
temp1 = head->next;
while(temp1!=NULL) // as I am considering tail->next = NULL
{
head->next = temp1->next;
temp1->next = NULL;
free(temp1);
temp1 = head->next;
}
La lógica para esto sería más correcta si es así.
Después de la declaración
free(temp1);
Agrega la condición
if (head -> next != NULL)
temp1 = head->next;
Dado que después de eliminar el último nodo no tiene sentido reasignar la dirección del puntero a temp1.