bitte um hilfe - hashing
-
for(i=0;i<M;i++)
{
heads[i] = (struct node*) malloc(sizeof(struct node));
heads[i]->key = (char *)malloc((SKEYLEN + 1)*sizeof(char));
heads[i]->next=NULL;
-
geht doch viel einfacher: "for(i=0;i<M;++i) heads[i]=NULL;"
(NULL steht dann für Listenende - d.h. du mußt bei deinen Suchprozeduren abbrechen, wenn pos==NULL erreicht ist)
-
so würde meine schleife aussehen ist diese korrekt?
unsigned hash(char *key) { int HashWert = 0; int i; for (i = 0; i < SKEYLEN; i++) { HashWert = (HashWert * (64 + (int)key[i]))%211; } return HashWert;
-
*vergleicht die Funktion mit der Aufgabe* Die Klammern sind falsch gesetzt und laut Aufgabe solltest du mit unsigned rechnen. Außerdem solltest du deine Konsanten auch nutzen (wenn du später mal die Größe des Feldes ändern willst, stehst du sonst vor einem Problem).
-
unsigned int i, HashWert = 0; for (i = 0; key[i]; i++) { HashWert = (HashWert * 64 + key[i])%211); } return HashWert; }
-
Fast
unsigned int i, HashWert = 0; for (i = 0; /*key[i]*/i<SKEYLEN; i++) { HashWert = (HashWert * 64 + key[i])%/*211*/M); } return HashWert; }
-
hehe noch ein hänger:
// TODO: Head-Element der zu <key> gehörenden Liste in <pos> speichern
pos = ??thx für die antworten
-
zu key gehört die Liste mit dem Index hash(key) - deren Kopf findest in ..dreimal darfst du raten.. heads.
(Achja, selber denken wäre auch nicht verkehrt :))
-
h = hash(key); struct node* new_node; if(!(new_node = (struct node*)malloc(sizeof(struct node)))) return; if(!(new_node->key = (char *)malloc((SKEYLEN + 1)*sizeof(char)))) return; new_node->info = info; new_node->key = key; new_node->next = heads[h]->next; heads[h]->next = new_node;
-
sizeof(char) ist per Definition 1
Und eventuell solltest du, wenn das Zuweisen von key schiefgeht, auch den reservierten Speicher wieder freigeben.