Sortierte Eingabe in doppelt Verkettete Liste einlesen.

Danke nochmals...

Bei der Sortierung wollte ich mal wissen, wenn ich zwei Wörter vergleiche , wie das funktioniert ich mache ja
mit drei If-Abfragen die Vergleiche, ob größer, gleich oder kleiner.
Aber wie macht das der Computer wirklich? Nimmt er da die ASCII-Tabelle und vergleicht dort nur die dezimalen Werte der Buchstaben oder geht er da nach den hexerdezimalen Werten vor?

Denn komischerweise kommt "Sehr" vor dem Wort "geehrte". Müsste aber anders herum sein!

Java:
int* compare(void* string, void* wert)
{
	char* string2 = (char*) string;
	char* string1 = (char*) wert;

	if(string1 > string2)  return 1;
	if(string1 == string2) return 0;
	if(string1 < string2)  return -1;
}
 
Zuletzt bearbeitet:
Hi.
Bei der Sortierung wollte ich mal wissen, wenn ich zwei Wörter vergleiche , wie das funktioniert ich mache ja
mit drei If-Abfragen die Vergleiche, ob größer, gleich oder kleiner.
Aber wie macht das der Computer wirklich? Nimmt er da die ASCII-Tabelle und vergleicht dort nur die dezimalen Werte der Buchstaben oder geht er da nach den hexerdezimalen Werten vor?

Denn komischerweise kommt "Sehr" vor dem Wort "geehrte". Müsste aber anders herum sein!
Du vergleichst weder die Strings noch die Zeichen. Du vergleichst dort die (relativ zufälligen) Speicheradressen.

Es gibt bereits eine Funktion um Strings zu vergleichen: strcmp.

Übrigens reicht eine Funktion die einen bool zurückgibt zum Sortieren völlig aus. Die Funktion muss lediglich entscheiden, ob zwei Werte kleiner-gleich sind oder nicht (eine Halbordnungsrelation). Der Rest ergibt sich damit:

cmp(a, b) ? cmp(b, a) ? a = b


Gruß
 
Habt Ihr eine Idee, was ich hier falsch gemacht habe? Mein theoretischer Vergleich funktioniert nicht!

Java:
node* sort(node* list, void* neuer_String, void* (*set)(void*), int counter, int (*cmp)(void*, void*))
{
	node* kopf      = list;
	node* aktl_Elem = list; 
	
	node* neu_Elem = (node*) malloc(sizeof(node));
	// Überprüfen, ob Speicher übergeben worden ist	
	if(neu_Elem == NULL)
	{
		printf("\n Listenelement konnte nicht angelegt werden, da kein Speicher vorhanden ist! \n");
		exit(1);
	}
	
	if(kopf == (aktl_Elem = aktl_Elem -> right))
	{
		void* tmpchar = set(neuer_String);
		neu_Elem -> content    = tmpchar;
		neu_Elem -> lineCounter = counter;
		
	}		
	else
	{	
		//node* vor = suche(list, neuer_String, cmp);
		void* tmpchar = set(neuer_String);
		char* test = (char*) tmpchar;
				
		while(kopf != (aktl_Elem = aktl_Elem -> right))
		{
                printf(" hi \n");
			if (strcmp((char*)(list -> content), test) < 0)
			{
				printf(" strcmp < 0 \n");	
				
			}
			if(strcmp((char*)(list -> content), test) == 0)
			{
				printf(" strcmp = 0 \n");
			}
			if(strcmp((char*)(list -> content), test) > 0)
			{
				printf(" strcmp > 0 \n");
			}  
			else
			{
				printf(" Fehler \n");				
			}
		}
				
		neu_Elem -> content    = test;
		neu_Elem -> lineCounter = counter;
	}	
	
	neu_Elem -> left       = list; 
	neu_Elem -> right      = list -> right;		
	list -> right-> left   = neu_Elem;  
	list -> right          = neu_Elem;
	
	return neu_Elem;
}
 
Zuletzt bearbeitet:
Habt Ihr eine Idee, was ich hier falsch gemacht habe? Mein theoretischer Vergleich funktioniert nicht!
Was soll das heißen?

Was ist die Eingabe?

Was ist die Ausgabe?

Was hast du erwartet?

Verwende einen Debugger und gehe Schritt für Schritt durch das Programm durch. Schau dir die Inhalte der Variablen an. Oder lass dir die Inhalte der Variablen auch mit ausgeben.

Gruß
 
das heißt, dass ich aus meinen Überlegungen heraus einen möglichen Vergleich hingeschrieben habe, aber in der Praxis nicht funktioniert hat ^^. Den Spruch von mir kannst du auch ignorieren!

Die Eingabe war auch verkerht ich habe jetzt noch etwas herumexperimentiert.
Java:
node* sort(node* list, void* neuer_String, void* (*set)(void*), int counter)
{
	node* kopf      = list;
	node* aktl_Elem = list; 
	
	node* neu_Elem = (node*) malloc(sizeof(node));

	// Überprüfen, ob Speicher übergeben worden ist	
	if(neu_Elem == NULL)
	{
		printf("\n Listenelement konnte nicht angelegt werden, da kein Speicher vorhanden ist! \n");
		exit(1);
	}

	// Wenn lieste leer ist, füre das zuerstkommende Wort ein 
	if(kopf == (aktl_Elem = aktl_Elem -> right))
	{
		void* tmpchar = set(neuer_String);
		neu_Elem -> content    = tmpchar;
		neu_Elem -> lineCounter = counter;				
	}
	// wenn Liste nicht leer ist, prüfe, ob das nächste wort kleiner ist	
	else //if(kopf != (aktl_Elem = aktl_Elem -> right))
	{			
		void* tmpchar = set(neuer_String);
		char* string1 = (char*) tmpchar;					
		char* string2;
				
		while(kopf != (aktl_Elem = aktl_Elem -> right))
		{					
			if (strcmp(string1, string2) < 0)
			{
				string2 = neu_Elem -> left = aktl_Elem -> content; 
				printf("Stelle gefunden ");
				printf(" cmp < 0 \n");
				neu_Elem -> content = string1;				
				neu_Elem -> lineCounter = counter;	
				
			}					
			else if(strcmp(string1, string2) == 0)
			{
				printf(" cmp = 0 \n"); //return;
			}
			else if(strcmp(string1, string2) > 0)
			{
				printf(" cmp > 0 \n"); //return;
			}					
		}		
	}	
	// das hier sind nur die Zeiger der einzelnen Nodes
	
	neu_Elem -> left       = list; 
	neu_Elem -> right      = list -> right;		
	list -> right-> left   = neu_Elem;  
	list -> right          = neu_Elem;
	
	
	return neu_Elem;
}

Die Ausgabe ist meine print_all-Funktion:

Java:
void print_all(node* list, void* (*get)(void*))
{
	node* kopf      = list;
	node* aktl_Elem = list; 
	
	if(kopf == NULL && kopf -> content == NULL)
	{
		return;
	}	
	else
	{		
		while(kopf != (aktl_Elem = aktl_Elem -> left))
		{
			get(aktl_Elem -> content);
			printf(" %i", aktl_Elem -> lineCounter);			
			printf("\n");
		}
	}	
}
...
void* printString(void* stringUebergabe)//, int zahlUebergabe)
{
	char* string = (char*) stringUebergabe;
	//int zahl = zahlUebergabe;
	printf("%s",string);
	//printf("%i",zahl);
}

Also ich habe vor meine Liste gleich von Beginn an sortiert einzulesen. Wenn ich ein Element in der liste habe, sollen alle weiteren Elemente mit denen schon eingelesenen Elementen verglichen werden, um an die richtige Stelle in meiner Liste, die entsprechenden Wörter, einzufügen. Ich bekomme das nicht hin. Das Problem ist auch nicht das Vergleichen, sondern meine while-Schleife in Zeile 29. ich weiss nicht wie ich da die Liste durchschalten kann um an die einzelnen Wörter zukommen um diese dann nach und nach zuvergleichen.

Da ich unter Linux arbeite, sprich mit einem normalen Text-Editor, weiss ich nicht, wie ich da einen Debugger verwende.

Liebe Grüße.
 
Zuletzt bearbeitet:
Also ich habe vor meine Liste gleich von Beginn an sortiert einzulesen. Wenn ich ein Element in der liste habe, sollen alle weiteren Elemente mit denen schon eingelesenen Elementen verglichen werden, um an die richtige Stelle in meiner Liste, die entsprechenden Wörter, einzufügen. Ich bekomme das nicht hin. Das Problem ist auch nicht das Vergleichen, sondern meine while-Schleife in Zeile 29. ich weiss nicht wie ich da die Liste durchschalten kann um an die einzelnen Wörter zukommen um diese dann nach und nach zuvergleichen.
Irgendwie versteh ich nicht wo das Problem ist...
Da ich unter Linux arbeite, sprich mit einem normalen Text-Editor
Das sind zwei völlig verschiedene Dinge. Du bist doch selbst schuld wenn du keine IDE benutzt. Installiere dir Eclipse mit CDT oder Netbeans mit C/C++ Plugin oder Code::Blocks oder als Debugger Frontend ddd oder für die Konsole cgdb oder, oder, oder.

Gruß
 
Ich muss leider mit der konsole hantieren, da es von mir verlangt wird.. ich weiß auch nicht sorecht, ob es eine Eclips oder Netbean version für Ubunto gibt.

Ich hab einfach das Problem, das ich eine Endlosschleife erzeuge, und ich weiß nicht wieso!!

ich will doch nur die Wörter aus meiner txt-Datei (Zeile 2-21) sortiert in meine Liste einfügen (nach Zeile 21) er printet mir nur "Sehr 1" aus und das endlos.
Java:
...
if(argc > 1 && (file = fopen(argv[1], "r")) != NULL)
	{
		// Gesamten Textinhalt auslesen, bis zum Textendezeichen.
		while(fgets(buffer, SIZE, file) != NULL)
		{					
			counter++;
				
			// Wörter einlesen	    		
			wort = strtok(buffer, splitt);
			
			// Wörter solange einlesen, wie Wörter über Buffer übergeben 	werden.			
			while(wort != NULL)
			{			    	
				//anhaengen(aktl_Elem, wort, copyString, counter);//, copyZahl);				
				sort(aktl_Elem, wort, copyString, counter);//, compare);	
				wort = strtok(NULL, splitt);		    					
			}						    		
		}
		fclose(file);
	}
...
node* sort(node* list, void* neuer_String, void* (*set)(void*), int counter)//, int (*cmp)(void*, void*))
{
	node* kopf      = list;
	node* aktl_Elem = list; 
	
	node* neu_Elem = (node*) malloc(sizeof(node));

	// Überprüfen, ob Speicher übergeben worden ist	
	if(neu_Elem == NULL)
	{
		printf("\n Listenelement konnte nicht angelegt werden, da kein Speicher vorhanden ist! \n");
		exit(1);
	}
//******************* Sortierte Listeneingabe ****************************
	//Wenn Liste leer ist, Liste mit ersten Wort befüllen
	if(kopf == (aktl_Elem = aktl_Elem -> right))
	{
		void* tmpchar = set(neuer_String);
		neu_Elem -> content    = tmpchar;
		neu_Elem -> lineCounter = counter;
		// In die Listen einfügen
		neu_Elem -> left       = list; 
		neu_Elem -> right      = list -> right;		
		list -> right-> left   = neu_Elem;  
		list -> right          = neu_Elem;
				
	}		
	else       
	{			
		void* tmpchar = set(neuer_String);
		char* string1 = (char*) tmpchar;  // Wert					
		char* string2 = neu_Elem -> right = aktl_Elem -> content; 
	
		//Wenn nur ein Element in der Liste ist Prüfen			
		if(kopf == (aktl_Elem = aktl_Elem -> right) )
		{
			printf("\nIf\n");
			if(strcmp(string1, string2) < 0)
			{
				//string2 = neu_Elem -> left = aktl_Elem -> content;			
				printf("\n Stelle gefunden: ");
				printf(" %s < %s \n", string1, string2);
				neu_Elem -> content = string1;				
				neu_Elem -> lineCounter = counter;

				// rechts vom Listenknoten einfügen
				neu_Elem -> left       = list -> left; 
				neu_Elem -> right      = list;		
				list -> left-> right   = neu_Elem;  
				list -> left          = neu_Elem;						
						
				i = 1;
			}
			else if(strcmp(string1, string2) == 0)
			{				
				//string2 = neu_Elem -> left = aktl_Elem -> content; 
				printf("\n Stelle gefunden: ");
				printf(" %s = %s \n", string1, string2);
				neu_Elem -> content = string1;				
				neu_Elem -> lineCounter = counter;

				// rechts vom Listenknoten einfügen
				neu_Elem -> left       = list -> left; 
				neu_Elem -> right      = list;		
				list -> left-> right   = neu_Elem;  
				list -> left          = neu_Elem;

				i = 1;	
			}

			
		}
               // Wenn mindestens 2 Elemente in der Liste sind mit Schleife alle Elemente der Liste prüfen
		while(kopf != (aktl_Elem = aktl_Elem -> right))
		{	printf("\nSchleife\n");
			string2 = neu_Elem -> left = aktl_Elem -> content;
				
			if (strcmp(string1, string2) < 0)
			{
				//string2 = neu_Elem -> left = aktl_Elem -> content; 
				printf("\n Stelle gefunden: ");
				printf(" %s < %s \n", string1, string2);
			
				neu_Elem -> content = string1;				
				neu_Elem -> lineCounter = counter;

				// lings vom Listenknoten einfügen
				neu_Elem -> left       = list -> left; 
				neu_Elem -> right      = list;		
				list -> left-> right   = neu_Elem;  
				list -> left          = neu_Elem;
				
			}					
			else if(strcmp(string1, string2) == 0)
			{				
				//string2 = neu_Elem -> left = aktl_Elem -> content; 
				printf("\n Stelle gefunden: ");
				printf(" %s = %s \n", string1, string2);

				neu_Elem -> content = string1;				
				neu_Elem -> lineCounter = counter;

				// links vom Listenknoten einfügen
				neu_Elem -> left       = list -> left; 
				neu_Elem -> right      = list;		
				list -> left-> right   = neu_Elem;  
				list -> left          = neu_Elem;
					
			}
			else if(strcmp(string1, string2) > 0)
			{
				printf("\n Stelle nicht gefunden: ");
				printf(" %s > %s \n", string1, string2); //return;
			}						
		}		
	}	
	
	return neu_Elem;
}
 
Zuletzt bearbeitet:
Ich muss leider mit der konsole hantieren, da es von mir verlangt wird..
Dann nimm cgdb.
ich weiß auch nicht sorecht, ob es eine Eclips oder Netbean version für Ubunto gibt.
Selbstverständlich kann man Eclipse bzw. Netbeans unter Ubuntu nutzen.
Ich hab einfach das Problem, das ich eine Endlosschleife erzeuge, und ich weiß nicht wieso!!

ich will doch nur die Wörter aus meiner txt-Datei (Zeile 2-21) sortiert in meine Liste einfügen (nach Zeile 21) er printet mir nur "Sehr 1" aus und das endlos.
Nach Zeile 21 kommt kein Code mehr.

Nochmal:

Was ist die Eingabe?

Was ist die Ausgabe?

Was hast du erwartet?

Ein vollständiges Minimalprogramm wäre sehr hilfreich.

Gruß
 
also inder besagten While-Scheife wird string1(Wort aus der Textdatei) überprüft, ob string 2 (content aus der Liste) <0 bzw. = 0 ist. Wenn ja soll nur string1 als neues Element der Liste hinzugefügt werden, wenn string1 > string2 ist, soll die whileschleife den Zeiger rechts folgen und das rechte nachbarelement prüfen. solange bis string1 < string2 bzw. = string2 ist.

Vor der Whileschleife soll erst einmal geprüft werden, ob vielleicht nur ein einziges Element in meiner Liste ist, welches auch überprüft werden soll, ob dieses > oder = dem string1 ist. nur dann soll ein 2. Wort hinzugefügt werden.

Die While-Scheife soll ja nur dazu dienen, die einzelnen Wörter in der Liste zuprüfen. Und das nur wenn mehr als ein Wort in der Liste vorhanden ist.
-> Da ich eine Liste habe, die auf sich selbst zeigen tut (rotierende Liste) gilt als Abbruchbedingung (kopf != (aktl_Elem = aktl_Elem -> left)), um nicht endlos in meiner Liste zurotieren.

Die Ausgabe ist, das er mir nur das 1. Wort meiner txt-Datei ausgibt:

Sehr 1
Sehr 1
...
Sehr n
^C
../C/Beleg& _
 
Zuletzt bearbeitet:
Also so kommen wir nicht weiter.

Du solltest ein vollständiges Minimal-Beispiel machen. (Eingabedatei, Quellcode, Ausgabedatei).

Grundsätzlich ist dein Code viel zu unüberschaubar und zu kompiliziert. Zuviele Fallunterscheidungen.

Du mußt doch nur die Einfügeposition suchen und dann einfügen.

Gruß
 
Zurück