una repetidos puedo nodos nodo listas lista funcion enlazadas enlazada eliminar elemento doblemente datos como c++ linked-list

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.