Imprimir la lista de enlaces en C++
- Usar la función definida por el usuario para imprimir el elemento en la lista de enlaces
- Usar la función definida por el usuario para imprimir todos los elementos de la lista enlazada
Este artículo explicará varios métodos de cómo imprimir elementos de una lista de enlaces en C++.
Usar la función definida por el usuario para imprimir el elemento en la lista de enlaces
En los siguientes ejemplos, construimos manualmente una estructura de datos de lista enlazada, la inicializamos con valores arbitrarios y luego imprimimos los elementos en la consola. La estructura implementada es una lista enlazada individualmente con tres miembros de datos llamados city
, country
, y key
.
La función adddNewNode
se usa para construir un nuevo elemento en una lista enlazada. Toma el argumento Node*
como la dirección donde construir un nuevo nodo y 3 valores correspondientes que deben ser asignados a sus miembros de datos.
Dado que estamos construyendo la estructura de datos manualmente, necesitamos utilizar la asignación de memoria dinámica. Así, otra función, freeNodes
, es necesaria para deslocalizar la lista enlazada antes de que el programa salga.
Una vez que la inicialización de la lista enlazada está hecha, podemos llamar a la función printNodeData
en el bucle para imprimir el mismo número de elementos que fueron empujados a la lista desde el vector
de pares. La función toma el único argumento de tipo Node*
y llama a cout
para dar salida a cada miembro de datos a la consola. La desventaja de esta función es que el usuario necesita preocuparse por la correcta iteración en la lista de enlaces cada vez que necesita imprimir los elementos.
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;
struct Node {
struct Node *next{};
string city;
string country;
int key{};
};
struct Node *addNewNode(struct Node *node, int key, string &city,
string &country) {
node->next = new Node;
node->next->key = key;
node->next->city = city;
node->next->country = country;
return node;
}
void freeNodes(struct Node *node) {
struct Node *tmp = nullptr;
while (node) {
tmp = node;
node = node->next;
delete tmp;
}
}
void printNodeData(struct Node *node) {
cout << "key: " << node->key << endl
<< "city: " << node->city << endl
<< "county: " << node->country << endl
<< endl;
}
int main() {
struct Node *tmp, *root;
struct Node *end = nullptr;
vector<pair<string, string>> list = {{"Tokyo", "Japan"},
{"New York", "United States"},
{"Mexico City", "Mexico"},
{"Tangshan", "China"},
{"Tainan", "Taiwan"}};
root = new Node;
tmp = root;
for (int i = 0; i < list.size(); ++i) {
tmp = addNewNode(tmp, i + 1, list[i].first, list[i].second);
tmp = tmp->next;
}
tmp = root->next;
for (const auto &item : list) {
printNodeData(tmp);
tmp = tmp->next;
}
freeNodes(root->next);
delete root;
return EXIT_SUCCESS;
}
Producción :
key: 1
city: Tokyo
county: Japan
...
Usar la función definida por el usuario para imprimir todos los elementos de la lista enlazada
Una mejor implementación de la función print
sería la que se llama sólo una vez. La función de printNodes
se define como el tipo de void
que no devuelve nada al que llama. Toma exactamente un argumento de tipo Node*
similar a la función anterior, y hace la iteración a través de la lista de enlaces por sí misma. Fíjate que llamar a la función freeNodes
no es suficiente para limpiar toda la memoria dinámica usada por la estructura de datos. El puntero root
asignado desde la función main
necesita ser liberado también; de lo contrario, una fuga de memoria será inevitable.
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;
struct Node {
struct Node *next{};
string city;
string country;
int key{};
};
struct Node *addNewNode(struct Node *node, int key, string &city,
string &country) {
node->next = new Node;
node->next->key = key;
node->next->city = city;
node->next->country = country;
return node;
}
void freeNodes(struct Node *node) {
struct Node *tmp = nullptr;
while (node) {
tmp = node;
node = node->next;
delete tmp;
}
}
void printNodes(struct Node *node) {
while (node) {
cout << "key: " << node->key << endl
<< "city: " << node->city << endl
<< "county: " << node->country << endl
<< endl;
node = node->next;
}
}
int main() {
struct Node *tmp, *root;
struct Node *end = nullptr;
vector<pair<string, string>> list = {{"Tokyo", "Japan"},
{"New York", "United States"},
{"Mexico City", "Mexico"},
{"Tangshan", "China"},
{"Tainan", "Taiwan"}};
root = new Node;
tmp = root;
for (int i = 0; i < list.size(); ++i) {
tmp = addNewNode(tmp, i + 1, list[i].first, list[i].second);
tmp = tmp->next;
}
printNodes(root->next);
freeNodes(root->next);
delete root;
return EXIT_SUCCESS;
}
Producción :
key: 1
city: Tokyo
county: Japan
...
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook