Suche in der verketteten Liste - C++

Mein Ziel ist die Erstellung einer Funktion, sucht nach einer Nummer schon in der Liste und drucken, dass es gefunden wurde.

Meine ursprüngliche Idee war, meine entfernen-Funktion, die Suche durch die Liste, bis Sie Sie findet eine Nummer (zu löschen).

Dies schien der logische Weg, um code, der die Suche-Funktion. Wenn dies nicht korrekt ist, wie würde ich es ändern, um die Suche durch die Liste anzuzeigen, dass eine Zahl gefunden wurde?

Ich habe Knoten *Kopf, *aktuell und *temp -, als auch als Knoten-Zeiger nächsten und Anzahl als Datentyp eine Klasse auf .h-Datei.

Danke.

HINWEIS - ich habe mir die entfernen () - Funktion unter der suchen() Funktion.

#include <iostream>                                                 
#include <string>                                                   
#include <fstream>                                                  
#include "LinkedList.h"

using namespace SDI;

int main()
{
    LinkedList menu;

    menu.insert(5);                     
    menu.insert(4);
    menu.insert(2);
    menu.insert(3);
    menu.insert(8);
    menu.remove(4);
    menu.reverse();
    menu.display();
    menu.search(2);
    system("pause");

};


LinkedList::LinkedList()            
{
    head = NULL;
    current = NULL;
    temp = NULL;
};


LinkedList::~LinkedList()           
{

};


void LinkedList::insert(int add)                                    //insert function, data is stored in add from function body
{
    Node* newnode = new Node;                                       //definition of add node, make new node and make node* point to it
    newnode->next = NULL;                                           //point and set up to last node in the list (nothing)
    newnode->number = add;                                          //adds data to list

    if (head != NULL)                                               //if head is pointing to object then we have list
    {
        current = head;                                             //make current pointer point to head
        while (current->next != NULL)                               //check to see if end at list, is it the last node?
        {
            current = current->next;                                //advances current pointer to end of list
        }
        current->next = newnode;                                    //adds new node next to value already stored
    }
    else
    {
        head = newnode;                                             //if we don't have element in list
    }
};


void LinkedList::remove(int remove)                                 //remove function, data is stored in remove from function body
{
    Node* remove1 = NULL;                                           //searches through for same value in remove and deletes
    temp = head;
    current = head;
    while (current != NULL && current->number != remove)            //check if current node is one we want to delete...if not advance current pointer to next one
    {
        temp = current;                                             //keep temp pointer one step behind
        current = current->next;                                    //advance to next node, traverse list till at the end
    }
    if (current == NULL)                                            //pass through whole list and value not found
    {
        std::cout << "N/A\n";
        delete remove1;                                             //removes spare number floating around in memory
    }
    else
    {
        remove1 = current;                                          //pointing to value we want to delete
        current = current->next;                                    //advances current pointer to next node
        temp->next = current;                                       //stops hole that occurs in list, patches this up
        if (remove1 == head)                                        //if pointer is pointing to front of list
        {
            head = head->next;                                      //advance the head to next
            temp = NULL;
        }

        delete remove1;
    }
};


void LinkedList::search(int searchNum)
{
    Node* searchnumber = nullptr;
    temp = head;
    current = head;

    while (current != NULL && current->number != searchNum)
    {
        temp = current;
        current = current->next;
    }
    if (current != NULL)
    {
        searchnumber = current;
        current = current->next;
        std::cout << "-" << searchnumber << " Found";
    }
    else
    {
        std::cout << "N/A";
    }
};


void LinkedList::display()
{
    current = head;                                                 //point to start of list

    while (current != NULL)                                         //while it points to something in list
    {
        std::cout << current->number;                               //display list starting from start
        current = current->next;                                    //advance to next pointer
    }
};


void LinkedList::reverse()
{
    Node *new_head = nullptr;                                       //create new head as we want it to start from last element

    for (current = head; current;)                                  //same as display, ask it to go through list from head then outside loop assign to new head and switch sides
    {
        temp = current;                                             //keep temp pointer one step behind
        current = current->next;                                    //goes through each element in the list
        temp->next = new_head;                                      //scrolls through backwards from new head
        new_head = temp;                                            
    }

    head = new_head;                                                //assign head to new head
};
  • Was ist die Frage?
  • Wenn ich geschrieben habe, meine Suche-Funktion richtig zu machen, was ich will, es zu tun
  • Sie können einfach durch die Liste und suchen Sie nach dem element. Worst-case-Szenario, das ist O(n)... nicht sehr effizient. Vielleicht schauen Sie in die Implementierung einer binären Suche Baum, statt (auf der Suche schlimmsten Fall O(ln(n))).
  • dann warum nicht Sie es testen anstatt zu Fragen, uns?
  • Ich wollte wissen, ob es eine effizientere Art und Weise zu tun, eine Suche, anstatt nach den gleichen Pfad wie die entfernen-Funktion
  • Aber wie kann man binäre Suche eine Link-Liste?
  • Sie könnten es bauen nach oben... eine Art hybrid-linked-Liste und BST. Sie müssen Zeiger auf (zwei) Kinder, die für jedes element der verketteten Liste. Für die Implementierung einer binären Suche Baum, entweder google (Sie sind sehr Häufig) oder schauen Sie auf etwas wie "Einführung in Algorithmen" von Cormen, Leiserson, Rivest, Stein. Die Idee ist, Sie haben eine "kleinere" Kind und einem "größeren" Kind. Vergleichen Sie das element auf den aktuellen Knoten. Wenn es das ist, was du bist suchen für erledigt. Sonst verschieben Sie entweder das größere oder kleinere Kind (je nachdem, ob das element größer oder kleiner).
  • In einer perfekten, optimalen Fall, die Hälfte aller restlichen Elemente sind unter dem kleineren Kind (auf jeder Ebene), die andere Hälfte ist unter dem größeren Kind (auf jeder Ebene). Dies ist eine ausgewogene binären Suchbaum. Wenn Sie Euch keine Gedanken im Vorfeld beim Aufbau der Struktur wird wahrscheinlich eine schiefe Baum, der nicht so effizient zu suchen. Wenn Sie übermäßig besorgt über diese, look up "rot-schwarzen" Bäumen.

InformationsquelleAutor Ryan | 2014-12-23
Schreibe einen Kommentar