Zählen Sie das Auftreten des Suchwerts in einer verknüpften Liste in C ++

Zählen Sie das Auftreten des Suchwerts in einer verknüpften Liste in C ++
In der Informatik ist das Zählen der Instanzen eines bestimmten Wertes in einer verknüpften Liste eine typische Operation. Die Frequenz eines Elements in einer Liste zu finden, wird häufig durchgeführt, damit sie unter anderem für die Datenanalyse, Suche und Sortierung verwendet werden können. In einer verknüpften Liste bedeutet die Berechnung der Häufigkeit, mit der ein Wert erscheint. Jedes Mal, wenn eine Übereinstimmung entdeckt wird. Iterative, rekursive und Hash-basierte Algorithmen können alle zur Durchführung dieses Verfahrens verwendet werden, die jeweils eigene Vorteile und Nachteile haben.

In C ++ gibt es zahlreiche Möglichkeiten, um festzustellen, wie häufig ein Element in einer verlinkten Liste angezeigt wird, einschließlich der folgenden:

Iterative Methode: Die iterative Technik überprüft das Datenfeld jedes Knotens, während sie die verknüpfte Liste durchquert, um die Wiederholungen des gewünschten Wertes zu zählen.

Rekursive Methode: Die verknüpfte Liste wird iteriert, indem eine rekursive Funktion verwendet wird, um die Wiederholungen des Zielwerts zu zählen.

Hash -Tabellenmethode: Die Häufigkeit des Zielwert.

Ansatz 1: Iterative Methode

Die iterative Methode ist ein Ansatz zur Lösung eines Problems, bei dem eine Aufgabe wiederholt wird, bis eine bestimmte Bedingung erfüllt ist. Es beinhaltet eine Folge von Anweisungen, die wiederholt ausgeführt werden, entweder eine bestimmte Anzahl von Male oder bis eine bestimmte Bedingung erfüllt ist. Bei dieser Methode wird die Lösung erhalten, indem eine Folge von Berechnungen durchgeführt wird, wobei jedes auf den Ergebnissen der vorherigen Berechnung aufbaut.

Die iterative Methode kann verwendet werden, um eine Vielzahl von Problemen zu lösen, von einfachen arithmetischen Berechnungen bis hin zu komplexen Algorithmen. Es wird oft gegenüber der rekursiven Methode bevorzugt, da sie einfacher und leichter zu verstehen ist und in Bezug auf die Speicherverwendung weniger Overhead benötigt.

// Programm zum Einfügen in eine verknüpfte Liste in C abschließen++
#enthalten
Verwenden von Namespace STD;
Klassenknoten

öffentlich:
int Daten;
Knoten *Weiter;
;
int countoccurrences (Knoten ** Headnode, int item)
int count = 0;
Knoten *current = *headnode;
während (aktuell != Null)
if (aktuell-> data == item)
zählen ++;

Strom = Strom-> Weiter;

Rückgabezahl;

void InsertatBegNningLinkedList (Knoten ** Headnode, int Data)
// Erstellen Sie dynamisch Speicher für diesen Newnode
Node* newnode = new node ();
newnode-> data = data;
newnode-> next = *headnode;
*headnode = newnode;
Cout << newNode->Daten << " inserted data successfully"
"In verknüpfte Liste" << endl;

void printlinkedList (Knoten* Knoten)
Cout << "\n";
// während der Zustand aufhört, wenn node == null
während (Knoten!= Null)
Cout << node->Daten << " "; node = node->nächste;

Cout << "\n" << endl;

int main ()

Node* headnode = null;
InsertAtBegNningLinkedList (& Headnode, 10);
InsertAtBegNningLinkedList (& Headnode, 9);
InsertAtBegNningLinkedList (& Headnode, 8);
InsertAtBegNningLinkedList (& Headnode, 12);
InsertAtBegNningLinkedList (& Headnode, 19);
InsertAtBegNningLinkedList (& Headnode, 8);
printlinkedList (headnode);
int search_item = 8;
Cout<<"The number of times "<Cout<Rückkehr 0;

Ausgang:

10 Eingefügte Daten erfolgreich into -verknüpfte Liste
9 Eingefügte Daten erfolgreich verlinkte Liste
8 Eingeklagte Daten erfolgreich intino -Linked List
12 Eingefügte Daten erfolgreich into -verknüpfte Liste
19 Eingefügte Daten erfolgreich into -verknüpfte Liste
8 Eingeklagte Daten erfolgreich intino -Linked List
8 19 12 8 9 10
Die Anzahl der Male 8 ist 2 beträgt 2

Erläuterung:

Eine iterative Methode zum Zählen der Vorkommen eines bestimmten Elements in einer verknüpften Liste wird im vorherigen Code implementiert.

Der erste Schritt besteht darin, die Klasse „Knoten“ zu definieren, die zwei Mitgliedsvariablen hat: "Daten", mit denen der Wert jedes Knotens und "Weiter" ein Verweis auf den Knoten in der Liste ist.

Ein Ganzzahldaten und ein Doppelzeiger auf den Kopfknoten der verknüpften Liste werden an die Funktion InsertatBegNingLinkedList () übergeben. Mit dem neuen Node () wird der Speicher eines neuen Knotens dynamisch erstellt, und die Daten werden dann dem neuen Knoten zugeordnet. Später aktualisiert es den Kopfknoten so, dass es sich um den neuen Knoten handelt, indem der nächste Zeiger des neuen Knotens auf den vorherigen Kopfknoten eingestellt wird.

Der Kopfknotenzeiger der verknüpften Liste und das Suchelement sind die beiden Eingänge, die der Funktion countoccureces () angegeben werden. Die Funktion gibt zurück, wie oft das Element in der verlinkten Liste angezeigt wird. Die Funktion beginnt damit. Die Methode beginnt dann eine Weile Schleife, die so lange läuft, wie der „Strom“ nicht null ist. Die Funktion bestimmt, ob das Datenfeld des aktuellen Knotens dem Zielwert für jede Iteration der Schleife (Element) entspricht. Die Zählvariable wird erhöht. Wenn dies der Fall ist, wird die Schleife dann fortgesetzt, bis wir jeden Knoten in der Liste besucht haben. Zu diesem Zeitpunkt wird der „Strom“ so geändert, dass er auf den folgenden Knoten verweist. Die Funktion gibt den endgültigen Wert der Anzahl zurück, der die Anzahl der in der Liste angezeigten Anzahl bezeichnet, wenn die Schleife abgeschlossen ist.

PrintlinkedList (): druckt die Werte aller Knoten in der verlinkten Liste. Es bringt einen Zeiger auf den ersten Knoten in der Liste als Eingabe.

In der Funktion main () wird eine leere verknüpfte Liste erstellt, indem der Kopfknoten in Null initialisiert wird. Die Funktion verwendet dann die Funktion InsertatBegNingLinkedList, um mehrere Werte in die Liste einzulegen. Schließlich wird die Liste gedruckt und die Anzahl der Vorkommen der Nummer 8 wird gezählt und unter Verwendung der Countoccurrences- und PrintlinkedList -Funktionen angezeigt.

Wir durchqueren die vollständige Liste nur einmal. Daher ist die zeitliche Komplexität unserer Methode O (n), wobei n die Anzahl der Knoten in der Liste ist.

Ansatz 2: Rekursive Methode

Eine rekursive Methode ist eine Funktion, die sich als Unterroutine bezeichnet. Die Idee hinter der Rekursion besteht darin, ein Problem in kleinere Unterprobleme zu zerlegen, bis es einfach genug wird, um direkt gelöst zu werden. Die rekursive Funktion kombiniert dann die Lösungen mit den Unterproblemen, um die Lösung für das ursprüngliche Problem zu bilden. In der Informatik wird die Rekursion in vielen Algorithmen und Datenstrukturen wie Sortieren und Suchen häufig verwendet, um die Komplexität der Lösung großer Probleme zu verringern, indem sie in kleinere, leichtere Unterprobleme unterteilt werden.

#enthalten
Verwenden von Namespace STD;
Klassenknoten

öffentlich:
int Daten;
Knoten *Weiter;
;
int countoccurrencesRecursive (Knoten *Headnode, int item)
if (headnode == null)
Rückkehr 0;

int count = countoccurrencesRecursive (Headnode-> Weiter, Element);
if (headnode-> data == item)
zählen ++;

Rückgabezahl;

int main ()
Node *headnode = neuer Knoten;
Node *SecondNode = neuer Knoten;
Node *dritterNode = neuer Knoten;
Headnode-> data = 11;
Headnode-> next = SecondNode;
SecondNode-> Data = 12;
SecondNode-> next = dritterNode;
ThirdNode-> Data = 11;
Thirdnode-> next = null;
int target = 11;
int count = countoccurrencesRecursive (Headnode, Ziel);
Cout << "Count of " << target << " is: " << count << endl;
Rückkehr 0;

Ausgang:

Anzahl von 11 ist: 2

Erläuterung:

  1. Die Knotenklasse, die die Mitgliederdaten und als nächstes enthält, wird verwendet, um eine verknüpfte Liste zu definieren.
  2. Ein Verweis auf den Kopf der verknüpften Liste und das zu zählen.
  3. Wenn der Kopf null ist, gibt der Anfangsfall der Rekursion, wodurch er 0 zurückkehrt, 0 zurück 0.
  4. Rekursiv ruft sich die Funktion mit dem aufeinanderfolgenden Knoten der verknüpften Liste auf.
  5. Wenn die Daten des aktuellen Knotens nach dem rekursiven Anruf mit dem Ziel übereinstimmen, wird die Anzahl erhöht.
  6. Die Funktion gibt die Gesamtzahl zurück.
  7. Das Zielelement ist auf 11 gesetzt und eine verknüpfte Liste mit drei Knoten ist in der Hauptfunktion erstellt.
  8. Aufrufen der CountOccurrencesRecursive () mit dem Kopf der verknüpften Liste und des Zielelements als Parameter liefert die Anzahl des Zielelements.

Ansatz 3: Hash -Tabellenmethode

Eine Datenstruktur, die als Hash-Tabelle bezeichnet wird, ermöglicht es, dass die Suchanschläge der durchschnittlichen Case-Tastenwerte in konstanter Zeit o (1) durchgeführt werden, die durchgeführt werden können. Es funktioniert mit einem Schlüssel, um einen Index in ein Array von Slots oder Eimer zu berechnen, aus denen der erforderliche Wert gefunden werden kann. In der Hash-Tabelle speichert.

Eine Hash -Tabelle -Implementierung für C ++ wird durch die nicht ordnungsgemäße Karte der Standard -Vorlagenbibliothek (STL) ermöglicht. Das Speichern und Abrufen von Schlüsselwertpaaren kann schnell und effektiv durchgeführt werden. Mit der folgenden Syntax wird eine nicht ordnungsgemäße_map deklariert:

#enthalten
Under Ordered_map Hash-tabelle;

Wobei „Schlüssel“ die Art der Schlüssel in einer Hash -Tabelle bezeichnet, und der „Wert“ bezeichnet die Art der Werte, die innerhalb des gespeicherten Werte gespeichert sind. Mit dem Square Bracket Operator [] ermöglicht das unbestrahlte_Map das schnelle und effektive Einfügen von Schlüsselwertpaaren, die Löschung und die Suche. Zum Beispiel können Sie Folgendes tun, um einem nicht ordnungsgemäßen Wert ein Schlüsselwertpaar hinzuzufügen:

Hashtable [Schlüssel] = Wert;

Die Berechnung des Hash-Werts und die Platzierung des Schlüsselwertpaar.

#enthalten
#enthalten
Verwenden von Namespace STD;
Klassenknoten

öffentlich:
int Daten;
Knoten *Weiter;
;
int countoccurrenceshash (Knoten *Kopf, int Ziel)
STD :: Under Ordered_map Frequenz;
Knoten *current = Kopf;
während (aktuell != Null)
Frequenz [Strom-> Daten] ++;
Strom = Strom-> Weiter;

Rücklauffrequenz [Ziel];

int main ()
Node *headnode = neuer Knoten;
Node *SecondNode = neuer Knoten;
Node *dritterNode = neuer Knoten;
Headnode-> data = 11;
Headnode-> next = SecondNode;
SecondNode-> Data = 12;
SecondNode-> next = dritterNode;
ThirdNode-> Data = 11;
Thirdnode-> next = null;
int target = 11;
int count = countoccurrenceshash (Headnode, Ziel);
Cout << "Count of " << target << " is: " << count << endl;
Rückkehr 0;

Ausgang:

Anzahl von 11 ist: 2

Erläuterung:
Der Hash -Tabellenansatz zur Zählung der Vorkommen wird durch die Funktion countoccurrencurencencamen () implementiert. Es schafft eine nicht ordnungsgemäße Frequenz und setzt seinen Ausgangszustand auf eine leere Karte. Die Funktion aktualisiert dann die Anzahl der einzelnen Datenwert in der Frequenzkarte, während Sie die verknüpfte Liste iteriert. Die Anzahl des Zielwerts in der Frequenzkarte wird dann zurückgegeben.

Die Funktion deklariert dann einen Zeiger namens "aktuell" und initialisiert ihn in den Kopf der verknüpften Liste. Solange der „Strom“ nicht null ist, wird eine Weile Schleife in die Funktion hinzugefügt. Die Funktion legt die "aktuelle" auf aktuell-> als neben dem nächsten Knoten in der verknüpften Liste fest, nachdem die Anzahl der Strom-> Daten in der Frequenzkarte für jede Iteration der Schleife erhöht wurde.

Die Funktion gibt dann die Anzahl des Zielwerts in der Frequenzkarte zurück, die gleich der Anzahl ist, in der der Zielwert in der verlinkten Liste angezeigt wird, sobald die while -Schleife abgeschlossen ist.

Die Hauptfunktion erstellt drei Knotenobjekte, die jeweils einen Knoten in der verknüpften Liste darstellen. Der erste Knoten wird mit dem Wert 11 zugewiesen, und sein nächster Zeiger wird so eingestellt, dass er auf den zweiten Knoten verweist. In ähnlicher Weise wird der zweite Knoten mit dem Wert 12 zugeordnet, und sein nächster Zeiger wird so eingestellt, dass er auf den dritten Knoten verweist. Der dritte Knoten wird mit dem Wert 11 zugewiesen und sein nächster Zeiger wird auf Null gesetzt, um das Ende der verknüpften Liste anzuzeigen.

Als nächstes werden der Kopf der verknüpften Liste und der Zielwert als Parameter übergeben, wenn die Countoccurrenenceshash () aufgerufen wird, um die Anzahl der Wert 11 abzurufen. Die Ausgabe wird dann in die Konsole gedruckt.

Abschluss

Iterative, Hash -Tabelle und Rekursion sind die drei beliebtesten Möglichkeiten, um die Instanzen eines bestimmten Wertes in einer verknüpften Liste in C zu zählen++. Im iterativen Ansatz wird die verknüpfte Liste herumgeschaltet, und bei jedem Knoten, der den gewünschten Wert enthält, wird eine Zählvariable erhöht. Die Häufigkeit der Elemente in der verknüpften Liste wird als Schlüsselwertpaare unter Verwendung der Hash-Tabellentechnik gespeichert, die eine nicht ordnungsgemäße Kartendatenstruktur verwendet. Die Hash-Tabellenmethode ist für größere verknüpfte Listen geeignet und bietet schnelle Look-up-Geschwindigkeiten. Die Recursion-Methode beinhaltet das Aufrufen einer Funktion auf jedem Knoten in der verlinkten Liste wiederholt, um das Problem in kleinere Unterprobleme zu unterteilen. Wenn das Ende der verknüpften Liste erreicht ist, wird eine Anzahl, die über alle Aufrufe der Funktion gesammelt wird.