Progkurs2017-Tag01 Aufgabe 1. Schreibe eine Funktion, die

Werbung
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
Herunterladen