verkette Liste #2/ Ausgabe der Einzelnen Elemente



  • hi,

    ich habe eine verkette liste erstellt, nun wollte ich überprüfen ob die werte auch wirklich in die listen geschrieben wurden. wie kann ich das überprüfen bzw. wie kann ich einzelne ziffern ausgeben. mein code:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct _zahlliste	 {
    
    	int ziffer;
    	struct _zahlliste *next;
    
    } zahlenliste;
    
    int main() {
    
    	struct _zahlliste *zeiger=NULL;
    	struct _zahlliste *anfang=NULL;
    	struct _zahlliste *next=NULL;
    
    	anfang=(struct _zahlliste*)malloc(sizeof(struct _zahlliste)); 		//Speicherreservierung
    
    	if(zeiger==NULL) return 0;
    
    	anfang->ziffer=23;									//Wertzuweisung
    	anfang->next=NULL;
    
    	zeiger=anfang;										//Zeiger wieder an den Anfang setzen
    
    	while(zeiger->next!=NULL)								//Ende der verk. Liste suchen
    	{
    	zeiger=zeiger->next;
    	}
    	zeiger->next=(struct _zahlliste*)malloc(sizeof(struct _zahlliste));	//Speicherreservierung
    	zeiger=zeiger->next;									//Zeiger zeigt auf Anfang der 2. Liste
    	if(zeiger==NULL) return 0;
    	zeiger->ziffer=12;									//Wertzuweisung
    	zeiger->next=NULL;
    
    	zeiger=anfang;										//Zeiger wieder an den Anfang setzen
    
    	while(zeiger->next!=NULL)								//Ende der verk. Liste suchen
    	{
    	zeiger=zeiger->next;
    	}
    	zeiger->next=(struct _zahlliste*)malloc(sizeof(struct _zahlliste)); 	//Speicherreservierung
    	zeiger=zeiger->next;									//Zeiger zeigt auf Anfang der 2. Liste
    	if(zeiger==NULL) return 0;
    	if(zeiger==NULL) return 0;
    	zeiger->ziffer=3;										//Wertzuweisung
    	zeiger->next=NULL;
    
    	return 0;
    }
    

    Anmelden zum Antworten
     


  • Zeile 19:

    zeiger wird immer NULL bleiben, wenn du ihm keinen Wert zuweist, d.h. dein Programm
    wird immer an Zeile 19 enden.

    In C castet man den Rückgabewert nicht ( es gibt die eine oder andere Sprache, die ist ein wenig begriffsstutzig 😃 , da muss man es machen ).

    Du kannst also sowas schreiben:

    anfang = malloc ( sizeof ( *anfang ));
        if ( anfang == NULL ) return 0;
    

    Die Ausgabe funktioniert so:

    Hol dir den Zeiger auf das erste Element.

    Zeig das Element an.
    Hol dir den Zeiger auf das nächste Element, usw.

    zeiger = anfang;
    while ( zeiger != NULL )
    {
    	printf("%d\n", zeiger->ziffer);
    	zeiger = zeiger->next;
    }
    

    Zum Schluß räumt man noch den Speicher auf, indem man den Zeiger
    eines jeden Elements an free übergibt.



  • ich habe irgendwie das gefühl, dass der in die while schleifen oftmals garnicht hineinspringt bzw. irgendetwas mit dem programm nicht stimmt, denn wenn ich in der letzen while schleife mir die werte ausgeben lassen lässt der den ersten wert immer aus:

    ...
    zeiger->ziffer=3;										//Wertzuweisung
    	zeiger->next=NULL;
    
    	zeiger=anfang;
    	while(zeiger->next!=NULL)								//Ende der verk. Liste suchen
    	{
    	zeiger=zeiger->next;
    	printf("%d\n",zeiger->ziffer);
    	}
    ...
    

    Als Ausgabe komme ich dann nur auf 12 und 3, was dann nur die letzten beiden werte sind. 😞

    ich hoffe mir kann jmd helfen!



  • weiterer punkt, ich möchte nun eine funktion aufrufen, die die vorhandenen ziffern zählt. Dabei soll der Funktionskopf so aussehen:

    int laengeListe(const zahlenliste*)
    

    Ich frage mich nur was ich nun genau übergeben soll, die structur scheint es offenbar nicht zu sein oder?



  • mstrkrft_ schrieb:

    weiterer punkt, ich möchte nun eine funktion aufrufen, die die vorhandenen ziffern zählt. Dabei soll der Funktionskopf so aussehen:

    int laengeListe(const zahlenliste*)
    

    Ich frage mich nur was ich nun genau übergeben soll, die structur scheint es offenbar nicht zu sein oder?

    naja, du übergibst ihr einen pointer auf den string, dessen ziffern du zählen willst, und dann zählen:

    int digits = 0;
    while (*str)
      if (isdigit (*str++))
        digits++;
    

    ^^am ende der schleife ist in 'digits' die anzahl der ziffern.
    🙂



  • hma ber wenn ich den string übergebe müsste das doch dann zeiger->ziffer sein oder?



  • mstrkrft_ schrieb:

    hma ber wenn ich den string übergebe müsste das doch dann zeiger->ziffer sein oder?

    ach, vergiss mein posting. ich bin nur von deiner frage ausgegangen, ohne den thread gelesen zu haben. du musst dich durch die liste hangeln, hast ja keine strings für die ziffern.
    🙂



  • so hab das programm nochmal umgeschrieben und ne eigene funktion für das eintragen gemacht(so wird es übersichtlicher)!!!!

    mit der funktion laengeliste soll ich nun die länge der verketten liste(also zahl der elemente) zählen. ich weiß nur nicht was ich an die funktion übergeben soll 😕

    mein code:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct _zahlliste {
    
    	int ziffer;
    	struct _zahlliste *next;
    
    } zahlenliste;
    
    void eintragen(struct _zahlliste **anfang, int wert)
    
    {
    	struct _zahlliste *zeiger=*anfang;
    
    	while(zeiger->next!=NULL)
    	{zeiger=zeiger->next;}
    
    	zeiger->next=malloc(sizeof(struct _zahlliste));
    	zeiger=zeiger->next;
    
    	if(zeiger==NULL) return;
    
    	zeiger->ziffer=wert;
    	printf("%d\n",zeiger->ziffer);
    	zeiger->next=NULL;
    
    	*anfang=zeiger;
    
    }
    
    int laengeListe(const zahlenliste*)
    {
    
    	return 0;
    }
    
    int main() {
    
    	struct _zahlliste *anfang;
    
    	anfang=(struct _zahlliste*)malloc(sizeof(struct _zahlliste)); 
    	anfang->next=NULL;
    
    	eintragen(&anfang,5);
    	eintragen(&anfang,77);
    	eintragen(&anfang,66);
    
    	laengeListe(anfang);
    
    	return 0;
    }
    

    DANKE!



  • mstrkrft_ schrieb:

    Als Ausgabe komme ich dann nur auf 12 und 3, was dann nur die letzten beiden werte sind. 😞

    ich hoffe mir kann jmd helfen!

    Wenn du in der Schleife mit dem 2ten Element beginnst, kein Wunder, ne.

    mstrkrft_ schrieb:

    weiterer punkt, ich möchte nun eine funktion aufrufen, die die vorhandenen ziffern zählt.

    Die Anzahl speichert man am besten beim Erstellen/Löschen.



  • ja nur ich muss das mit der funktion

    int laengeListe(const zahlenliste*)
    

    machen, nur was übergebe ich dort???



  • habe das problem soweit gelöst danke für alle die mitgeholfen haben!!! gucke mal ob ich das mit dem zählen nun hinbekomme 🙂

    gruß!



  • mstrkrft_ schrieb:

    ja nur ich muss das mit der funktion

    int laengeListe(const zahlenliste*)
    

    machen, nur was übergebe ich dort???

    So wie es aussieht, willst du zählen, nachdem die Liste erstellt wurde.
    In dem Fall übergibst du das erste Element, das funktioniert wie bei der Ausgabe, statt der Ausgabe inkrementierst du eine Zählvariable.
    Aber wie schon erwähnt, besser ist es zu zählen, wenn du erstellst/löschst.



  • int laengeListe(const zahlenliste* pointer)
    {
    	int i=0;
    	while(pointer->next!=NULL)
    	{
    		pointer=pointer->next;
    		i++;
    		printf("blabla");
    	}		
    
    	return i;
    }
    ...
    int z=laengeListe(anfang);                              //Anfang=Anfangspointer, der immer auf das 1. Element zeigt
    

    @big brother, genau richtig!das ist meine zählfunktion, allerdings scheint die abbruchbedingung falsch zu sein, muss ich noch drüber nachdenken!


Anmelden zum Antworten