Eingeleses Wort aus einer Datei in eine verkettete Liste



  • Hallo,

    ich muss für mein Studium ein Programm schreiben, welches eine txt Datei öffnet und Wort weise ausliest und dann die Wörter in eine einfach verkettet Liste hängt und die Häufigkeit der Wörter zählt.

    Ich bin nun schon länger Zeit am Grübeln, wie ich diese Liste aufbauen könnte, komme aber auf keinen funktionieren Vorschlag (ich sammle erst seit Oktober Programmier Erfahrungen).
    Könnte mir jemand einen Vorschlag oder Gedankenanstoß geben? Wortweißes einlesen aus der Datei stellt für mich kein Problem dar aber die verkettete Liste.

    Danke



  • Hallo,
    muss es denn unbedingt eine Liste sein? Eine std::map<std::string, int> wäre hier sicher besser geeignet.



  • @humesikkins: vielleicht ist die aufgabenstellung ja so...
    aber schlussendlich ist es ja egal, listen kann man immer wieder verwenden. zu den listen: man braucht erstens ein struct für die knotenelemente:

    typedef struct NodeItem {
    	char *pszData; // zeiger auf den text
    	NodeItem *pNext; // zeiger auf das nächste element
    } NODEITEM, *PNODEITEM;
    

    dann brauchst du einen zeiger auf das erste element:

    NODEITEM FirstElement = new NODEITEM;
    

    nächstens würde ich auch noch ein letztes element erstellen, das ebenfalls keine daten enthält und in pNext permanent einen NULL-zeiger hat.

    NODEITEM FirstElement->pNext = new NODEITEM;
    FirstElement->pNext->pNext = NULL;
    

    falls du jetzt ein neues element hinzufügen musst, machst du das einfach so ähnlich wie

    NODEITEM NewElement = new NODEITEM;
    NewElement->pszData = pszDeinText;
    

    naja, und um NewElement->pNext zu füllen musst du jetzt wohl oder übel mit einer schleife die ganze kette ablaufen bis du bei

    CurrentElement->pNext->pNext
    

    eine NULL findest. (einfacher wäre es mit einer doppelt verketteten liste) dort kannst du dann dein neues element einsetzen:

    NewElement->pNext = CurrentElement->pNext;
    CurrentElement->pNext = NewElement;
    

    falls du die wörter in alphabetischer reihenfolge haben musst, dann könntest du an dieser stelle auch noch etwas mit strcmp basteln. weiterhin könntest du im struct auch einen zähler für das vorkommen der unterschiedlichen wörter einbauen, den du bei strcmp(...)==0 einfach inkrementierst ohne ein neues element zu erstellen...

    vom auslesen her sieht es dann wieder ähnlich aus. übrigens kann man am ende der kette statt auf ein letztes element wieder auf das erste element verweisen. ach ja, und wenn du die daten im element speicherst, würde ich dort unbedingt mit "new" speicher reservieren und den string mit memcpy o.ä. reinkopieren - sonst hast du irgendwann mal mehrere zeiger auf den gleichen text oder so 😉 naja, das ganze in eine klasse, die die speicherverwaltung übernimmt, und fertig...

    mfg
    puenktli


Anmelden zum Antworten