Praxis der Programmierung

Ähnliche Dokumente
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Binärbäume: Beispiel

Advanced Programming in C

C- Kurs 09 Dynamische Datenstrukturen

Einführung in die Programmierung für Physiker. Die Programmiersprache C Strukturen ("struct...")

Algorithmen und Datenstrukturen

12. Dynamische Datenstrukturen

Einführung in die Programmierung zusammengesetzte Datentypen, dynamischer Speicher

Programmieren I. Kapitel 13. Listen

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Algorithmen und Datenstrukturen (für ET/IT)

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

3. Übungsblatt zu Algorithmen I im SoSe 2017

Praxis der Programmierung

Hochschule Darmstadt Informatik-Praktikum WS 2017/2018 WIng Bachelor 6. Aufgabenblatt Zeiger, verkettete Liste, Dateieingabe und -ausgabe

Informatik II, SS 2014

Algorithmen und Datenstrukturen (für ET/IT) Wiederholung: Ziele der Vorlesung. Wintersemester 2012/13. Dr. Tobias Lasser

Programmieren in C. Rekursive Strukturen. Prof. Dr. Nikolaus Wulff

Zeiger und dynamischer Speicher

ADT: Verkettete Listen

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

[Strukturen] Vereinbarung Verwendung Operationen mit struct Zeiger auf struct Strukturen auf dem Heap Datenstrukturen gebildet mit struct union

6. Verkettete Strukturen: Listen

Grundlagen der Informatik 12. Strukturen

Einführung in die Programmierung Konstanten, dynamische Datenstrukturen. Arvid Terzibaschian

Nachname:... Vorname:... MatrNr.:... Klausur PR2. int main() { char Text[] = "Sehr geehrte Damen und Herren!"; char *tmp=text;

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Programmierkurs C/C++

Kapitel 12: Induktive

Musterlösung. Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

FH Ravensburg-Weingarten Schriftlich Prüfung Programmieren

ALP II Dynamische Datenmengen Datenabstraktion

Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

Betriebssysteme, Rechnernetze und verteilte Systeme 1. Crashkurs C (2)

Vorlesung Datenstrukturen

Nachname: Vorname: Matr.-Nr.: Punkte: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende Struktogramm zur Berechnung von sin(x) mit Hilfe einer Reihe.

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

Geordnete Binärbäume

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

3 Dynamische Datenstrukturen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Informatik Abitur Bayern 2017 / II - Lösung

Übungspaket 32 Einfach verkettete, sortierte Liste

Programmieren in C. Speicher anfordern, Unions und Bitfelder. Prof. Dr. Nikolaus Wulff

Programmierung mit C Zeiger

einlesen n > 0? Ausgabe Negative Zahl

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

class ListElement { int value; ListElement next; ListElement() { next=null; value=0;

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Tutoraufgabe 1 (2 3 4 Bäume):

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Übungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks)

HS Ravensburg-Weingarten Schriftlich Prüfung Programmieren

1. Aufgabe (6 Punkte): Java-Programmierung (Arrays)

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

7. Einführung in C++ Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 14. Bäume. Bäume 1

Listen. Arrays. Deklaration. Einfach verkettete Listen

11. Elementare Datenstrukturen

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15

1. Datenstrukturen in C

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

Übungsblatt Programmierung und Software-Entwicklung Generizität, Interfaces, Listen, Sortieralgorithmen & JUnit

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 15 (Linearer Speicher, Listen, Bäume)

Theoretische Informatik 1 WS 2007/2008. Prof. Dr. Rainer Lütticke

Algorithmen und Datenstrukturen Musterlösung 5

Übungen zu Systemprogrammierung 1 (SP1)

1 Abstrakte Datentypen

Variablen in C++ Einfache Variablen Strukturen Arrays und Zeichenketten Zeiger und Referenzen Parameter Dynamische Speicherverwaltung

Klausur Informatik WS 2012/13

Übung zur Vorlesung Programmieren in C

2. Aufgabe (3 Punkte) Ergänzen Sie die leeren Zellen derart, dass sich in einer Zeile die selben Zahlenwerte ergeben.

Transkript:

Dynamische Datentypen Institut für Informatik und Computational Science Universität Potsdam Henning Bordihn Einige Folien gehen auf A. Terzibaschian zurück. 1

Dynamische Datentypen 2

Dynamische Datentypen Motivation Aufgabe: Kundenverzeichnis verwalten Zu jeder Zeit soll ein neuer Kunde hinzukommen oder entfernt werden können. Verzeichnis ist Liste von Kunden, deren Länge sich zur Laufzeit dynamisch ändert. Wie kann man das in C umsetzen? 3

Ausgangspunkt zusammengesetzter Datentyp Customer struct customer { short id; char name[64]; char adress[64]; short phone; float b_volume; ; typedef struct customer Customer; Customer ctms[1024]; // Groesse unveraenderlich 4

Kundenverwaltung mit Arrays Beispiel: Kunde löschen (aus Array???) erster Ansatz: neues Array anlegen mit einem Element weniger alles kopieren außer zu löschendes Element sehr viele Kopien entstehen; Indexzuordnung ändert sich ständig 5

Einfach verkettete Listen zweiter Ansatz: Nutzung dynamischer Datenstrukturen Beispiele: verkettete Listen, Bäume, Mengen,... in fast allen modernen Sprachen vordefiniert (Standard-Bibliotheken); in C leider keine eingebaute verkettete Liste Konzept einfach verkettete Liste: neben den Daten wird ein Pointer auf das nächste Listenelement gespeichert 6

Kundenverwaltung mit einfach verketteten Listen zusätzliche Membervariable vom Typ Pointer auf Kunde (Customer) struct customer { short id; char name[64]; char adress[64]; short phone; float b_volume; struct customer * next; NULL-Pointer zum Auffinden des Listenendes Elemente liegen nicht hintereinander im Speicher (Warum nicht?) 7

Arbeit mit einfach verketteten Listen Einfügen Löschen, Umordnen durch Umsetzen der Pointer, z.b. Löschen eines Listenelements ( Andi ): kein Kopieren der Daten Suchen von Elementen, Bestimmen der Länge, Ausgabe aller Elemente usw. durch Verfolgung der Pointer 8

Aufgabe: einfach verkettete Liste ganzer Zahlen Erstellen Sie eine C-Datei mit 1. einem Typ listelement zum Speichern eines int und der Adresse des nächsten Listenelements, 2. einem Typ list zum Adressieren einer Liste aus solchen Elementen. Wie kann dieser Typ realisiert werden? typedef struct le { int value; struct le * next; listelement; typedef listelement * list; // pointer to first element 9

Aufgabe: einfach verkettete Liste ganzer Zahlen Erstellen Sie eine C-Datei mit 1. einem Typ listelement zum Speichern eines int und der Adresse des nächsten Listenelements, 2. einem Typ list zum Adressieren einer Liste aus solchen Elementen. Wie kann dieser Typ realisiert werden? typedef struct le { int value; struct le * next; listelement; typedef listelement * list; // pointer to first element 9

Operationen für einfach verkettete Listen Ergänzen Sie je eine Funktion 1. zum Einfügen eines Listenelements als neues erstes Element, 2. zum Ausgeben aller Elemente einer Liste. list insert(int v, list l) { void print_list(list l) { list new; if (l == NULL) printf("leer"); new = malloc(sizeof(listelement)); else new->value = v; while (l!= NULL) { new->next = l; printf("%d ", l->value); return new; l = l->next; 10

Operationen für einfach verkettete Listen Ergänzen Sie je eine Funktion 1. zum Einfügen eines Listenelements als neues erstes Element, 2. zum Ausgeben aller Elemente einer Liste. list insert(int v, list l) { void print_list(list l) { list new; if (l == NULL) printf("leer"); new = malloc(sizeof(listelement)); else new->value = v; while (l!= NULL) { new->next = l; printf("%d ", l->value); return new; l = l->next; 10

Operationen für einfach verkettete Listen Ergänzen Sie je eine Funktion 1. zum Einfügen eines Listenelements als neues erstes Element, 2. zum Ausgeben aller Elemente einer Liste. list insert(int v, list l) { void print_list(list l) { list new; if (l == NULL) printf("leer"); new = malloc(sizeof(listelement)); else new->value = v; while (l!= NULL) { new->next = l; printf("%d ", l->value); return new; l = l->next; 10

Testen der einfach verkettete Listen Ergänzen Sie eine main-funktion, in der Sie Ihre Operationen mit 1. einer leeren Liste, 2. einer Liste mit einem Element, 3. einer Liste mit mindestens drei Elementen testen. Eine leere Liste ist eine, deren erstes Element eine Nullreferenz ist. Nutzen Sie zum Erzeugen von Listen Ihre Funktion zum Einfügen von Elementen, wobei Sie mit einer leeren Liste beginnen. 11

Operationen für einfach verkettete Listen (2) Ergänzen Sie je eine Funktion 1. zum Berechnen der Listenlänge (Anzahl der Elemente), 2. zum Entfernen des ersten Listenelements. Denken Sie an Speicherfreigaben! int length(list l) { list delete_head(list l) { int count = 0; if (l == NULL) return l; while (l!= NULL) { list new = l->next; count++; free(l); l = l->next; return new; return count; 3. Testen mit allen Listen! 12

Operationen für einfach verkettete Listen (2) Ergänzen Sie je eine Funktion 1. zum Berechnen der Listenlänge (Anzahl der Elemente), 2. zum Entfernen des ersten Listenelements. Denken Sie an Speicherfreigaben! int length(list l) { list delete_head(list l) { int count = 0; if (l == NULL) return l; while (l!= NULL) { list new = l->next; count++; free(l); l = l->next; return new; return count; 3. Testen mit allen Listen! 12

Operationen für einfach verkettete Listen (2) Ergänzen Sie je eine Funktion 1. zum Berechnen der Listenlänge (Anzahl der Elemente), 2. zum Entfernen des ersten Listenelements. Denken Sie an Speicherfreigaben! int length(list l) { list delete_head(list l) { int count = 0; if (l == NULL) return l; while (l!= NULL) { list new = l->next; count++; free(l); l = l->next; return new; return count; 3. Testen mit allen Listen! 12

Operationen für einfach verkettete Listen (3) Ergänzen Sie eine Funktion zum Löschen der gesamten Liste. Denken Sie wieder an die Freigabe des Speichers und an das Testen! void delete_all(list l) { void delete_all(list l) { if (l == NULL) return; list next; list next = l->next; while (l!= NULL) { free(l); next = l->next; delete_all(next); free(l); l = next; // alternative Implementierung 13

Operationen für einfach verkettete Listen (3) Ergänzen Sie eine Funktion zum Löschen der gesamten Liste. Denken Sie wieder an die Freigabe des Speichers und an das Testen! void delete_all(list l) { void delete_all(list l) { if (l == NULL) return; list next; list next = l->next; while (l!= NULL) { free(l); next = l->next; delete_all(next); free(l); l = next; // alternative Implementierung 13

Operationen für einfach verkettete Listen (4) Ergänzen Sie eine Funktion, die den Index des ersten Elements ermittelt, das die als Parameter übergebene Zahl als Wert speichert. int contains(int v, list l) { int index = 1; while (l!= NULL) { if (l->value == v) return index; else { index++; l = l->next; return 0; // found // not yet found // not in list (NULL reached) 14

Operationen für einfach verkettete Listen (4) Ergänzen Sie eine Funktion, die den Index des ersten Elements ermittelt, das die als Parameter übergebene Zahl als Wert speichert. int contains(int v, list l) { int index = 1; while (l!= NULL) { if (l->value == v) return index; else { index++; l = l->next; return 0; // found // not yet found // not in list (NULL reached) 14

Operationen für einfach verkettete Listen (5) Ergänzen Sie eine Funktion, die das erste Elements löscht, das die als Parameter übergebene Zahl als Wert speichert. list delete(int v, list l) { int index = contains(v, l); if (index == 0) return l; if (index == 1) return delete_head(l); int i; list e, tmp = l; for(i=1; i<index-1; ++i) tmp = tmp->next; e = tmp->next; tmp->next = e->next; free(e); return l; // true if l empty or v not in l // tmp points to predecessor // e: element to be deleted 15

Operationen für einfach verkettete Listen (5) Ergänzen Sie eine Funktion, die das erste Elements löscht, das die als Parameter übergebene Zahl als Wert speichert. list delete(int v, list l) { int index = contains(v, l); if (index == 0) return l; if (index == 1) return delete_head(l); int i; list e, tmp = l; for(i=1; i<index-1; ++i) tmp = tmp->next; e = tmp->next; tmp->next = e->next; free(e); return l; // true if l empty or v not in l // tmp points to predecessor // e: element to be deleted 15