Hallo!
Ich habe ein weiteres Problem bei meinem Programm.
Bisher kann ich mit dem Programm Filme anlegen, einzelne Filme löschen, alle Filme löschen und alle Filme speichern. Jetzt würde ich gerne durch eine binäre Suche, einzelne Filme in der Liste durch eine Suchfunktion, die bei mir Test erstmal heißt, finden lassen.
Die Funktion sieht folgender Maßen aus:
"Binäre Suche" 1:
test1(), die ich gerne nutzen würde, wird der Zeiger mid nur bei einer ungeraden Zahl an Listenelementen richtig berechnet, also ein Filmtitel angezeigt, und die Filme auch gefunden. Doch bei einer geraden zahl wird mir nicht mehr der Filmtitel angezeigt, sondern was zwischen den Beiden Filmen 2 und 3 ,wenn es 4Filme sind, angezeigt. Das war bei mir dann das Filmstudio des Filmes.
"Binäre Suche" 2:
Was mich nur an dieser Funktion test2() nervt, ist die Tatsache, dass der Zeiger mid immer wieder am Anfang startet und die ganze Liste durchläuft. Doch das ist die einzige Funktion bei der alle Filme gefunden werden. Ich habe auch schon probiert diese Funktion so zu ändern, dass mid dort startet wo der Zeiger stehengeblieben ist, doch dann wird durch left und right nicht die gesamte Liste durchsucht, da left zu früh kleiner right wird oder gleich 0.
Ich habe schon sehr viel rumprobiert, aber ich weiß nicht mehr weiter. Ich würde mich freuen, wenn mir jemand bei meinem Problem helfen könnte, denn ich möchte gerne diese Suchfunktion auch zum Einsetzen neuer Filme später nutzen, sofern das möglich ist.
Hier ist nochmal das Programm zum runterladen
------->>>>>>>Programm<<<<<<<<<<------------
Ich habe ein weiteres Problem bei meinem Programm.
Bisher kann ich mit dem Programm Filme anlegen, einzelne Filme löschen, alle Filme löschen und alle Filme speichern. Jetzt würde ich gerne durch eine binäre Suche, einzelne Filme in der Liste durch eine Suchfunktion, die bei mir Test erstmal heißt, finden lassen.
Die Funktion sieht folgender Maßen aus:
"Binäre Suche" 1:
test1(), die ich gerne nutzen würde, wird der Zeiger mid nur bei einer ungeraden Zahl an Listenelementen richtig berechnet, also ein Filmtitel angezeigt, und die Filme auch gefunden. Doch bei einer geraden zahl wird mir nicht mehr der Filmtitel angezeigt, sondern was zwischen den Beiden Filmen 2 und 3 ,wenn es 4Filme sind, angezeigt. Das war bei mir dann das Filmstudio des Filmes.
C:
void test1(char *title, struct movie *start, struct movie *end){
struct movie *mid;
if(!(strcmp(start->title, end->title) > 0)){
mid = (start + ((end -start) >> 1));
printf("Start->Title: %s, End->Title: %s\n", start->title, end->title);
printf("Mid->Title: %s\n", mid->title);
if(strcmp(title, mid->title) == 0) {
printf("Film \"%s\" gefunden\n", mid->title);
}
else if(strcmp(title, mid->title) < 0) {
end = mid->previous;
test1(title, start, end);
}
else{
start = mid->next;
test1(title, start, end);
}
}
}
"Binäre Suche" 2:
Was mich nur an dieser Funktion test2() nervt, ist die Tatsache, dass der Zeiger mid immer wieder am Anfang startet und die ganze Liste durchläuft. Doch das ist die einzige Funktion bei der alle Filme gefunden werden. Ich habe auch schon probiert diese Funktion so zu ändern, dass mid dort startet wo der Zeiger stehengeblieben ist, doch dann wird durch left und right nicht die gesamte Liste durchsucht, da left zu früh kleiner right wird oder gleich 0.
C:
void test2(char *title, int left, int right) {
struct movie *mid;
int i, middle;
if( left < right) {
mid = start;
middle = (left+right) / 2;
for(i = 0; i < middle; i++)
mid = mid->next;
printf("Mid->Title: %s\n", mid->title);
if(strcmp(title, mid->title) == 0)
printf("Film \"%s\" gefunden\n", mid->title);
else if(strcmp(title, mid->title) < 0) {
right = middle-1;
test2(title, left, right);
}
else {
left = middle+1;
test2(title, left, right);
}
}
else
printf("Film wurde nicht gefunden!!\n\n");
}
Ich habe schon sehr viel rumprobiert, aber ich weiß nicht mehr weiter. Ich würde mich freuen, wenn mir jemand bei meinem Problem helfen könnte, denn ich möchte gerne diese Suchfunktion auch zum Einsetzen neuer Filme später nutzen, sofern das möglich ist.
Hier ist nochmal das Programm zum runterladen
------->>>>>>>Programm<<<<<<<<<<------------
Zuletzt bearbeitet: