Singly linked list linear search Algorithmus -> equivalent?



  • Hallo,

    ich schaue mir gerade unsere Programmier-Folien für die Vorlesung an. Folgendes ist gegeben:

    NodePtr search(NodePtr head, int target)
    {
        NodePtr here = head;
    
        if (here == NULL)
        {
            return NULL;
        }
        else
        {
            while (here->data != target && here->link != NULL)
            {
                here = here->link;
            }
            if (here->data == target)
            {
                return here;
            }
            else
            {
                return NULL;
            }
        }
    }
    

    Ich meine, wenn schon C in C++, dann aber so:

    NodePtr search(NodePtr head, int target)
    {
        for ( ; head; head = head->link)
        {
            if (head->data == target)
            {
                return head;
            }
        }
        return nullptr;
    }
    

    Die Lösung ist doch mindestens genau so gut, oder? Meine Argumente: Die Kopie eines Pointers nochmal kopieren ist Schwachsinn. Es wird der Sonderfall head=nullptr elegant gehandhabt. Es wird ebenfalls frühst-möglich die Suche beendet.


  • Mod

    Du solltest den Kurs geben.



  • Ganz so weit würde ich nicht gehen, aber ich leite daraus mal ab, dass die Umformung gut ist.

    LG



  • Hallo,

    HarteWare schrieb:

    ich schaue mir gerade unsere Programmier-Folien für die Vorlesung an. Folgendes ist gegeben:

    NodePtr search(NodePtr head, int target)
    { // ... Puh!
    

    Wechsle den Dozenten.

    HarteWare schrieb:

    Ich meine, wenn schon C in C++, dann aber so:

    NodePtr search(NodePtr head, int target)
    {
        for ( ; head; head = head->link)
        {
            if (head->data == target)
            {
                return head;
            }
        }
        return nullptr;
    }
    

    Die Lösung ist doch mindestens genau so gut, oder?

    Die Lösung ist deutlich besser.

    Du kannst aber noch einen drauf setzen:

    NodePtr search( NodePtr head, int target )
    {
        for( ; head && head->data != target; head = head->link )
            ;
        return head;
    }
    

    Gruß
    Werner



  • stimmt wäre noch kürzer 🙂 Vielen Dank für eure Antworten!



  • Da würde ich aber den Code eher so schreiben:

    NodePtr search( NodePtr head, int target )
    {
        while(head && head->data != target)
            head = head->link;
    
        return head;
    }
    

    Ist m.E. lesbarer und verständlicher.


Anmelden zum Antworten