Verkettete Liste



  • In welcher Zeile bist du denn?

    letzer_spielzug zeigt auf den Vorgänger.
    Also zeigt es beim 2. Element auf das 1. Element, welches auch Anfang der Liste ist und somit auch liste darauf zeigt.



  • Aso, sorry in Zeile 29



  • Nochmal kurz:
    liste zeigt auf 1. Element
    act_spielzug zeigt auf 2. Element
    letzer_spielzug zeigt auf 1. Element
    Dann ist letzer_spielzug->next das gleiche wie liste->next

    liste
     |   
     |    
     |    
     |  +---------+
     +->|1.Element|
        +---------+       +---------+
        | next    | ----> |2.Element|
        +---------+       +---------+
                          | next    |  ----> NULL
                          +---------+
    letzer_spielzug       act_spielzug
    

    Beim 3. Element sieht es dann so aus

    liste
     |   
     |    
     |    
     |  +---------+
     +->|1.Element|
        +---------+       +---------+
        | next    | ----> |2.Element|
        +---------+       +---------+       +---------+
                          | next    | ----> |3.Element|
                          +---------+       +---------+
                                            | next    | ----> NULL
                                            +---------+
                         letzer_spielzug    act_spielzug
    


  • Danke! Jetzt verstehe ich wie das ganze zusammenhängt!

    Und so siehts bei doppelt verketteten liste aus?

    liste
        |  
        |    
        |    
        |   +---------+
        +-> |1.Element|
            +---------+       +---------+
            | next    | ----> |2.Element|
            +---------+	  +---------+       +---------+
    NULL<---| prev    |       | next    | ----> |3.Element|
            +---------+       +---------+       +---------+
            |1.Element| <---- | prev    |       | next    | ----> NULL
            +---------+       +---------+       +---------+
    			  |2.Element| <---- | prev    |
    			  +---------+       +---------+	
    					    |3.Element|
    					    +---------+
    											                 letzer_spielzug    act_spielzug
    

    liste->prev muss immer NULL sein, genau wie liste->next->next->next.
    D.h. also, dass man auf mehrere Arten auf z.B. das 1. Element zugreifen kann, richtig?
    Mit dem liste-pointer direkt und mit liste->next->prev.
    Und auf 2. Element: liste->next, oder liste->next->next->prev.

    Ist richtig so oder?

    Und wie kann ich von hinten nach vorne ausgeben, also den prev-pointer zu hilfe nehmen beim Ausgeben? Ich hab mir das so gedacht, das ich das Ende finde, also der pointer muss NULL sein. Und dann halt immer mit ->prev zurück gehe und ausgebe. Aber iwie klappt das nicht so recht.

    int main()
    {
      spielzug * alle_zuege = NULL;
    	spielzug * zuege_first = NULL;
    	spielzug * alle_zuege1 = NULL;
    
      zuege_first = file2zuege("zuege.dat");
      alle_zuege=zuege_first;
    	alle_zuege1=zuege_first;
    
    	while(alle_zuege != NULL)
    	{
    		printf("x:%d,y:%d,stein:%c\n",alle_zuege->posx,alle_zuege->posy,alle_zuege->zeichen);
    		alle_zuege=alle_zuege->next;
    	}
    
    	printf("------------------\n");
    
    	while(alle_zuege1 != NULL)
    	{
    	  alle_zuege1=alle_zuege1->next;
    	}
    
      while(alle_zuege1->prev != NULL)
    	{
    	  printf("x:%d,y:%d,stein:%c\n",alle_zuege->posx,alle_zuege->posy,alle_zuege->zeichen);
    		alle_zuege1=alle_zuege1->prev;
    	}
    
    	return 0;
    }
    

    Was mache ich da genau falsch?

    Könntet ihr mir vielleicht noch bitte Tipps geben wie ich die GANZE Liste löschen kann?



  • EDIT:

    liste
        |  
        |    
        |    
        |   +---------+
        +-> |1.Element|
            +---------+       +---------+
            | next    | ----> |2.Element|
            +---------+       +---------+        +---------+
    NULL<---| prev    |       | next    | ----> |3.Element|
            +---------+       +---------+       +---------+
            |1.Element| <---- | prev    |       | next    | ----> NULL
            +---------+       +---------+       +---------+
                              |2.Element| <---- | prev    |
                              +---------+       +---------+   
                                                |3.Element|
                                                +---------+
                            letzer_spielzug    act_spielzug
    


  • Welchen Wert hat alle_zuege1 in Zeile 23?
    Tipp: printf("alle_zuege1: %p\n", alle_zuege1);

    Die Liste musst du Knoten für Knoten löschen. So wie du sie auch angelegt hast.



  • alle_zuege1 zeigt in Zeile 23 auf NULL.

    Also wir sind am Ende der Kette.



  • Das Programm geht doch aber weiter.
    Was meinst du ergibt dann alle_zuege1->prev in Zeile 24?



  • Mh ok das ist dann natürlich auch 0.

    Aber wie könnte ich das anders machen?



  • Nein, das ist nicht NULL.
    Der Zugriffsversuch auf NULL->next ( alle_zuege1->next ) ist in diesem Fall verboten, da dir der Speicher dort nicht gehört.

    [quote="liste1]Aber wie könnte ich das anders machen?[/quote]
    Wie wäre es, wenn du dir das letzte Element merkst?


Anmelden zum Antworten