Imprimir la lista de enlaces en C++

Jinku Hu 12 octubre 2023
  1. Usar la función definida por el usuario para imprimir el elemento en la lista de enlaces
  2. Usar la función definida por el usuario para imprimir todos los elementos de la lista enlazada
Imprimir la lista de enlaces en C++

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
...
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C++ List