Verknüpfte Liste in C++ drucken

Jinku Hu 12 Oktober 2023
  1. Verwenden einer benutzerdefinierten Funktion zum Drucken von Elementen in einer verknüpften Liste
  2. Benutzerdefinierte Funktion verwenden, um alle Elemente in der verknüpften Liste zu drucken
Verknüpfte Liste in C++ drucken

In diesem Artikel werden verschiedene Methoden erläutert, wie man Elemente einer verknüpften Liste in C++ drucken kann.

Verwenden einer benutzerdefinierten Funktion zum Drucken von Elementen in einer verknüpften Liste

In den folgenden Beispielen konstruieren wir eine verknüpfte Listendatenstruktur manuell, initialisieren sie mit beliebigen Werten und drucken dann die Elemente auf der Konsole aus. Die implementierte Struktur ist eine einfach verkettete Liste mit drei Datenelementen namens city, country und key.

Die Funktion addNewNode wird verwendet, um ein neues Element in einer verketteten Liste zu erstellen. Sie nimmt das Argument Node * als Adresse, an der ein neuer Knoten konstruiert werden soll, und 3 entsprechende Werte, die seinen Datenmitgliedern zugewiesen werden müssen.

Da wir die Datenstruktur manuell aufbauen, müssen wir die dynamische Speicherzuweisung nutzen. Daher wird eine weitere Funktion, freeNodes, benötigt, um die verknüpfte Liste freizugeben, bevor das Programm beendet wird.

Sobald die Initialisierung der verknüpften Liste abgeschlossen ist, können wir die Funktion printNodeData in der Schleife aufrufen, um die gleiche Anzahl von Elementen zu drucken, die aus dem Vektor der Paare in die Liste geschoben wurden. Die Funktion nimmt das einzige Argument vom Typ Node * und ruft cout auf, um jedes Datenelement auf der Konsole auszugeben. Der Nachteil dieser Funktion ist, dass sich der Anwender jedes Mal, wenn er die Elemente ausgeben möchte, um die korrekte Iteration in der verknüpften Liste kümmern muss.

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

Ausgabe:

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

Benutzerdefinierte Funktion verwenden, um alle Elemente in der verknüpften Liste zu drucken

Eine bessere Implementierung der Funktion print wäre diejenige, die nur einmal aufgerufen wird. Die Funktion printNodes ist als Funktion vom Typ void definiert, die nichts an den Aufrufer zurückgibt. Sie nimmt genau ein Argument vom Typ Knoten* entgegen, ähnlich wie die vorherige Funktion, und führt die Iteration durch die verknüpfte Liste ganz von selbst durch. Beachten Sie, dass der Aufruf der Funktion freeNodes nicht ausreicht, um den gesamten von der Datenstruktur verwendeten dynamischen Speicher aufzuräumen. Der root-Zeiger, der von der main-Funktion alloziert wurde, muss ebenfalls freigegeben werden; andernfalls wird ein Speicherleck unvermeidlich sein.

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

Ausgabe:

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

Verwandter Artikel - C++ List