Einfach verkettete liste



  • Hallo!
    Aufgabe ist es "Bauteile" vom Typ struct zu erstellen und mittels einer einfach verketteten Liste zu sortieren.
    Vom Compiler erhalte ich keine Fehlermeldung. Zu Testzwecken möchte ich durch eine while Schleife erst einmal nur 3 Elemente erzeugen. Bei der Eingabe des zweiten Elements passiert dann allerdings nichts mehr...Wo liegt der/die Fehler?

    #include <iostream>
    using namespace std;

    struct Bauteil
    {
    char name[10];
    char lieferant[10];
    double preis;
    int anzahl;
    Bauteil next;
    };
    Bauteil
    erstellen()
    {
    Bauteil* neu=new Bauteil;
    cout << "Name: ";
    cin >> neu->name;
    cout << "Lieferant: ";
    cin >> neu->lieferant;
    cout << "Preis: ";
    cin >> neu->preis;
    cout << "Anzahl: ";
    cin >> neu->anzahl;
    neu->next=0;
    return neu;
    }
    Bauteil* einfuegen(Bauteil* root, Bauteil* neu)
    {
    Bauteil* tail=root;
    if(root==0) root=neu;//Leere Liste,Anfang wir auf neu gesetzt
    else if(neu->name<=root->name)//Wenn Element vor erstem Element eingefuegt werden muss
    {
    //Anfang der Liste wird auf das neue Element gesetzt
    neu->next=tail;
    root=neu;
    }
    else
    {
    //Wenn Element am Ende oder in der Mitte der Liste eingefuegt werden soll
    while(tail!=0)//
    {
    if(neu->name<=tail->next->name)
    {
    neu->next=tail->next;
    tail->next=neu;
    }
    else if(tail->next==0)
    {
    neu->next=tail->next;
    tail->next=neu;
    }
    tail=tail->next;
    }
    }
    return root;
    }
    void ausgeben(Bauteil* root)
    {
    Bauteil* tail=root;
    cout << "Bauteil\tLieferant\tPreis\tAnzahl\n";
    if(tail==0) cout << "Keine Bauteile in der Liste vorhanden\n";
    else
    while(tail!=0)
    {
    cout << tail->name << "\t" << tail->lieferant << "\t\t"
    << tail->preis<< "\t" << tail->anzahl << endl;
    tail=tail->next;
    }
    }
    int main()
    {
    Bauteil* root=0;//Leere Liste
    Bauteil* neu;
    int i=3;
    while(i>0)//3 neue Elemente erzeugen
    {
    neu=erstellen();
    root=einfuegen(root,neu);
    i--;
    }
    ausgeben(root);
    system("Pause");
    }



  • 1. Bitte Code einrücken
    2. Bitte cpp-Tags benutzen
    3. Genaue Fehlerbeschreibung. resp. Was du denkst, dass gemacht werden sollte und es nicht getan wird.

    #include <iostream>
    using namespace std;
    
    struct Bauteil
    {
    	char name[10];
    	char lieferant[10];
    	double preis;
    	int anzahl;
    	Bauteil *next;
    };
    Bauteil* erstellen()
    {
    	Bauteil* neu=new Bauteil;
    	cout << "Name: ";
    	cin >> neu->name;
    	cout << "Lieferant: ";
    	cin >> neu->lieferant;
    	cout << "Preis: ";
    	cin >> neu->preis;
    	cout << "Anzahl: ";
    	cin >> neu->anzahl;
    	neu->next=0;
    	return neu;
    }
    Bauteil* einfuegen(Bauteil* root, Bauteil* neu)
    {
    	Bauteil* tail=root;
    	if(root==0) root=neu;//Leere Liste,Anfang wir auf neu gesetzt
    	else if(neu->name<=root->name)//Wenn Element vor erstem Element eingefuegt werden muss
    	{
    		//Anfang der Liste wird auf das neue Element gesetzt
    		neu->next=tail;
    		root=neu;
    	}
    	else
    	{
    		//Wenn Element am Ende oder in der Mitte der Liste eingefuegt werden soll
    		while(tail!=0)//
    		{
    			if(neu->name<=tail->next->name)
    			{
    				neu->next=tail->next;
    				tail->next=neu;
    			}
    			else if(tail->next==0)
    			{
    				neu->next=tail->next;
    				tail->next=neu;
    			}
    			tail=tail->next;
    		}
    	}
    	return root;
    }
    void ausgeben(Bauteil* root)
    {
    	Bauteil* tail=root;
    	cout << "Bauteil\tLieferant\tPreis\tAnzahl\n";
    	if(tail==0) cout << "Keine Bauteile in der Liste vorhanden\n";
    	else
    	while(tail!=0)
    	{
    		cout << tail->name << "\t" << tail->lieferant << "\t\t"
    		<< tail->preis<< "\t" << tail->anzahl << endl;
    		tail=tail->next;
    	}
    }
    int main()
    {
    Bauteil* root=0;//Leere Liste
    Bauteil* neu;
    int i=3;
    while(i>0)//3 neue Elemente erzeugen
    {
    	neu=erstellen();
    	root=einfuegen(root,neu);
    	i--;
    }
    ausgeben(root);
    system("Pause");
    }
    


  • Nico86 schrieb:

    Bei der Eingabe des zweiten Elements passiert dann allerdings nichts mehr...Wo liegt der/die Fehler?

    Eine bitte: Verwende die cpp-Tags und wähle zudem eine sinnvolle Einrückung (Tabulatoren sind nicht Forengeeignet 😉 ). Das erhöht die Wahrscheinlichkeit das du antworten erhälst.

    Umformatiert (Ohne Kommentar):
    ...snip da zu spät...

    Naja, dann Kommentiere ich mal ein paar Sachen:
    a) Sorry für die Frage: Aber bist du C-Vorgeschädigt? 😉
    => char[10] statt std::string...
    b) An sich ist das schlechtes Design wenn die Erzeugung (new) und das löschen (delete) getrennt wird; Ich nehme aber mal an das wir darauf erst eingehen sollten wenn du auch Klassen kennst...
    c) Wo wird der Speicher freigegeben (delete?)...

    #include <iostream>
    #include <string> // Damit machst du dir das Leben leichter
    using namespace std;
    
    struct Bauteil
    {
        string name; // std::string sind Anfängerfreundlicher ;)
        string lieferant;
        double preis;
        int anzahl;
        Bauteil *next;
    };
    
    // ... Dies konnte mit einem char-Array garnicht (sinnvoll) funktionieren
    else if(neu->name <= root->name)
    // ...
    int main()
    {
        Bauteil* root=0;
        // for-Schleife währe hier IMHO verständlicher
        for(int i=0; i<3; ++i)
        {
            root=einfuegen(root, erstellen());
        }
        ausgeben(root);
        system("Pause"); // Kein Freund hiervon, aber ignoriere den Kommentar erstmal
    }
    


  • Entschuldigung für das nicht korrekte Einfügen des Quellcodes, bin leider noch nicht so vertrat mit diesem Forum.
    Was ich denke, was gemacht werden sollte aber nicht gemacht wird?
    In der while Schleife, soll durch neu=erstellen() ein neues Objekt erstellt werden, dann durch root=einfuegen(root,neu) an die richtige Stelle einsortiert werden. Zu der Eingabe des dritten Elements kommt es an dieser Stelle dann erst gar nicht, nach Eingabe des zweiten Elements passiert nichts weiter.



  • Nico86 schrieb:

    Entschuldigung für das nicht korrekte Einfügen des Quellcodes, bin leider noch nicht so vertrat mit diesem Forum.
    Was ich denke, was gemacht werden sollte aber nicht gemacht wird?
    In der while Schleife, soll durch neu=erstellen() ein neues Objekt erstellt werden, dann durch root=einfuegen(root,neu) an die richtige Stelle einsortiert werden. Zu der Eingabe des dritten Elements kommt es an dieser Stelle dann erst gar nicht, nach Eingabe des zweiten Elements passiert nichts weiter.

    Dann geh da mal mit dem Debugger drüber. Schön Schritt für Schritt.



  • Bin nicht C vorgeschädigt, sondern ein allgmein ein C++ Neuling^^.
    Habe deine Änderungen übernommen.
    Der Fehler muss in der einfuegen Funktion liegen. Wenn der Name des ersten Elements z.B. mit Z beginnt, der des zweiten Elements mit k und des dritten elements mit a, dann funktioniert alles wunderbar. also ist wohl etwas falsch, wenn ich versuche das Element in der Mitte oder am Ende einzusortieren.



  • Nico86 schrieb:

    Bin nicht C vorgeschädigt, sondern ein allgmein ein C++ Neuling^^.
    Habe deine Änderungen übernommen.
    Der Fehler muss in der einfuegen Funktion liegen. Wenn der Name des ersten Elements z.B. mit Z beginnt, der des zweiten Elements mit k und des dritten elements mit a, dann funktioniert alles wunderbar. also ist wohl etwas falsch, wenn ich versuche das Element in der Mitte oder am Ende einzusortieren.

    Du kannst Arrays eh nicht so vergleichen.

    Nimm lieber std::string, wenn du eine Zeichenkette hast.

    char a[] = "a";
    	char b[] = "b";
    
    	if (a > b )
    		std::cout << "a ist groesser" << std::endl;
    	else
    		std::cout << "b ist groesser" << std::endl;
    
    	std::string c = "a";
    	std::string d = "b";
    
    	if (c > d )
    		std::cout << "c ist groesser" << std::endl;
    	else
    		std::cout << "d ist groesser" << std::endl;
    

    Kannst ja mal schauen, was das gibt..



  • Also es läuft irgendwie immer noch nicht.
    Ist denn logisch gesehen irgendwas an der einfuegen Funktion falsch?



  • Poste bitte noch einmal die Funktion so, wie sie bei dir jetzt aussieht. Dann müssen wir uns nämlich weder die Bruchstücke und Änderungsvorschläge aus den einzelnen Antworten zusammenkramen noch spekulieren, was du von denen auch tatsächlich berücksichtigt hast 😉



  • Nico86 schrieb:

    Also es läuft irgendwie immer noch nicht.
    Ist denn logisch gesehen irgendwas an der einfuegen Funktion falsch?

    Das ist schwer zu sagen, weil das ziemliches gewurscht ist. 😉

    1. Sollte eine Liste nichts über ihren Inhalt wissen müssen.
    2. Machst du bei der Einfügen Funktion bereits eine sortierung, was in erster Linie gar nicht die Aufgabe dieser Funktion ist und daher dort schonmal gar nichts zu suchen hat. Du solltest da lieber ein Beispiel an der STL, oder, wenn dir das zu kompliziert ist, dann kannst du ja mal hier im Forum suchen. Gibt einen Haufen Einträge zu Listen.

    Probier einfach jede Funktion so trivial, wie möglich zu halten, so das sie nur das tut, was sie sollte.
    Mach zuerst mal nur, dass die Liste vorne oder hinten einfügt, und erst dann, wenn das funktioniert, kannst du dir Gedanken machen, wie du Wohl eine Funktion schreiben kannst, die dir die Liste auch sortiert, oder ein Element an einer anderen Stelle einfügt.


Anmelden zum Antworten