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.