Frage zu Funktionen
-
Hi Leute!
Ich versuche in meinem Programm eine Suchfunktion zu integrieren. Sie durchsucht eine verkettete Liste nach einem passendem Geburtstag.
Die sieht gerade so aus:struct dyn_persdat *daten_suchen(char *array) { struct dyn_persdat *ptr; ptr = start_ptr; while((ptr != NULL) && strcmp(ptr->geburtstag, array)) ptr = ptr->next; return ptr; }
Der start_ptr zeigt auf den anfang der Liste.
Die Funktion gibt am Ende einen Zeiger auf die Struktur dyn_persdat aus.
Sie kann aber leider nur nach Geburtstag suchen. Ich frage mich wie ich die Funktion verändern muss damit man auch nach Personalnummer suchen kann, oder nach Name.
Die struktur sieht so aus:struct persdat { char personalnummer[21]; char *Name; char *Geburtstag }
Ich müsste an die Funktion irgentwie noch einen Parameter uebergeben, dass in strcmp() nicht "ptr->geburtstag" steht, sondern was anderes halt.
-
Sorry, hab einen kleinen Fehler gemacht:
Die struktur sieht so aus:struct dyn_persdat { char personalnummer[21]; char *geburtstag; char *name; }
Wollte nochmal auf nummer sicher gehen.
tschö
-
Das ist doch keine verkettete Liste, oder? Die verketteten Listen, die ich bisher gesehen habe bestanden aus Strukturen, die einen Zeiger auf eine gleiche Struktur enthielten:
struct dyn_persdat { char personalnummer[21]; char *geburtstag; char *name; struct dyn_persdat *next; };
Sonst macht ja die Zuweisung
ptr = ptr->next;
keinen Sinn.
Wenn Du jetzt nach einem Namen suchen willst, musst Du doch nurptr->geburtstag
durch
ptr->name
ersetzten. Dito mit Personalnummer. (Natuerlich ohne die Klammern!)
-
Ändere deine Funktion wie folgt ab
#define PERSNUM 0 #define GEBDAT 1 #define NAME 2 struct dyn_persdat *daten_suchen(char *array,int typ) { struct dyn_persdat *ptr; ptr = start_ptr; switch (typ) { case GEBDAT: while((ptr != NULL) && strcmp(ptr->geburtstag, array)) ptr = ptr->next; break; case GEBDAT: while((ptr != NULL) && strcmp(ptr->name, array)) ptr = ptr->next; break; ..... } return ptr; }
-
Sorry, Leute. Hab den next-pointer auch vergessen.
Ihr habt das schon richtig erkannt.
So wie PAD das vorgeschlagen hat funktioniert es.
Vielen Dank!!!
-
Besser so:
#include <stddef.h> enum { SUCHE_PERSNUM, SUCHE_GEBDAT, SUCHE_NAME }; typedef struct dyn_persdat PERSON; PERSON* DatenSuchen(char* vgl, int typ) { PERSON* curr; //Offset bestimmen int offset = -1; switch(typ) { case SUCHE_PERSNUM: offset = offsetof(PERSON, personalnummer); break; case SUCHE_GEBDAT: offset = offsetof(PERSON, geburtstag); break; case SUCHE_NAME: offset = offsetof(PERSON, name); break; } if(offset < 0) //Ungueltiger Typ return 0; //Jetzt suchen! curr = start_ptr; while(curr && strcmp(((char*) curr) + offset, vgl)) curr = curr->next; return curr; }
- Ungültige Typ-Parameter werden abgefangen
- Die Aktion wird nur an einer Stelle implementiert
- Besser lesbare Bezeichner
-
@Krösus kannte size_t offsetof( structName, memberName ); bisher nicht somit hast du recht.
Ich ging allerdings davon aus, das es einen default Fall gibt.