Verkettete Liste



  • Hallo,

    ich habe zwei Eingaben, in der einen soll der Wert eingegeben werden, der eingefügt werden soll, bei der zweiten Eingabe soll abgefragt werden, vor welchem Wert der eingegebene Wert platziert sein soll. (Funktion einfügen)

    Leider funktioniert das in der Funktion einfuegen nicht.. Kann mir jemand helfen?

    #include <iostream> 
    using namespace std; 
    
    struct TListenKnoten { int data;     TListenKnoten *next; };
    
    void hinten_anfuegen(TListenKnoten* &anker, int wert) { 
    	TListenKnoten *neuer_eintrag = new TListenKnoten;  
    	neuer_eintrag->data = wert;  
    	neuer_eintrag->next = nullptr;
    	if (anker == nullptr)
    		anker = neuer_eintrag;
    	else { 
    		TListenKnoten *ptr = anker;
    		while (ptr->next != nullptr)
    			ptr = ptr->next;
    			ptr->next = neuer_eintrag; 
    	} 
    }
    void liste_ausgeben_rueckwaerts(TListenKnoten* anker) {
    
    	if (anker->next != NULL)
    
    		liste_ausgeben_rueckwaerts(anker->next);
    	if (anker->next != NULL) {
    		cout << ", ";
    	}
    	cout << anker->data;
    }
    void einfuegen(TListenKnoten* &anker, int wert_neu, int vor_wert) {
    
    	for (int i = 0; i < 12; i++) {
    
    		while (anker->next != NULL && anker->next->data < vor_wert) {
    
    			anker = anker->next;
    
    		}
    
    	}
    	hinten_anfuegen(anker, wert_neu);
    }
    void liste_ausgeben(TListenKnoten * anker) { 
    	if (anker == nullptr)   
    		cout << "Leere Liste." << endl; 
    	else { 
    		cout << "[ ";   TListenKnoten *ptr = anker;   
    
    		do { 
    			cout << ptr->data; 
    			if (ptr->next != nullptr) 
    				cout << " , "; 
    			else
    				cout << " ";    ptr = ptr->next;
    
    		} 
    
    		while (ptr != nullptr);
    		cout << "]" << endl; 
    	} 
    }
    
    int main() {
    	int laenge = 10;
    TListenKnoten *anker = nullptr;
    for (int i = 0; i < laenge; i++) {
    	hinten_anfuegen(anker, i*i);
    }
    liste_ausgeben(anker);
    
    int wert_neu, vor_wert;
    cout << "Einzufuegender Wert: ";
    cin >> wert_neu;
    cout << "Vor welchem Wert? ";
    
    cin >> vor_wert;
    einfuegen(anker, wert_neu, vor_wert);
    liste_ausgeben(anker);
    system("PAUSE");
    return 0;
    }
    


  • Deine Formatierung ist furchtbar, clang-format oder ähnliche Tools wirken Wunder.

    Dein einfuegen ist falsch:
    1. nutzlose Schleife über i - wofür soll die gut sein?
    2. Da du anker per Referenz übergibst, änderst du den Anker beim Suchen nach der Einfügeposition. Du musst die Position mit einer Kopie suchen, damit du nicht Elemente vom Anfang löscht.
    3. Am Ende in einfuegen rufst du dann hinten_anfuegen auf. Kein Wunder, dass dann - unabhängig von der vorherigen Suche - das neue Element immer hinten landet. Du musst es an der gefundenen Stelle einfügen!



  • Wird leider hinten angestellt die Zahl und nicht vor die gewünschte Zahl.

    void einfuegen(TListenKnoten* &anker, int wert_neu, int vor_wert) {
    
    	TListenKnoten *ptr = anker;
    	while (ptr->next != NULL && ptr->next->data < vor_wert) {
    
    		ptr = ptr->next;
    
    	}
    	hinten_anfuegen(ptr->next, wert_neu);
    }
    

Anmelden zum Antworten