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 nur

    ptr->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.


Anmelden zum Antworten