Kapitel 8: Datenstrukturen
Datenstrukturen sind die Hälfte
aller Programmierung
Was ist eine
Datenstruktur?
Ein Mittel die Daten des
Programms so zu speichern, dass ihre Beziehung zueinander in der Struktur selbst klar ist
Beispiel: Reihungen: Daten stehen nebeneinander im Speicher
Beispiel: Strukturen: Daten
Es gibt 2 Varianten
Statische Datenstrukturen, wie Reihungen und Strukturen, die vom Compiler alloziert werden
Dynamische Datenstrukturen, die zur Laufzeit aufgebaut werden.
Dazu: Heapverwaltung
Rekursive
Datenstrukturen
Um dynamische Datenstrukturen zu bauen, werden über Zeiger
Strukturen rekursiv definiert
Beispiele: Knoten aus Listen und Bäume, Graphen, usw. müssen miteinander verkettet werden
Knoten werden nach Bedarf
Beispiel: Knotentyp von Listenelemente
typedef struct Knoten{
int Data1;
char *Data2;
struct Knoten *Naechster;
} KNOTEN;
Knotenelement einer Liste
Data1 Data2
Naechster
Bemerkung
Die Struktur
KNOTENenthält normale Felder
Die Struktur
KNOTENenthält auch Zeiger auf Strukturen vom Typ
KNOTEN
Wie alle Zeiger, müssen diese
Felder zur Laufzeit belegt werden
Beispiel: Kleine Liste bauen
...
KNOTEN s,t,u, *Liste;
s.Data1 = 1; s.Data2 = "Alboin";
t.Data1 = 2; t.Data2 = "Gisulf";
u.Data1 = 3; t.Data2 = "Theodolinda";
...
s.Naechster = &t;
t.Naechster = &u;
u.Naechster = NULL;
Liste = &s;
Eine verkettete Liste
Alboin 1 2
Gisulf Theodolinda 3
Bemerkungen
Die Strukturvariable sind alle statisch erklärt
Besser: Nach Bedarf mit
malloc()allozieren
Man merke die Verkettung
Man merke den
Universellzeigerwert NULL
Beispiel
Dynamisches Einfügen eines Knoten in der Liste
s.Naechster = (KNOTEN *)malloc(sizeof(KNOTEN));
s.Naechster.Data1 = 4;
s.Naechster.Data2 = "Childebert";
s.Naechster.Naechster = t;
Einfügen “Childebert”
Alboin 1
2
Gisulf Theodolinda 3
Childebert 4
Datentypdefinitionen in Header-Datei
Wie alle
typedefs: "list.h"
typedef ... DATA;
typedef struct Knoten{
DATA d;
struct Knoten *Naechster;
} ELEMENT, *LIST_POINTER;
Im Anwendungsprogramm
#include "list.h"
int main() {
LISTPOINTER Header, p;
Header = (LISTPOINTER) malloc(sizeof(ELEMENT));
Header->d.Data1 = 1;
Header->d.Data2 = "Alboin";
Header->Naechster = NULL;
...
Listenstrukturen
Verkettete Listen mit Operationen:
Liste erzeugen
Suchen eines Elementes in die Liste
Einfügen eines Element in die Liste
Entfernen eines Elements aus der
Liste
Einfügen in eine verkettete Liste
12
12
17
17
44
44 Ansfrit
Ansfrit
Grimoald
Grimoald
Grasulf
Grasulf
… ?
…
p q
a)
b)
Einfügen
Erster Versuch
void einfuegen(LISTPOINTER p, LISTPOINTER q) {
q->Naechster = p->Naechster;
p->Naechster = q;
}
Knoten
*qwird nach Knoten
*pund vor Knoten
Problem
Was passiert, wenn
p = NULList?
In diesem Fall ist die Operation
p->Naechster
unzulässig
Besser
void einfuegen(LISTPOINTER p, LISTPOINTER q) {
if (p == NULL) p = q;
else{
q->Naechster = p->Naechster;
p->Naechster = q;
} }
Verkettete Liste Typ Queue (Schlange)
Die Liste wird mit zwei Zeiger verwaltet:
Zeiger
VORNauf das erstes Element
Zeiger
HINTENauf das letztes Element
Elemente werden hinten eingefügt,
Struktur einer Schlange
…
VORN HINTEN
Die Datei queue.h
#include "list.h"
typedef ELEMENT QUEUEELEMENT;
typedef LISTPOINTER QUEUEPOINTER;
QUEUEPOINTER VORN;
QUEUEPOINTER HINTEN;
Schlangenoperationen
Leere Schlange initialisieren
Schlange mit 1 Element
*dataPtrinitialisieren
VORN = HINTEN = NULL;
VORN = HINTEN = (QUEUEPOINTER)malloc(sizeof(QUEUELEMENT));
Schlangenoperationen (Fortsetzung)
Element vorn aus der Schlange entfernen
if (VORN == NULL){fprintf(stderr, "Nein\n");
exit(1);}
else{
DATA temp;
QUEUEPOINTER where = VORN;
temp = VORN->d;
if (VORN == HINTEN) HINTEN = NULL;
Schlangenoperationen (Fortsetzung)
Element von Typ
DATA,durch
dataPtrgegeben, hinten einfügen
if (VORN == NULL){
VORN = (QUEUEPOINTER)malloc(sizeof(QUEUEELEMENT));
VORN->d = *dataPtr; HINTEN = VORN;
HINTEN->Naechster = NULL;}
else{
HINTEN->Naechster =
(QUEUEPOINTER)malloc(sizeof(QUEUEELEMENT));
Im Anwendungsprogramm
#include "queue.h"
...
int main() {
DATA Gothenzeug;
SchlangeInit();
Gothenzeug.Data1 = 25;
Gothenzeug.Data2 = "Theodohad";
SchlangeInsert(&Gothenzeug);
...
}