• Keine Ergebnisse gefunden

Was ist eine

N/A
N/A
Protected

Academic year: 2021

Aktie "Was ist eine "

Copied!
26
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Kapitel 8: Datenstrukturen

Datenstrukturen sind die Hälfte

aller Programmierung

(2)

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

(3)

Es gibt 2 Varianten

„

Statische Datenstrukturen, wie Reihungen und Strukturen, die vom Compiler alloziert werden

„

Dynamische Datenstrukturen, die zur Laufzeit aufgebaut werden.

Dazu: Heapverwaltung

(4)

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

(5)

Beispiel: Knotentyp von Listenelemente

typedef struct Knoten{

int Data1;

char *Data2;

struct Knoten *Naechster;

} KNOTEN;

(6)

Knotenelement einer Liste

Data1 Data2

Naechster

(7)

Bemerkung

„

Die Struktur

KNOTEN

enthält normale Felder

„

Die Struktur

KNOTEN

enthält auch Zeiger auf Strukturen vom Typ

KNOTEN

„

Wie alle Zeiger, müssen diese

Felder zur Laufzeit belegt werden

(8)

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;

(9)

Eine verkettete Liste

Alboin 1 2

Gisulf Theodolinda 3

(10)

Bemerkungen

„

Die Strukturvariable sind alle statisch erklärt

„

Besser: Nach Bedarf mit

malloc()

allozieren

„

Man merke die Verkettung

„

Man merke den

Universellzeigerwert NULL

(11)

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;

(12)

Einfügen “Childebert”

Alboin 1

2

Gisulf Theodolinda 3

Childebert 4

(13)

Datentypdefinitionen in Header-Datei

Wie alle

typedefs

: "list.h"

typedef ... DATA;

typedef struct Knoten{

DATA d;

struct Knoten *Naechster;

} ELEMENT, *LIST_POINTER;

(14)

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;

...

(15)

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

(16)

Einfügen in eine verkettete Liste

12

12

17

17

44

44 Ansfrit

Ansfrit

Grimoald

Grimoald

Grasulf

Grasulf

?

p q

a)

b)

(17)

Einfügen

Erster Versuch

void einfuegen(LISTPOINTER p, LISTPOINTER q) {

q->Naechster = p->Naechster;

p->Naechster = q;

}

Knoten

*q

wird nach Knoten

*p

und vor Knoten

(18)

Problem

„

Was passiert, wenn

p = NULL

ist?

„

In diesem Fall ist die Operation

p->Naechster

unzulässig

(19)

Besser

void einfuegen(LISTPOINTER p, LISTPOINTER q) {

if (p == NULL) p = q;

else{

q->Naechster = p->Naechster;

p->Naechster = q;

} }

(20)

Verkettete Liste Typ Queue (Schlange)

„

Die Liste wird mit zwei Zeiger verwaltet:

„

Zeiger

VORN

auf das erstes Element

„

Zeiger

HINTEN

auf das letztes Element

„

Elemente werden hinten eingefügt,

(21)

Struktur einer Schlange

VORN HINTEN

(22)

Die Datei queue.h

#include "list.h"

typedef ELEMENT QUEUEELEMENT;

typedef LISTPOINTER QUEUEPOINTER;

QUEUEPOINTER VORN;

QUEUEPOINTER HINTEN;

(23)

Schlangenoperationen

„

Leere Schlange initialisieren

„

Schlange mit 1 Element

*dataPtr

initialisieren

VORN = HINTEN = NULL;

VORN = HINTEN = (QUEUEPOINTER)malloc(sizeof(QUEUELEMENT));

(24)

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;

(25)

Schlangenoperationen (Fortsetzung)

„

Element von Typ

DATA

,durch

dataPtr

gegeben, 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));

(26)

Im Anwendungsprogramm

#include "queue.h"

...

int main() {

DATA Gothenzeug;

SchlangeInit();

Gothenzeug.Data1 = 25;

Gothenzeug.Data2 = "Theodohad";

SchlangeInsert(&Gothenzeug);

...

}

Referenzen

ÄHNLICHE DOKUMENTE

I Es m¨ ussen alle 3 Pr¨ aferenzen angegeben werden..M. R¨ oger (Universit¨ at Basel) Algorithmen und

April Nachbesprechung Bäume, Priorityqueues, Heap, Heapsort Plenum (Zoom)..

Die Operationen Suchen und Einf¨ ugen in einen 2-3 Baum mit N Schl¨ usseln besuchen im schlechtesten Fall log 2 (N) Knoten. R¨ oger (Universit¨ at Basel) Algorithmen und

I Entscheidungsprobleme: Ja/Nein-Antwort gesucht Gegeben gewichteter Graph, Knoten s, t und Zahl K.. Gibt es einen Pfad von s nach t mit Kosten h¨

I In der Praxis ist Union-Find meist schneller, da der Graph f¨ ur viele Zwecke nicht vollst¨ andig aufgebaut werden muss. I Ist der Graph schon aufgebaut, kann

Außerdem sollen Funktionen ¨ uber Bin¨ arb¨ aume definiert und Aussagen dar¨ uber gezeigt werden. Dazu d¨ urfen Sie auch automatische

Sie sind jetzt aber an einer Hochschule, und dort gibt es nicht f ¨ur jeden Arbeitsschritt eine separate Einladung und Anleitung,. denn das Studienziel ist, daß Sie

• wer mittels Bibliotheksfunktion sortiert, macht es sehr wahrscheinlich auch falsch — denn er benutzt eine Liste, meint aber eine Menge, f¨ur die gibt es deutlich