MatthiasRöhm Blatt8
A
Allgemeine Informatik III / Systemnahe
Software I (WS 2008)
Abgabetermin:09.12.2008
1 Hashes
IndieserAufgabesollvonIhneneinHashimplementiertwerden.EinHashisteineDatenstruk-
turdieeserlaubt, übereinen Shlüssel, direktaufdiediesemShlüsselzugeordneten Werte
zuzugreifen.EinHash-ElementbestehtsomitauseinemShlüssel/WertPaar.JederShlüssel
darfnureinMalimHashvorkommen.DerZugriaufeinenWerterfolgtsomitimmerüber
desseneindeutigenShlüssel.InternwerdendieDateneinesHashesineinemVektorgespeihert.
InterneRepräsentationeinesHash.
EineHashfunktionhashbildetjedenmöglihenShlüsselaufeinenIndeximVektorab.Eskann
vorkommen,dassdieHashfunktionhashfürzweivershiedeneShlüsseldengleihenIndex ermittelt.ErzeugtdieHashfunktionfürzweiShlüsselk1, k2mit k16=k2dengleihenIndex hash(k1) =hash(k2) =i,sowirdanderPositionidesVektorseinZeigeraufeineListemit
denElementene1unde2gespeihert.DieseListenimmtnunauhalleweiterenElementedes Hashesauf,fürdiedieHashfunktiondenIndexierzeugt.
2 Aufgabe (10 Punkte)
ShreibenSieeinHash-Modulhash.,aufBasisderfolgendenHeader-Dateihash.h,indem
StringsalsShlüsselundIntegeralsWertegespeihertwerdensollen.EinElementbestehtalso
auseinemString,einemIntegerundeinemZeigeraufdasnähsteElementderListe.IhrModul
solldiefolgendenFunktionenimplementieren,wobeidieHashfunktionhashgegebenist:
#ifndef HASH_H
#define HASH_H
#inlude <stdio.h>
#inlude <string.h>
#inlude <stdlib.h>
typedef strut _hash *Hash;
typedef strut _element *Element;
strut _element {
har *key;
int value;
Element next;
};
strut _hash {
unsigned int size; //Size of vetor
Element *entries; //Pointer to vetor
};
extern unsigned int hash(har *key, unsigned int size);
extern void reate_hash(Hash *h, unsigned int size );
extern int put( Hash h, har *key, int value );
extern int get( Hash h, har *key, int *value );
extern int hange_value( Hash h, har *key, int value );
extern void print( Hash h );
#endif
• unsigned int hash(char ∗key, unsigned int size);
gibteinenIndexfürdenShlüsselkeyzwishen0undsize−1zurük.DieseFunktionist
imAnhangbeshrieben!
• void create(Hash ∗h, unsigned int size);
erzeugteinenHashmiteinemVektorderGroÿesize.sizesollteeinePrimzahlsein.
• int put(Hash h, char ∗key, int value);
einShlüssel/WertPaarwirdindenHasheingefügt.FallsderShlüsselshonvorhanden
ist,gibtdieFunktion0zurük.Ansonsten1.
• int get(Hash h, char ∗key, int ∗value);
der zu dem Shlüsselkey gehörende Wert wirdaus dem Hash gelesen undin die als
ZeigerübergebeneVariable∗valuegespeihert.FallsderShlüsselnihtexisiertgibtdie Funktion0zurük.Ansonsten1.
• int change_value(Hash h, char ∗key, int value);
verändertdenWertdesElementsmitdemShlüsselskey.FallsderShlüsselnihtexisiert
gibtdieFunktion0zurük.Ansonsten1.
• void print(Hash h);
alleShlüssel/WertPaaredesHasheswerdenandieStandardausgabeausgegeben.
DieHeader-Dateihash.hunddieimAnhangaufgeführteHash-Funktionkönnenvonder
Vorlesungsseiteheruntergeladenwerden.ZumTesten Ihres Moduls können Sievon derVor-
lesungsseiteeinenQuellodezurBestimmungderWorthäugkeiteinesTextesherunterladen.
DasProgrammbenötigtnatürliheinkorrektfunktionierendesHash-Modulhash..
3 Anhang
//Die Hash-Funktion zur Berehnung des Hashwerts eines Strings
unsigned int hash(har *key, unsigned int size) {
unsigned int h = 0;
while(*key != '\0') {
h = 31 * h + *key;
key++;
}
return (h % size);
}