Datensätze mit Hilfe von Listen speichern



  • Eddy131 schrieb:

    Werner Salomon schrieb:

    Kopieren und Zuweisen habe ich stillgelegt (Zeile 47,48) .. machen wir vielleicht später.

    Zeile 47 ist leer und in 48 steht "private:"? In den Zeilen vertan oder versteh ich's nicht..?

    Ich hatte später noch zwei Zeilen Kommentar hinzugefügt. Gemeint sind die Zeilen 49 und 50.
    push - pop ist korrigiert.

    Gruß
    Werner



  • Eddy131 schrieb:

    Was habt ihr gegen pop_front?? 😕

    Pushen und Poppen sind zwei feste Begriffe. Ersteres fügt Elemente hinzu, letzteres entfernt Elemente.



  • Werner Salomon schrieb:

    Eddy131 schrieb:

    Hab's jetzt bei Visual Studio reinkopiert und erstmal ggetestet.

    Kommt gleich ne Fehlermeldung.. 😞

    (26): error C4716: 'deleteList': Muss einen Wert zurückgeben

    Hallo Eddy131

    statt

    tNode * deleteList (tNode * node) {
    

    darf es ruhig

    void deleteList (tNode * node) {
    

    heißen

    😮 Stimmt ja.



  • Eddy131 schrieb:

    P.S.
    Falls wer Lust hat, hätte ich nichts dagegen, wenn jemand das Programm in der mir gewohnten schreibweise verfassen würde^^

    1.) was meinst Du damit genau?
    2.) Wenn das das ist, was phyax, ich und sicher auch andere als 'C' betrachten, ist das dann auch sinnvoll?

    Denk' mal d'rüber nach

    Gruß
    Werner



  • C++ wollt ich schon. Mit C kenn ich mich nur insofern aus, das ich weiß das daraus C++ entstand.

    Ich meint damit mehr die Form vom oben vorstellen und nach der main- die anderen Funktionen.
    Das letzte von dir geschriebene Programm (Werner Salomon) reicht mir schon völlig, aber es kommt noch der Fehler:

    "fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden."

    mit dem ich nichts anfangen kann. Zumindest blieben meine Korrekturversuche Fruchtlos.
    Es ist doch in C++, oder?
    Was sagt mir die Fehlermeldung?
    Also auf welche Art könnte ich ihn beheben?

    @Michael E.: Hätt ich mir denken können... Danke für die Info 👍
    Wird gespeichert.



  • Eddy131 schrieb:

    Ich meint damit mehr die Form vom oben vorstellen und nach der main- die anderen Funktionen.

    Hallo Eddy131,

    das wäre kein Problem.

    Eddy131 schrieb:

    ... aber es kommt noch der Fehler:

    "fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden."

    ich vermute, dass in Deinem Projekt mehr als eine cpp-Datei enthalten ist, in dem sich eine main-Funktion befindet. Entferne die Dateien, bis auf die eine, die Du übersetzen willst, aus dem Projekt.
    In der Fehlermeldung "error LNK2005: <Symbol> ist bereits in <Objekt> definiert" steht der Name des 'mehrfach definiertes Symbols'. Hier wäre das 'main'.

    Gruß
    Werner



  • Werner Salomon schrieb:

    ich vermute, dass in Deinem Projekt mehr als eine cpp-Datei enthalten ist, in dem sich eine main-Funktion befindet. Entferne die Dateien, bis auf die eine, die Du übersetzen willst, aus dem Projekt.
    In der Fehlermeldung "error LNK2005: <Symbol> ist bereits in <Objekt> definiert" steht der Name des 'mehrfach definiertes Symbols'. Hier wäre das 'main'.

    Jou, das war's!

    Hatte die verschiedenen Variationen von hier jeweils nebeneinander gespeichert. Dachte, das immer nur die oberste cpp Datei gedebugged wird 🙄

    Man lernt echt nie aus.

    So, jetzt arbeite ich mich mal da durch und versuch es zu verinnerlichen.

    thanks so far 👍



  • struct Liste
    {
        Liste() : pRoot(0) {}
        ~Liste() { clear(); }
    
        void clear()
        {
            for( tListe* p = pRoot; p; )
            {
                tListe* tmp = p;
                p = p->pNext;
                delete tmp;
            }
        }
    
        // -- füge am Anfang der Liste ein Element ein
        void push_front( const tListe& data )
        {
            tListe* p = new tListe( data );
            p->pNext = pRoot;
            pRoot = p;
        }
    
        // -- gebe alle Elemente auf 'out' aus
        void ausgabe( std::ostream& out )
        {
            for( tListe* p = pRoot; p; p = p->pNext )
                out << *p << "\n";
        }
    
    private:
        Liste( const Liste& );
        Liste& operator=( const Liste& );
    
        tListe* pRoot;
    };
    

    Kann man die Funktionen der zweiten struct auch auslagern, also für push_front, ausgabe und so jeweils eine eigene Funktion?

    Und das am Ende mit "private:" kenn und versteh ich nicht. Kann man das irgendwie noch anders bewerkstelligen? bzw. was macht der part genau?



  • Eddy131 schrieb:

    Kann man die Funktionen der zweiten struct auch auslagern, also für push_front, ausgabe und so jeweils eine eigene Funktion?

    Ja:

    // folgendes könnte auch in H-File 'Liste.h' - inklusive tListe
    struct Liste
    {
        Liste();
        ~Liste();
    
        void clear();
    
        // -- füge am Anfang der Liste ein Element ein
        void push_front( const tListe& data );
    
        // -- gebe alle Elemente auf 'out' aus
        void ausgabe( std::ostream& out );
    
    private:
        Liste( const Liste& );
        Liste& operator=( const Liste& );
    
        tListe* pRoot;
    }; 
    
    // hier käme z.B. die main-Funktion
    
    // .. nach main() oder so
    Liste::Liste() 
        : pRoot(0) 
    {}
    Liste::~Liste() 
    { 
        clear(); 
    }
    
    void Liste::clear()
    {
        for( tListe* p = pRoot; p; )
        {
            tListe* tmp = p;
            p = p->pNext;
            delete tmp;
        }
    }
    
    void Liste::push_front( const tListe& data )
    {
        tListe* p = new tListe( data );
        p->pNext = pRoot;
        pRoot = p;
    }
    
    void Liste::ausgabe( std::ostream& out )
    {
        for( tListe* p = pRoot; p; p = p->pNext )
            out << *p << "\n";
    }
    

    Gruß
    Werner



  • Hier jetzt das fertige Programm:

    #include <iostream>
    #include <string>
    #include <iomanip>
    #include <conio.h>
    
    using namespace std;
    
    struct tListe
    {
    	int matrNr;
    	string vName;
    	string fName;
    	tListe *pNext;
    };
    
    void einfuegen(tListe &hp);
    void ausgabe();
    void sortMatrikel();
    void sortVName();
    void sortFName();
    void sucheM(int zahl);
    void sucheV(string name);
    void sucheF(string name);
    
    tListe *pRoot = 0;
    
    int main ()
    {
    	tListe hp;
    	int zahl;
    	string wort;
    
    	while (true)
    	{
            cout << "Was wollen Sie tun?\n\n";
            cout << "Einfuegen von neuen Datensaetzen  [E/e]\n";
            cout << "Sortieren                         [R/r]\n";
            cout << "Suchen nach bestimmten Datensatz  [S/s]\n";
            cout << "Ausgabe der Datensaetze           [A/a]\n";
            cout << "Programm beenden                  [B/b]\n\n";
    
            switch (tolower(_getch()))
            {
            case 'e':
                system ("cls");
                cout << "Bitte geben Sie die entsprechenden Daten ein:\n\n";
    
    			cout << "\t\tMatrikelnummer:\n\t\t";
    			cin >> hp.matrNr;
                cout << "\t\tFamilienname:\n\t\t";
                cin >> hp.fName;
                cout << "\t\tVorname:\n\t\t";
                cin >> hp.vName;
    			einfuegen(hp);
    			break;
    
    		case 'r':
    			system ("cls");
    
    			cout << "Wonach wollen Sie sortieren?\n\n";
    			cout << "Matrikelnummer  [M/m]\n";
    			cout << "Vorname         [V/v]\n";
    			cout << "Familienname    [F/f]\n\n";
    
    			switch (tolower(_getch()))
    			{
    			case 'm':
    				sortMatrikel();
    				break;
    
    			case 'v':
    				sortVName();
    				break;
    
    			case 'f':
    				sortFName();
    				break;
    			}
    
    			ausgabe();
    			break;
    
    		case 's':
    			system ("cls");
    
    			cout << "Wonach wollen Sie suchen?\n\n";
    			cout << "Matrikelnummer  [M/m]\n";
    			cout << "Vorname         [V/v]\n";
    			cout << "Familienname    [F/f]\n\n";
    
    			switch (tolower(_getch()))
    			{
    			case 'm':
    				system ("cls");
    				cout << "Nach welcher Matrikelnummer soll gesucht werden?\n\n\t";
    				cin >> zahl;
    
    				sucheM(zahl);
    				break;
    
    			case 'v':
    				system ("cls");
    				cout << "Nach welchem Vornamen soll gesucht werden?\n\n\t";
    				cin >> wort;
    
    				sucheV(wort);
    				break;
    
    			case 'f':
    				system ("cls");
    				cout << "Nach welchem Familiennamen soll gesucht werden?\n\n\t";
    				cin >> wort;
    
    				sucheF(wort);
    				break;
    			}
    			break;
    
    		case 'a':
    			system ("cls");
    
                ausgabe();
    
    			cout << "\n\n";
                break;
    
            case 'b':
                return 0;
    		}
    	}
    }
    
    void einfuegen(tListe &hp)
    {
    	tListe* p = new tListe(hp);
        p ->pNext = pRoot;
        pRoot = p;
    }
    
    void ausgabe()
    {
    	int i = 1;
    
    	for(tListe *p = pRoot; p; p = p->pNext)
    	{
    		cout << "\n" << i;
    		cout << "\t" << p ->vName << " " << p ->fName << "\n\tMatr.#: " << p ->matrNr << "\n";
    
    		i++;
    	}
    }
    
    void sortMatrikel()
    {
    	tListe *hp1, *hp2;
    
    	for (tListe *p = pRoot; p; p = p->pNext)
    	{
    		hp1 = pRoot ->pNext;
    		hp2 = pRoot;
    
    		while (hp1)
    		{
    			if ((hp1 ->matrNr) < (hp2 ->matrNr))
    			{
    				swap (hp1, hp2);
    			}
    
    			hp2 = hp1;
    			hp1 = hp1->pNext; 
    		}
    	}
    }
    
    void sortVName()
    {
    	tListe *hp1, *hp2;
    
    	for (tListe *p = pRoot; p; p = p->pNext)
    	{
    		hp1 = pRoot ->pNext;
    		hp2 = pRoot;
    
    		while (hp1)
    		{
    			if (hp1 ->vName < hp2 ->vName)
    			{
    				swap (hp1, hp2);
    			}
    
    			hp2 = hp1;
    			hp1 = hp1->pNext; 
    		}
    	}
    }
    
    void sortFName()
    {
    	tListe *hp1, *hp2;
    
    	for (tListe *p = pRoot; p; p = p->pNext)
    	{
    		hp1 = pRoot ->pNext;
    		hp2 = pRoot;
    
    		while (hp1)
    		{
    			if (hp1 ->fName < hp2 ->fName)
    			{
    				swap (hp1, hp2);
    			}
    
    			hp2 = hp1;
    			hp1 = hp1->pNext; 
    		}
    	}
    }
    
    void sucheM(int zahl)
    {
    	int i = 0;
    	tListe *hp;
    
    	hp = pRoot;
    
    	while (hp)
    	{
    		i++;
    
    		if (hp ->matrNr == zahl)
    		{
    			cout << "\n\nDatensatz vorhanden:\n\n";
    			cout << "\n" << i;
    			cout << "\t" << hp ->vName << " " << hp ->fName << "\n\tMatr.#: " << hp ->matrNr << "\n\n";
    		}
    
    		hp = hp ->pNext; 
    	}
    
    }
    
    void sucheV (string name)
    {
    	int i = 0;
    	tListe *hp;
    
    	hp = pRoot;
    
    	while (hp)
    	{
    		i++;
    
    		if (hp ->vName == name)
    		{
    			cout << "\n\nDatensatz vorhanden:\n\n";
    			cout << "\n" << i;
    			cout << "\t" << hp ->vName << " " << hp ->fName << "\n\tMatr.#: " << hp ->matrNr << "\n";
    		}
    
    		hp = hp ->pNext; 
    	}
    
    }
    
    void sucheF (string name)
    {
    	int i = 0;
    	tListe *hp;
    
    	hp = pRoot;
    
    	while (hp)
    	{
    		i++;
    
    		if (hp ->fName == name)
    		{
    			cout << "\n\nDatensatz vorhanden:\n\n";
    			cout << "\n" << i;
    			cout << "\t" << hp ->vName << " " << hp ->fName << "\n\tMatr.#: " << hp ->matrNr << "\n";
    		}
    
    		hp = hp ->pNext; 
    	}
    
    }
    

    eine Frage noch: Das sortieren funktioniert einwandfrei, aber wenn ich mehrere Datensätze (d.h. so ca. 5 Stück) drin hab, hängt er sich auf, also die CPU-Auslastung geht bei einem Kern auf 100% und es tut sich auch nach einer längeren Wartezeit nichts.
    Fehler meinerseits oder ist mein Laptop überfordert (kann ich irgendwie nicht glauben...)

    Ansonsten recht herzliches Dankeschön, super Forum! weiter so! 👍


Anmelden zum Antworten