Linked list



  • Hallo miteinander!

    Ich habe eine Such-Methode in einer Linked List implementiert:

    task_node*
    task_list::search_by_id(int id_)
    {
    	if(task_node *n = 0)
    	{
    		return 0;
    	}
    
    	else if(n->get_id() == id_)
    	{
    		return n;
    	}
    
    	else
    	{
    		return search_by_id(++id_);
    	}
    }
    

    Allerdings stürzt das Programm ab, wenn ich etwas per id_ suchen will.
    Wieso? Was ist falsch? Und: Wie wäre es korrekt?

    Liebe Grüsse, Max



  • Nur geraten:

    task_node*
    task_list::search_by_id(task_nose* n, int id_)
    {
    	if(n == 0)
    	{
    		return 0;
    	}
    
    	else if(n->get_id() == id_)
    	{
    		return n;
    	}
    
    	else
    	{
    		return search_by_id(m->next,id);
    	}
    }
    

    Wie genau es wäre, hängt davon ab, wie der Rest der Liste gebaut wurde. Das haste nicht erzählt.



  • Mhh...auch nur ne Vermutung, wann stürzt es denn ab, wenn du ne ID eingibst die es gibt oder is es nur wenn du eine eingibst die es nicht gibt...?

    Lg freeG



  • Okey. Hab das korrigiert.
    Aber schaut euch bitte mal den folgenden Code an:

    bool
    task_list::delete_by_id(task_node *n, int id_)
    {
    	task_node *prev, *curr;
    	int i = 0;
    
    	if(n = NULL)
    	{
    		return false;
    	}
    	else
    	{
    		if(id_ > n->get_id()) 
    		{
    			return false;
    		}
    		else
    		{
    			prev = NULL;
    			curr = n;
    			i = 1;
    			while(i < id_)
    			{
    				prev = curr;
    				curr = *curr->get_next_node();
    				i = i+1;
    			}
    			if(prev=NULL)
    			{
    				n = *curr->get_next_node();
    				free(curr);
    			}
    			else
    			{
    				*prev->get_next_node() = *curr->get_next_node();
    				free(curr);
    			}
    		}
    	}
    	return true;
    }
    

    Mein Compiler sagt: Funktion akzeptiert keine 1 Argumente

    What the... Was ist falsch, wieso und wie wäre es richtig?



  • Über welche Funktion beschwert er sich denn?

    (btw, was gibt eigentlich die get_next_node()-Methode zurück? So, wie du die hier verwendest, sieht es ein wenig seltsam aus.)



  • MaxC++ schrieb:

    Mein Compiler sagt: Funktion akzeptiert keine 1 Argumente

    What the... Was ist falsch, wieso und wie wäre es richtig?

    Der sagt bestimmt auch, in welcher Zeile der Fehler ist ...

    Und warum benutzt du free in C++?



  • Ahh..danke, wegen dem Hinweis mit der get_next_node 😉
    Hab den Fehler dort gefunden 🙂

    ..wegen dem free: Darf / Soll man das nicht verwenden?



  • MarcC++ schrieb:

    Ahh..danke, wegen dem Hinweis mit der get_next_node 😉
    Hab den Fehler dort gefunden 🙂

    ..wegen dem free: Darf / Soll man das nicht verwenden?

    Man verwendet normalerweise 'delete' in C++. Meistens ist RAII jedoch noch besser.



  • Sagen wir es so: Es ist nicht üblich 😉

    malloc()/free() stammt noch aus C und hat den großen Nachteil, daß es sich nicht um Konstruktoren bzw. Destruktoren der beteiligten C++ Objekte kümmert. Deshwegen verwendet man in C++ lieber new und delete für die Speicherverwaltung.



  • icarus2 schrieb:

    MarcC++ schrieb:

    Ahh..danke, wegen dem Hinweis mit der get_next_node 😉
    Hab den Fehler dort gefunden 🙂

    ..wegen dem free: Darf / Soll man das nicht verwenden?

    Man verwendet normalerweise 'delete' in C++. Meistens ist RAII jedoch noch besser.

    RAII? komisches buzzword 🙄



  • _-- schrieb:

    icarus2 schrieb:

    MarcC++ schrieb:

    Ahh..danke, wegen dem Hinweis mit der get_next_node 😉
    Hab den Fehler dort gefunden 🙂

    ..wegen dem free: Darf / Soll man das nicht verwenden?

    Man verwendet normalerweise 'delete' in C++. Meistens ist RAII jedoch noch besser.

    RAII? komisches buzzword 🙄

    Resource Acquisition Is Initialization. RAII ist dafür die Standardabkürzung 😉



  • _-- schrieb:

    RAII? komisches buzzword 🙄

    SFINAE 😃



  • MaxC++ schrieb:

    Okey. Hab das korrigiert.
    Aber schaut euch bitte mal den folgenden Code an:

    // dein code
    

    Vielleicht solltest du dir angewöhnen das VERGLEICHE AUF GLEICHHEIT mit == passieren und ZUWEISUNGEN mit =. Das passiert dir DREI mal, und das korrigierte Beispiel hast du (so siehts für mich aus) einfach Übernommen ohne es mit dem von dir geposteten zu vergleichen - dann hätte dir das Auffallen können.


Anmelden zum Antworten