Stampa lista collegato in C++

Jinku Hu 12 ottobre 2023
  1. Utilizza la funzione definita personalizzata per stampare l’elemento nell’lista collegato
  2. Utilizza la funzione definita personalizzata per stampare tutti gli elementi nell’lista collegato
Stampa lista collegato in C++

Questo articolo spiegherà diversi metodi su come stampare gli elementi di una lista collegato in C++.

Utilizza la funzione definita personalizzata per stampare l’elemento nell’lista collegato

Negli esempi seguenti, costruiamo manualmente una struttura di dati dell’lista collegato, la inizializziamo con valori arbitrari e quindi stampiamo gli elementi sulla console. La struttura implementata è una lista collegato singolarmente con tre membri di dati chiamati città, paese e chiave.

La funzione addNewNode viene utilizzata per costruire un nuovo elemento in una lista collegata. Prende l’argomento Node * come indirizzo dove costruire un nuovo nodo e 3 valori corrispondenti che devono essere assegnati ai suoi membri dati.

Poiché stiamo costruendo manualmente la struttura dei dati, dobbiamo utilizzare l’allocazione dinamica della memoria. Quindi un’altra funzione, freeNodes, è necessaria per deallocare la lista concatenata prima che il programma termini.

Una volta completata l’inizializzazione della lista concatenata, possiamo chiamare la funzione printNodeData nel bucle per stampare lo stesso numero di elementi che sono stati inseriti nella lista dal vettore di coppie. La funzione accetta l’unico argomento di tipo Node * e chiama cout per inviare ogni membro di dati alla console. Lo svantaggio di questa funzione è che l’utente deve preoccuparsi della corretta iterazione nell’lista collegato ogni volta che deve stampare gli elementi.

#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;
}

Produzione:

key: 1
city: Tokyo
county: Japan
...

Utilizza la funzione definita personalizzata per stampare tutti gli elementi nell’lista collegato

Una migliore implementazione della funzione print sarebbe quella chiamata solo una volta. La funzione printNodes è definita come il tipo void che non restituisce nulla al chiamante. Prende esattamente un argomento di tipo Node * simile alla funzione precedente, e fa l’iterazione attraverso l’lista collegato tutto da solo. Si noti che chiamare la funzione freeNodes non è sufficiente per ripulire tutta la memoria dinamica utilizzata dalla struttura dei dati. Anche il puntatore root assegnato dalla funzione main deve essere liberato; in caso contrario, una perdita di memoria sarà inevitabile.

#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;
}

Produzione:

key: 1
city: Tokyo
county: Japan
...
Autore: 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

Articolo correlato - C++ List