einfach verkettete Liste



  • Hi
    ich bin ein Anfänger was c++ und Programmieren betrifft und wollte selbst ein Programm schreiben womit ich eine Aufgabenliste verwalten kann.
    Allerdings tritt ein Problem auf:
    Nachdem ich die Elemente von der Tastatur eingelesen habe und sie wieder ausgeben will, wird immer nur die letzte Eingabe ausgegeben(dafür aber so oft wie ich Eingaben getätigt habe). Wenn ich allerdings an die Funktion insert z.B. "Hallo", "Guten Tag" und "Morgen" übergebe, werden die Elemente korrkt ausgegeben.

    Ich sitze an diesem Problem schn seit Tagen und auch wenn ich weiß, dass das hier umfangreich ist, so bitte ich euch trotzdem um eure Hilfe weil ich echt nicht mehr weiter weiß.

    Vielen Dank
    Sebastian

    Die Header-Datei:

    //Programm zu Verwaltung einer Todoliste
    //Datei: todo.h enthaellte die Klassen 
    //	Listel fuer ein Listenelement welches den eigentlichen Eintrag des Todolistenelements enthaellt
    //	Todo zur Verwaltung der Listemelemente
    
    #include <iostream>
    
    using namespace std;
    
    class Listel{
    private:
    	char *ptr;
    	Listel *next;
    
    public:
    	Listel(const char *c):ptr(c){
    		next=0;
    	}
    	char *getData(void){
    		return ptr;
    	}
    	print(){
    		while(*ptr){
    			cout<<*ptr++;
    		}
    	}
    	friend class Todo;		//da Todo "next" fuer die Verwaltung der Liste benötigt
    };
    
    class Todo{
    private:
    	Listel *first;
    
    public:
    	Todo(){
    		first=0;
    	}
    	void insert(const char *c){
    		Listel *l=new Listel(c);
    		Listel *p=first;
    		if(first==NULL){
    			first=l;
    		}
    		else{
    			for(;p->next!=NULL;p=p->next);
    			p->next=l;
    
    		}
    		p=first;
    	}
    	void print(){
    		Listel *ptr;
    		ptr=first;
    		while(ptr!=NULL){
    			cout<<endl<<ptr->getData();
    			ptr=ptr->next;
    		}		
    	}
    };
    

    Die Quellcodedatei:

    #include "todo.h"
    
    using namespace std;
    
    main(){
    	Todo t;
    	char c[20];
    
    	cin.getline(c,20);
    	t.insert(c);	
    
    	cin.getline(c,20);
    	t.insert(c);
    
            cin.getline(c,20);
    	t.insert(c);
    
    	t.print();
    
    }
    


  • Musst du das Rad unbedingt neu erfinden ??

    Wenn nicht, dann solltest du std::list
    oder halt einen anderen passenden STL-
    Container verwenden.



  • Ich hab leider absolut keine Ahnung was ein STL-Container ist. Wie gesagt ich bin halt Anfänger.
    Außerdem wollte ich auch gucken, ob ich das was ich bisher gelernt habe auch beherrsche(sieht leider nicht so aus).


  • Mod

    verwende strings statt c-style arrays. wenn du insert aufrufst nimmt die liste nur einen pointer auf den puffer c auf, der puffer selbst wird nicht kopiert. demzufolge sind alle änderungen in c in allen listenelementen sichtbar. wenn du literale übergibst, übergibst du dagegen stets andere pointer. im übrigen noch sind noch einige fehler bzgl. const drin, die dir der compiler eigentlich nicht durchgehen lassen dürfte:

    Listel(const char *c):ptr(c){
            next=0;
       }
    

    hier wird ein zeiger auf const char in einen zeiger auf char gewandelt.



  • Gibt es eine Möglichkeit wie ich es trotzdem noch zum laufen kriegen bekomme ohne die String-Klasse zu verwenden.
    Danke schon mal für die schnellen Antworten. 😋



  • Ich wäre wirklich dankbar für eine Antwoirt, da ich jetzt zwar weiß worin der fehler besteht, jedoch weiß ich micht wie ich ihn beheben kann.
    thx



  • dein c'tor einen const char* und du versuchst diesen einem char* zuzuweisen. Du musst halt einfach einen const char* benutzen, einen Zeiger auf etwas Konstantes..
    In deinem Fall:

    const char *ptr;
    


  • Das hab ich versucht aber es funktioniert immer noch nicht.



  • du musst das natuerlich auch in Methoden wie getData anpassen, die geben jetzt auch const char* zurueck.


  • Mod

    class Listel{
    public:
        Listel(const char* c)
            : next()
        {
            strncpy( s, c, sizeof s - 1 );
            s[ sizeof s - 1 ] = 0;
        }
        char *getData(void){
            return s;
        }
        print(){
            cout << s;
            }
        }
        Listel *next;
    private:
        char s[21];
    };
    


  • danke aber jetzt habe ich immer noch das Problem, dass ich immer noch den Puffer von c aufrufe und zum Schluß drei mal den gleichen Wert in die Liste geschrieben habe.


Anmelden zum Antworten