Gutes Buch über Listen..Zeiger...?

cler

Mitglied
Hallo,


ich versuche mich gearde an Listen, Zeigern und und und. Kann mir vielleicht jemand ein Buch empfehlen, in dem Zeiger und Listen ausführlich erklärt werden? Oder vielleicht gibt es ja auch gute Online Quellen. Ich war auf der Suche bisher erfolgreich.

Wäre toll, wenn vielleicht zufällig jemand ein gutes Buch, was dieses Thema ausführlich behandelt kennt.

Vielen Dank.

Grüße
 
Hi,

ich kann dir zwar kein Buch speziell über Listen und Zeiger sagen, aber wenn du spezielle Fragen hast, werden wir dir gern weiterhelfen.

Mfg Col.Blake
 
Hallo,

die Sache ist, eine wirklich konkrete Frage habe ich nicht. Ich bastle nur schon die ganze Zeit an einem kleinen Programmchen rum und komme mit Listen und Zeigern und Strukturen noch nicht so ganz klar.
Zu meinem Programm. Ich lese aus einer Datei Zahle nein, die ich in eine lIste einfügen will. In der Datei stehen die Zahlen unsortiert und ich will sie aber direkt sortiert in die Liste eintragen. erst die kleinste, hinten die größte. Mein bisheriger Versuch geht dahin, dass wenn ich in der Liste z.B. 3 4 5 6 2 stehen habe. die 6 und 2 hintereinander in die liste eingetragen werden. Ich gebe die Liste anschließen zur Kontrolle aus. Bis auf den "kleinen" Fehler, dass nicht auch die vorderen Zahlen in die Liste eingetragen werden, habe ich ja schon einmal die Kontrolle, dass der gerade aktuell eingelesene Wert mit den Listeneinträgen verglichen wird. Aber ich bekomme es absolut nicht hin, die aktuell eingelesene Zahl(soll kleiner sein, als ein Wert in einem Listenelemnt) vor dem passenden Listenelement einzutragen. Meinen Code seht ihr unten. Vielleicht fällt ja jemandem was dazu ein.

Code:
typedef structLISTE{
					  long int value;
					  struct LISTE *next;
					 }LISTEi;

}void Liste(FILE *datei) 
{ 
long int input; 
struct LISTE *anfang; 
struct LISTE *zeiger; 
anfang NULL; 
 
fseek( datei, 0, SEEK_SET ); 
while(!feof(datei)) 	
{ 
	 fscanf(datei, "%i", &input); 	
	 if(anfang == NULL) 					 
	 { 
		 anfang= malloc(sizeof(LISTE)); 
		 anfang->next= NULL; 
		 zeiger= anfang; 
		 zeiger-> value= input; 
		 zeiger-> next= NULL; 
	 } 
	 else 
	 { 
		 zeiger= anfang; 
		 while(zeiger-> next != NULL && zeiger != NULL) 	 
		 { 
			 if(input > zeiger->value) 
			 { zeiger= zeiger-> next; 
			 printf("test\n"); 
			 fclose(datei); 
			 ausgabe(anfang); 
			 getchar(); 
			 exit(0);} 
 
		 } 
		 zeiger-> next= malloc(sizeof(*zeiger)); 
		 zeiger= zeiger-> next; 
	 } 
	 zeiger-> value= input; 
	 zeiger-> next= NULL; 
 
} 
fclose(datei); 			
ausgabe(anfang); 			
}
 
Hi,

Der Fehler liegt darin, dass du die neuen Elemente zwar zwischendurch einkettest,
aber dadurch den Zeiger auf die älten nächsten Elemente verlierst.

Also wenn du ein Element in die Liste einsetzt, belegst du den Pointer(struct LISTE *next) des vorhergehenden Elementes neu, und verlierst so den Rest der Liste, der zwar noch im Speicher ist, aber keiner mehr weis wo.

An deinem Beispiel (3 4 5 6 2) sieht das so aus:

:3
4 ist größer als 3 also davor einketten: 4
5 ist größer als 3 also davor einketten: 5
6 ist größer als 3 also davor einketten: 6
2 ist kleiner als 6 also danach einketten: 6->2
Resultat: 6->2

Was du noch machen musst ist, dass du dem neuen Element den Rest der Liste ankettest.


Code:
-------------------- 1. ------------------------
temp = zeiger->next;

  zeiger temp
    |    |
E1->E2->E3->E4

-------------------- 2. ------------------------
Zeiger->next = E5;

  zeiger         temp
    |             |
E1->E2->E5        E3->E4

-------------------- 3. ------------------------
Zeiger->next->next=temp

  zeiger   temp
    |       |
E1->E2->E5->E3->E4

-------------------- 4. ------------------------
Zeiger = Zeiger->next;
temp=null;

       zeiger     
        |         
E1->E2->E5->E3->E4

Mfg Col.Blake
 
Hallo,


vielen Dank für die Antwort. Ich habe es in der Zwischenzeit it viel Basteln, probieren und überlegen hinbekommen. Ich werde in kürze mal den Code posten, um zu zeigen wie ich es gemacht habe.

Grüße
 
Zurück