[C++] verkette Listen? und ihre Ausgabe...?

Aya_3003

Grünschnabel
Guten Abend!

Nach mehreren Stunden Hin und Her probieren gebe ich schließlich auf und frage hier nach.
Ich versuche mich gerade an Listen und es klappt immer noch nicht so wie ich es haben möchte.

Hat vielleicht jemand einen Link zu einem guten Tutorial? Ich habe mich schon durch das Internet gesucht, aber anscheinend habe ich es noch immer nicht verstanden.

Nachdem, was mir ausgegeben wird, sieht es so aus, als dass ich die Daten wenigstens dort habe, wo ich sie haben möchte, doch anstatt der gesamten Daten, die eingegeben werden, wird nur ein Datensatz ausgegeben.

Entweder ich habe die Liste komplett falsch aufgebaut oder es hat sich irgendwo ein Fehler eingeschlichen oder es ist doch noch etwas falsch an das ich noch gar nicht gedacht habe. Außerdem bin ich mir nicht so sicher, wo genau ich meinen Anfang hinsetzen muss.

Code:
#include <iostream>
using namespace std;
#include <string>
#include <fstream>



class Clpersonen
   {
   public:

   Clpersonen *next;
   int ozahl;
   char rname[100];
   char nickname[100];

   } ;

enum zustand {zahl, rname, nickname};

int main()
{

char puffer[100],zeichen;
int zaehler;
enum zustand zustand;
int i=0;

Clpersonen *root, *node; 

root=  new Clpersonen; 
root->next=NULL; 
node= new Clpersonen; 
node->next=NULL;

ifstream datei;

datei.open("personen.txt");

zustand=zahl;
zaehler=0;
for (;;)
    {
    datei.get(zeichen);
	if (datei.eof()) {node->next=NULL; break;}
    switch(zeichen)
       { 

	case '"':
		zustand=zahl;
       puffer[zaehler]='\0';
       zaehler=0;
		break;

	case '(':
		i++;
		node->ozahl=i;
		
		if (zustand==zahl){
			puffer[zaehler]='\0';
			zaehler=0;

		    strcpy(node->rname,puffer);
			zustand=rname;
		}
		break;

	case ')':
				if (zustand==rname){
			puffer[zaehler]='\0';
			zaehler=0;

		    strcpy(node->nickname,puffer);
			zustand=nickname;
			
		}
		break;

    case '\n':
       break;

    default:
       puffer[zaehler]=zeichen;
       zaehler++;
       break;
       }
    }


root=node;

while(root!=NULL)
{
	cout << root->ozahl << ' ' << root->rname << ' ' << root->nickname << endl;
	root=root->next;
}

}

Vorschläge?
 
Hallo und willkommen.
Also am Anfang erstellst du 2mal eine Instanz von Clpersonen. Du brauchst nur eine zu erstellen für deine Liste, die andere ist ja nur zum "durchhangeln". Während du deine Textdatei einliest (keine Ahnung wie die Aufgebaut ist) erstellst du keinen neuen Instanzen für einen neuen Eintrag und weist dem nächsten Element kein Element zu, sprich du überschreibst die Werte bis deine Datei zu ende ist und hast, wenn deine Logik korrekt ist einen Eintrag ;)

Lösung:
+ neue Instanz erstellen wenn neuer Eintrag (Person)
+ Werte zuweisen
+ vorige Instanz merken damit du ihr dem aktuellen als nächsten Eintrag zuweisen kannst.

Viel Spass :-)
 
Hallo, was genau verstehst du nicht ? Ich hoffe doch du hast dein Problem an deinem Code verstanden und was eine verkettete Liste ist. Ich gehe davon aus das du eine Textdatei hast in der mehrere Personen stehen, die du in der Liste speichern möchtest.
Am Anfang hast du nur 3 Pointer(Zeiger) auf die Instanz, node für das erstellen von Listeneinträgen, root zum navigieren und navi zum Navigieren. In der Schleife findest du die erste Person und erstellst einen Listeneintrag (node = new Clpersonen) und weist die Attribute zu. Der Zeiger root zeigt auf das frisch erstellte Element (root = node und navi = node). Wenn du jetzt wieder eine Person findest dann erstellst du ganz normal wieder einen Listeneintrag (node), und verkettest die Elemente (navi->next = node) usw.

root zeigt immer auf das erste Element
navi zeigt auf das vorherige Element
node dient zur Erstellung von Listenelementen

Wichtig ist das der Code für das erste Element anders ist als für weitere Elemente.
Wenn du das verstanden hast versuche es zu implementieren und zeige deinen Fortschritt, wir möchten ungern fertige Lösungen präsentieren. Es ist viel schöner etwas eigenstädig erschaffen zu haben. ;)
 
Zurück