Hash-Funktion



  • Hallo,

    ich schreibe gerade für mein Studium eine Hash-Funktion (mit Struct und Pointer).
    Sie funktioniert auch "teilweise" ordentlich, nur kann ich, nachdem ich eine gewisse Anzahl an Namen eingegeben habe, diese nicht mehr finden, d.h. bei der Listen-Übergabe in der Funktion void print_student hapert es...
    Aber seht selbst...

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define ANZAHL 10
    
    typedef struct student Student;
    struct student
    {
    	int matr_nr;
    	char *name;
    
    	struct student *next;
    
    };
    
    void insert_student(char *text, int nummer, struct student *list[ANZAHL]);
    void search_student(int nummer);
    int hash_funktion(int nummer);
    void print_student(int nummer, struct student *list[ANZAHL]);
    
    int main()
    {
    
    	struct student *list[ANZAHL];
    
    	int nummer;
    	char text[80];
    
    	printf("Studenten eingeben: \n");
    	while(1)
    	{
    	printf("Geben Sie eine Nummer ein: ");
    	scanf("%d", &nummer);
    		if(nummer == 0) break;
    
    	printf("Geben Sie Ihren Namen ein: ");
    	scanf("%s", text);
    	insert_student(text, nummer, &list);
    	}
    
    	printf("Studenten suchen: \n");
    	while(1)
    	{
    		printf("Geben Sie eine Matr.-Nr. ein: \n");
    		scanf("%d", &nummer);
    		if(nummer == 0) break;
    		print_student(nummer, &list[hash_funktion(nummer)]);
    
    	}
    
    	return 0;
    
    }
    
    void insert_student(char *text, int nummer, struct student *list[ANZAHL])
    {
    	//struct student *list[ANZAHL];
    
    	Student *ptr;
    	int hash_adresse = hash_funktion(nummer);
    	ptr = list[hash_adresse];
    
    	while(ptr != 0)
    	{
    		if(strcmp(text, ptr->name) == 0) //Gleicher Name
    			if(ptr->matr_nr == nummer)
    			{
    				printf("%s mit Matr.Nr.: %d ist bereits vorhanden\n", text, nummer);
    				return ptr;
    			}
    		ptr = ptr->next;
    	}
    
    	/*Speicher für neues Element allozieren*/
    	ptr = malloc(sizeof(Student));
    	if(ptr == 0)
    	{
    		printf("Kein Speicherplatz mehr vorhanden!\n");
    		return 0;
    	}
    	ptr->matr_nr = nummer;
    	ptr->name = (char *) malloc(sizeof(char) * strlen(text) + 1);
        strcpy(ptr->name, text);
    
    	ptr->next = list[hash_adresse];
    	list[hash_adresse] = ptr;
    
    	return ptr;
    
    }
    
    void search_student(int nummer)
    {
    	struct student *ptr;
    	int hash_adresse = hash_funktion(nummer);
    
    	while(ptr != 0)
    	{
    		if(ptr->matr_nr == nummer)
    			printf("Matr.Nr. fuer %s ist %d\n", ptr->name, nummer);
    		ptr = ptr->next;
    	}	
    
    }
    
    int hash_funktion(int nummer)
    {
    	int hash_adresse;
    	hash_adresse = nummer % 10;
    
    	return hash_adresse;
    
    }
    
    void print_student(int nummer, struct student *list[ANZAHL])
    {
    
        Student *iter;
        for(iter = list[ANZAHL]; iter != NULL; iter = iter->next) {
            if(iter->matr_nr == nummer) {
                printf("%s\n", iter->name);
                return;
            }
        }
        printf("Mit dieser Nummer wurde kein Student gefunden!\n");
    }
    

    Kann mir einer einen Tipp geben?

    Vielen Dank!



  • Die Hashfunktion ist zu schlecht, es gibt bessere und für deine offensichtlich nur wenigen Elemente unnötig.



  • Die Vorführaufgabe ist so gestellt, Angabe ist Angabe und muss eben so gemacht werden!



  • Brauchst du nicht eigentlich 2 for-Schleifen, einmal fuer die Bins/Buckets/ ... also die Container fuer Hashwert 0-9 und dann einmal fuer den jeweiligen Inhalt der Container.



  • Das Argument list ist eigentlich vom Typ struct student**. Doppelte Zeiger sind für Anfänger oft verwirrend.

    Wenn du Zeile 53 zu

    print_student(nummer, list[hash_funktion(nummer)]);
    

    Zeile 130 zu

    void print_student(int nummer, struct student *list)
    

    und Zeile 134 zu

    for(iter = list; iter != NULL; iter = iter->next) {
    

    änderst, dann sollte es (hoffentlich) funktionieren.


Anmelden zum Antworten