Progkurs2017-Tag01 Aufgabe 1. Schreibe eine Funktion, die mithilfe von qsort ein Array von Strings lexikographisch (wie im Telefonbuch) sortiert. Das heißt, dass erst nach der ersten Stelle sortiert wird, dann nach der Zweiten usw. In der <string.h> liegt eine Vergleichsfunktion für diese Situation vor: strcmp. Als Beispiel hier eine lexikographisch sortierte Liste: 1 2 3 4 5 6 7 8 1 10 133 2 2344 Hallo Thor Tor Aufgabe 2. Lese noch einmal im Skript die Sektion über doppelt verkettete Listen. Implementiere nun Doppelt-verkettete Listen, die double-Variablen speichern, d.h. implementiere die .c-Datei zu folgender Headerdatei list.h: 1 2 #ifndef LIST_H #define LIST_H 3 4 5 6 7 8 typedef struct NODE { struct NODE ∗next; struct NODE ∗prev; double data; } NODE; 9 10 11 12 13 typedef struct { NODE ∗first; NODE ∗last; } LIST; 14 15 16 LIST ∗list_create(); void list_free(LIST ∗L); /∗ Liste erstellen ∗/ /∗ Speicher freigeben ∗/ 17 18 19 /∗ Fuege hinter cursor einen neuen Knoten in die Liste ein. Falls cursor gleich NULL ist, fuege am Anfang http://fsmath.uni-bonn.de/de/AdvProgkurs2017 C-Programmierkurs Mathematik 2017 für Fortgeschrittene von Clelia, Johannes und Felix Progkurs2017-Tag01 20 21 22 23 der Liste ein. Gibt einen Pointer auf das neu eingefuegte Element zurueck, oder NULL im Fehlerfall. ∗/ NODE ∗list_insert(LIST ∗L, NODE ∗cursor, double data); 24 25 26 /∗ Loesche einen Knoten aus der Liste. ∗/ void list_delete(LIST ∗L, NODE ∗del); 27 28 #endif Aufgabe 3. Lese noch einmal im Skript die Sektion über Hashtabellen. Implementiere nun Hashtabellen, die double-Variablen speichern, d.h. implementiere die .c-Datei zu der unten gegebenen Headerdatei hash.h. Tip: Hierfür benötigst du verkettete Listen, die beliebige Daten (heißt void *) speichern können. Du kannst die Lösung von der Listen-Aufgabe entsprechend anpassen. 1 2 #ifndef HASHTABLE_H #define HASHTABLE_H 3 4 5 #include "list.h" /∗ Wir benutzen die verketteten Listen von weiter oben. ∗/ 6 7 struct HASH_TABLE; /∗ Ist weiter unten definiert. ∗/ 8 9 10 11 12 13 /∗ Ein Knoten der Hashtabelle. ∗/ typedef struct { int key; /∗ Der Schluessel ∗/ double data; /∗ Die Daten ∗/ } HASH_NODE; 14 15 16 17 18 19 /∗ Die vom User definierte Hashfunktion, neben einem ∗ Schluessel ist noch die Hashtabelle selbst ∗ Teil des Input. ∗/ typedef int (∗hashfunc) (int key, struct HASH_TABLE ∗ H); 20 21 typedef struct HASH_TABLE http://fsmath.uni-bonn.de/de/AdvProgkurs2017 C-Programmierkurs Mathematik 2017 für Fortgeschrittene von Clelia, Johannes und Felix Progkurs2017-Tag01 22 23 24 25 26 27 28 /∗ Das Array von Listen H[i] ∗/{ LIST ∗∗buckets; /∗ Die Laenge des Arrays ∗/ int num_buckets; /∗ Die Hashfunktion f ∗/ hashfunc hashfunktion; } HASH_TABLE; 29 30 31 32 33 /∗ Erstelle eine Hashtabelle mit vorgegebener Anzahl ∗ an Buckets und Hashfunktion. ∗/ HASH_TABLE ∗ hashtable_create (int num_buckets, hashfunc f); 34 35 36 /∗ Gebe den Speicher einer Hashtabelle wieder frei. ∗/ void hashtable_free (HASH_TABLE ∗H); 37 38 39 40 41 42 43 44 /∗ Erstelle einen neuen Knoten und fuege ihn in eine ∗ Hashtabelle ein. Gibt einen Pointer auf den neu ∗ eingefuegten Knoten zurueck, ∗ oder NULL bei einem Fehler. ∗/ HASH_NODE ∗ hashtable_insert (HASH_TABLE ∗H, int Schluessel, double data); 45 46 47 48 49 50 51 /∗ Suche den Knoten mit vorgegebenem Schluessel in ∗ einer Hashtabelle. Gibt einen Pointer auf den ∗ Knoten zurueck, wenn dieser in der Tabelle ∗ gespeichert war, NULL sonst. ∗/ HASH_NODE ∗ hashtable_get (HASH_TABLE ∗H, int Schluessel); 52 53 54 55 /∗ Loesche den Knoten mit vorgegebenem Schluessel ∗ aus der Tabelle. ∗/ void hashtable_delete (HASH_TABLE ∗H, int Schluessel); 56 57 #endif http://fsmath.uni-bonn.de/de/AdvProgkurs2017 C-Programmierkurs Mathematik 2017 für Fortgeschrittene von Clelia, Johannes und Felix