einfache Liste



  • Hallo zusammen.
    Ich hab hier eine Liste gemacht die Namen einlesen soll.
    Nun will ich aber erreichen dass wenn ich "Ende" eingebe
    die Liste ausgegeben wird.

    Kann mir jemand zeigen wie das geht??

    # include <stdio.h>
    # include <iostream.h>
    # include <string.h>
    
    struct KNOTEN
    {
    	char NAME[20];
    	struct KNOTEN *NEXT;
    };
    
    struct KNOTEN ListenKopf;
    
    KNOTEN* Letztes(void)
    {
    	KNOTEN *p=&ListenKopf;
    	while(p->NEXT!= NULL)
    	{
    		p=p->NEXT;
    	}
    	return(p);
    }
    
    void NeuesElement(char *pName)
    {
    	KNOTEN *Element= new KNOTEN;
    	strcpy(Element->NAME, pName);
    	Element->NEXT =NULL;
    
    	KNOTEN *p =Letztes();
    	p->NEXT=Element;
    }
    
    void Ausgabe(void)
    {
    	KNOTEN *p= &ListenKopf;
    	while(p!=NULL)
    	{
    		cout<<p->NAME<<"\n";
    		p =p->NEXT;
    	}
    }
    
    void main()
    {
    	char Name[20];
    
    	strcpy(ListenKopf.NAME, "Teilnehmer");
    	ListenKopf.NEXT = NULL;
    
    	printf("Geben sie 10 Namen ein:\n");
    	while(1)
    	{
    		scanf("%s",Name);//wenn "Ende", Eingabe beenden, Liste ausgeben
    		NeuesElement(&Name[0]);
    	}
    
    	Ausgabe();
    }
    


  • #include <stdio.h>
    #include <string.h>
    
    struct KNOTEN
    {
    	char NAME[20];
    	struct KNOTEN *NEXT;
    };
    
    struct KNOTEN ListenKopf;
    
    KNOTEN* Letztes(void)
    {
    	KNOTEN *p=&ListenKopf;
    	while(p->NEXT!= NULL)
    	{
    		p=p->NEXT;
    	}
    	return(p);
    }
    
    void NeuesElement(char *pName)
    {
    	KNOTEN *Element= malloc(sizeof(KNOTEN);
             if(!Element)
                 /* Tu was! */
    	strcpy(Element->NAME, pName);
    	Element->NEXT =NULL;
    
    	KNOTEN *p =Letztes();
    	p->NEXT=Element;
    }
    
    void Ausgabe(void)
    {
    	KNOTEN *p= &ListenKopf;
    	while(p!=NULL)
    	{
    		cout<<p->NAME<<"\n";
    		p =p->NEXT;
    	}
    }
    
    void main()
    {
    	char Name[20];
    
    	strcpy(ListenKopf.NAME, "Teilnehmer");
    	ListenKopf.NEXT = NULL;
    
    	printf("Geben sie 10 Namen ein:\n");
    	while(1)
    	{
    		if(fgets(Name, sizeof Name, stdin)  && strcmp(Name, "Ende"))
    	             NeuesElement(&Name[0]);
                      else
                          break;
    
    	}
    
    	Ausgabe();
    }
    

    Was nun C oder C++? Speicherallokation kann immer schiefgehen, ebenso einlesen. Lerne zu überprüfen und sichere Funktionen zu nehmen.

    Gruß Tobias



  • Zuerst mal danke für den Code.
    Was meinen c/c++ Stil angeht muss ich selbst zugeben das ich da ein wenig
    geschlampt hab....
    🙄

    aber mir ist da noch was eingefallen vielleicht kannst du mir da auch noch
    weiter helfen.
    wenn ich den oben stehenden code um folgende Funktion erweitern wollte:

    void LLoeschen(void)
    {
    	while(ListenKopf.NEXT!=NULL)
    	{
    		KNOTEN *p = &ListenKopf;
    		while(Letztes() != p->NEXT)
    		{
    			p= p->NEXT;
    		}
    
    		delete Letztes();
    		p->NEXT = NULL;
    	}
    }
    

    hierbei wird ja die ganze Liste bis auf den Listenkopf gelöscht.
    Was wenn ich nun aber nur einzelne Elemente entfernen will??
    z.B wenn ich bei einer Eingabe einen Namen Falsch geschrieben haben und
    das nun ausbessern will????



  • mhhh...
    zähl die liste einfach durch bis zu dem Eintrag den du löschen willst - 1 und lass den pointer auf den übernächsten Knoten zeigen...
    Also wenn du zb. den 5. Knoten löschen willst setzt du den Zeiger des 4. Knotens auf den 6. Knoten und gibst dann den Speicher des 5. Knotens frei...musst aber aufpassen, dass der Speicher wirklich freigegeben wird, gerade bei listen können sehr oft speicherlücken entstehen...
    mfg


Anmelden zum Antworten