Algorithmen und Datenstrukturen

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

Zusammengesetzte Datentypen -- Arrays und Strukturen

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

Einführung in die Programmierung Arrays, Zeiger, Strings. Arvid Terzibaschian

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Dr. Monika Meiler. Inhalt

Deklarationen in C. Prof. Dr. Margarita Esponda

2. Semester, 2. Prüfung, Lösung

Programmieren in C++ Arrays, Strings und Zeigerarithmetik

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek

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

Tutorium Rechnerorganisation

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Objektorientierte Programmierung mit C++ Vector und List

Objektorientiertes Programmieren für Ingenieure

1 Polymorphie (Vielgestaltigkeit)

Klausur in Programmieren

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Praktikum Betriebssysteme 1. Aufgabe (1)

Mehr zu Datentypen: Felder, Zeiger und Strukturen

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

C++ Programmierung. Uwe Naumann. LuFG Informatik 12, RWTH Aachen University, Germany

Modellierung und Programmierung 1

Übungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks)

Eine Einführung in C-Funktionen

Java Virtual Machine (JVM) Bytecode

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Dr. Monika Meiler. Inhalt

Beispiel für eine rekursive Funktion

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Probeklausur: Programmierung WS04/05

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Fakultät Angewandte Informatik Lehrprofessur für Informatik

2. Programmierung in C

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

Propädeutikum zur Programmierung

Einführung in die Programmierung Laborübung bei Korcan Y. Kirkici. 12.Übung bis

Objektorientierte Programmierung

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Informatik Repetitorium SS Volker Jaedicke

Vorkurs C++ Programmierung

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

Einführung in die Programmierung

Funktionen und Parameter

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Einführung in die STL anhand eines ausgewählten Beispiels

Datentypen: Enum, Array, Struct, Union

Es gibt zwei verschiedene Arten, wie Programme auf dem Rechner ausgeführt werden:

Algorithmen und Datenstrukturen

Einführung in die Programmierung

Von Java nach C++ Dr. Frank Weichert Lehrstuhl Informatik VII Technische Universität Dortmund

C++-Zusammenfassung. H. Schaudt. August 18, 2005

FB Informatik. Fehler. Testplan

Javakurs für Anfänger

Von Java nach C++ Frank Weichert, Heinrich Müller Informatik VII Universität Dortmund

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

Einführung in die Java- Programmierung

Einführung in die C-Programmierung

Übersicht. Einführung in die Programmierung. main. main. main. main. Speicherverwaltung. Definition nach ANSI C:

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Einführung in C++ mit Microsoft VS

C kompakt für Java-Programmierer

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Einführung in die C++ Programmierung für Ingenieure

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

C vs. C++ Sebastian Meyer. Proseminar C - Grundlagen und Konzepte. Universität Hamburg

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

Kurzeinführung in C++

Moderne C-Programmierung

Klausur in Programmieren

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

CORBA Implementierung von Client und Server

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

(allgemeine) OOP in C++ Klassen und header-files Konstruktorn / Destruktoren Speicherverwaltung C++ Standard Library / SLT

Technische Infor matik 2 C/C++-Kurs. Pointer und Arrays AG Rechner netze 2.1

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Programmierung in C. Grundlagen. Stefan Kallerhoff

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

[E-1] Wolf, Jürgen: C von A bis Z. Galileo Computing, 3. Auflage,

Programmierkurs Java

Klausur zur Vorlesung Grundlagen der C++-Programmierung

Informatikpraktikum CE2. Übung 1: Einfach verkettete Liste

Angewandte Mathematik und Programmierung

C# im Vergleich zu Java

Fakultät Wirtschaftswissenschaft

Datenfelder (Arrays) Vektoren, Matrizen, Tabellen. Dr. Beatrice Amrhein

Java Einführung Methoden in Klassen

Vererbung & Schnittstellen in C#

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Strukturierte Datentypen und Funktionszeiger

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Einführung in die Programmierung (EPR)

Computergrundlagen Programmieren in C

1 Vom Problem zum Programm

1Schnelleinstieg 14. 2Wie aus einer einfachen Textdatei. 3 Wie man eigene Programme erstellt 30. Inhaltsverzeichnis. ein Programm wird 20

Transkript:

Algorithmen und Datenstrukturen Dynamische Datenobjekte Pointer/Zeiger, Verkettete Liste Eigene Typdefinitionen 1

Zeigeroperatoren & und * Ein Zeiger ist die Speicheradresse irgendeines Objektes. Eine Zeigervariable ist eine Variable, die gemäß Deklaration einen Zeiger auf ein Objekt des vereinbarten Typs enthält. Mit dem Adressoperator & kann man die Adresse einer Speicherzelle ermitteln. Der Adressoperator kann auf Variablen und Arrayelemente angewendet werden, nicht auf Ausdrücke (sie haben keinen Speicherplatz). Da ein Zeiger die Adresse eines Objektes enthält, kann auf das Objekt auf zwei Arten zugegriffen werden: Direkt über den Namen Indirekt über den Zeiger. Um indirekt zuzugreifen, wird der Operator * zum Dereferenzieren verwendet. 2

Zeigeroperatoren & und * Wird eine Zeigervariable deklariert, so ist sie nicht automatisch initialisiert; sie zeigt igendwo hin. Will man sie auf einen definierten Wert setzen, aber noch nicht auf ein bestimmtes Objekt, so kann der spezielle Zeigerwert NULL verwendet werden. NULL wird intern als OL dargestellt; man sollte der besseren Lesbarkeit wegen aber den Namen NULL verwenden. Die Definition von Null ist im Header <cstddef> enthalten. In Ausdrücken, wie y = *p + 1; haben die Operatoren * und & höheren Rang als arithmetische Operatoren. D.h. zuerst wird oben das Objekt ermittelt (dereferenziert) dann wird der Wert um 1 erhöht. Achtung: y = *(p+1) möglich, hat aber andere Bedeutung. Verweise sind auch links in Zuweisungen möglich. 3

Zeiger Beispiele für Zugriffe: C++-Fragment int *p = NULL; Bedeutung p ist eine Zeigervariable auf ein int-objekt. Da keine Initialisierung vorgenommen ist, ist der Inhalt unbestimmt. p 0L NULL 4

Zeiger Beispiele für Zugriffe: C++-Fragment int *p = NULL; int x = 2; p = &x; Bedeutung p wird die Adresse von x zugewiesen. Man sagt p zeigt auf x. p 0x0012FFE4 x 2 0x0012FFE4 5

Zeiger Beispiele für Zugriffe: C++-Fragment int *p = NULL; int x = 2; p = &x; x = *p + 1; Bedeutung p zeigt auf x. Zuerst wird dereferenziert, d.h. der Wert von der Speicherstelle, auf die p zeigt wird ermittelt (x==2), dann der Wert erhöht (3) und der Variablen x zugewiesen. p 0x0012FFE4 x 3 0x0012FFE4 6

Zeiger Beispiele für Zugriffe: C++-Fragment int *p = NULL; int x = 2; p = &x; *p = -5; Bedeutung p zeigt auf x. Zuerst wird dereferenziert, d.h. der Wert von der Speicherstelle, auf die p zeigt wird ermittelt (x==2), dann wird der Wert dieser Speicherstelle auf -5 gesetzt. p 0x0012FFE4 x -5 0x0012FFE4 7

Zeiger Beispiele für Zugriffe: C++-Fragment int *p = NULL; int x = 2; p = &x; *p += 1; Bedeutung p zeigt auf x. Zuerst wird dereferenziert, d.h. der Wert von der Speicherstelle, auf die p zeigt wird ermittelt (x==2), dann wird der Wert dieser Speicherstelle um 1erhöht. p 0x0012FFE4 x 3 0x0012FFE4 8

Zeiger Beispiele für Zugriffe: C++-Fragment int *p = NULL; int x = 2; p = &x; (*p)++; Bedeutung p zeigt auf x. Zuerst wird dereferenziert, d.h. der Wert von der Speicherstelle, auf die p zeigt wird ermittelt (x==2), dann wird der Wert dieser Speicherstelle um 1erhöht. Die Klammern sind wegen Rang erforderlich. p 0x0012FFE4 x 3 0x0012FFE4 9

Zeiger Beispiele für Zugriffe: C++-Fragment int *p = NULL; int x = 2, y; p = &x; y = *p; Bedeutung p zeigt auf x. Durch y = *p wird derselbe Effekt erzielt wie durch y = x. p 0x0012FFE4 x 2 0x0012FFE4 y 2 0x0012FFE8 10

Zeiger Beispiele für Zugriffe: C++-Fragment int *p1 = NULL; int *p2 = NULL; int x = 2; p1 = &x; p2 = p1; Bedeutung p1 zeigt auf x. Der Variablen p2 wird der Wert der Variablen p2 zugewiesen. Dadurch zeigt p2 auf dasselbe Objekt wie p1. p1 0x0012FFE4 x 2 0x0012FFE4 p2 0x0012FFE4 11

Dynamische Datenobjekte Die bisher behandelten Datentypen waren statisch der Compiler konnte den Speicherplatzbedarf ermitteln. In vielen Anwendungen ist der erforderliche Platzbedarf aber erst zur Laufzeit des Programms bekannt; z.b. wenn der Platz von der Anzahl der Benutzereingaben abhängt. Eine Lösung ist, ein sehr großes Array von Datenobjekten zu deklarieren und dort die Werte zu speichern. Besser wäre es man könnte Speicher zur Laufzeit, bei Bedarf anfordern (allokieren). 12

Dynamische Datenobjekte Ein Programm wird vom Betriebssystem (je nach Betriebssystem unterschiedlich) im Speicher etwa wie folgt abgelegt. Stack (Stapel) - auto Variablen - aktuelle Parameter FFFF... F zur Compilezeit berechnet Freier Bereich Heap (Halde) - dynamisch erzeugte Objekte permanente Daten - globale Variablen - static Variablen Programmcode Überlauf möglich über Zeiger kann auf den Bereich zugegriffen werden 0000... 0 13

Dynamische Datenobjekte Der Zugriff auf Daten im Stack und den Bereich permanente Daten erfolgt über Namen (der Variablen). Der Zugriff auf Elemente des Heap erfolgt über Zeiger. Erzeugung von dynamischen Datenobjekten Um ein neues Element im Heap ablegen zu können, verwendet man den Operator new. Der erforderliche Speicherplatz wird durch new in Abhängigkeit des Typs automatisch ermittelt. Beispiele für new Operator nächste Seite 14

Beispiele für new Operator: Dynamische Datenobjekte C++-Fragment int *p = NULL; p = new int; Bedeutung Ein neues Element wird auf dem Heap angelegt. Der Zugriff erfolgt über den Zeiger p. Der Wert ist undefiniert. Die Größe ist sizeof(int). p? 15

Beispiele für new Operator: Dynamische Datenobjekte C++-Fragment int *p = NULL; p = new int; *p = 18; Bedeutung Ein neues Element wird auf dem Heap angelegt. Der Zugriff erfolgt über den Zeiger p. Der Wert 18 wird zugewiesen. Die Größe ist sizeof(int). p 18 16

Beispiele für new Operator: Dynamische Datenobjekte C++-Fragment int *pa = NULL; pa = new int[3]; pa[1] = 42; Bedeutung Anlegen von 3 Int-Objekten. Der Zugriff wie auf Arrays über Zeiger und Index. Der Wert 42 wird dem 2. Element zugewiesen. Die Größe ist 3 * sizeof(int). pa 0? 1 42 2? 17

Erzeugung von dynamischen Datenobjekten Beispiel: Ein Programm, in dem ein Vektor von Zeigern definiert ist, bei dem jedes Vektorelement auf ein double-objekt zeigt. #include <iostream> int main() { double *pd[10]; // Vektor von Zeigern auf double; for (int i=0; i<10; i++) { cout << "Double: "; pd[i] = new double; cin >> *pd[i]; } for (int i=9; i>=0; i-- ) { cout << *pd[i] << " "; // Komponente i zeigt auf // neues Element im Heap // Wertzuweisung an neues // Element über Zeiger } } cout << endl; return 0; 18

Erzeugung von dynamischen Datenobjekten Beispiel: Ein Programm mit einem Zeiger auf ein Array von double-werten. #include <iostream> int main() { double *vd = new double[10]; // Zeiger auf Vektor for (int i =0 ; i < 10; i++) { } cout << "Double: "; cin >> vd[i]; } for (int i = 9; i >= 0; i-- ) { cout << vd[i] << " "; } cout << endl; return 0; // Wertzuweisung an neues // Element über Zeiger 19

Freigabe von dynamischen Datenobjekten Der Operator delete muss verwendet werden, um ein vorher mit new erzeugtes Objekt wieder freizugeben, damit der Speicherplatz erneut allokiert werden kann. Ein Array von Datenobjekten wird mit delete [] pa; freigegeben. 20

Beispiele für delete Operator: Dynamische Datenobjekte C++-Fragment int *p = NULL; p = new int; *p = 18; int *p = NULL; p = new int; *p = 18; delete p; p Bedeutung Ein neues Element wird auf dem Heap angelegt. Der Zugriff erfolgt über den Zeiger p. Der Wert 18 wird zugewiesen. Freigabe, auf das Element kann man nicht mehr zugreifen. p 18? 21

Freigabe von dynamischen Datenobjekten Einige Besonderheiten sind bzgl. delete zu beachten: Dynamisch allokierter Speicher, auf den kein Zeiger mehr zeigt, ist verloren! C++ erkennt nicht, ob ein Speicher noch benutzt wird (wegen der Laufzeiteffizienz). [dies ist in Java anders: die JVM überwacht den Heap und führt automatische ein Garbage Collection durch]. delete darf ausschließlich auf Objekte angewendet werden, die mit new erzeugt wurden. delete auf einen NULL Zeiger ist wirkungslos. mit new erzeugte Datenobjekte unterliegen nicht den Gültigkeitsregeln für Variablen. Sie existieren solange, bis mit delete gelöscht werden. 22

Rekursive dynamischen Strukturen Zeiger sind nicht nur auf einfache Objekte möglich. Ein Zeiger kann auch auf eine Struktur zeigen. Da ein Element der Struktur selbst wieder ein Zeiger sein kann, entsteht eine rekursive Datenstruktur. Wenn ein Zeiger auf eine Struktur zeigt, kann eine Komponente selektiert werden durch Verwendung des Selektion- und des Dereferenzierungsoperators. 23

Dynamische Datenobjekte Beispiele für dynamische Strukturen: C-Fragment struct tupel { int i; double d; } wert; wert.i = 18; wert.d = 1.2; Bedeutung Definition einer Variable wert, die eine Struktur von einem int und einem double ist. wert i 18 d 1.2 24

Dynamische Datenobjekte Beispiele für dynamische Strukturen: C-Fragment struct tupel *ps; ps = &wert; Bedeutung Zeiger auf Struktur tupel; ps zeigt auf Variable wert. ps wert i 18 d 1.2 25

Dynamische Datenobjekte Beispiele für dynamische Strukturen: C-Fragment (*ps).i = 42; cout << ps->i; Bedeutung Komponente i der Struktur selektieren, auf die ps zeigt und den Wert 42 zuweisen. Kurzschreibweise für (*ps).i ist: ps->i ps wert i 42 d 1.2 26

Dynamische Datenobjekte Beispiele für rekursive dynamische Strukturen: C++-Fragment struct knoten { int info; struct knoten *next; }; knoten *p = new knoten; Bedeutung Definition einer Struktur, die auf sich selbst zeigt (next-pointer). Neuer Zeiger p auf Struktur knoten. p struct knoten info? next 27

Dynamische Datenobjekte Hier ist der Rang der Operatoren wichtig: ++ps->i; Entspricht ++(ps->i) also wird die Komponente i inkrementiert. (++ps)->i; Inkrementiert ps, zeigt also auf anderes Objekt, dann wird die Komponente i selektiert! 28

Zusammenfassung: Dynamische Datenobjekte Um ein neues Element im Heap ablegen zu können, verwendet man den Operator new (in C verwendet man malloc). Der erforderliche Speicherplatz wird durch new in Abhängigkeit des Typs automatisch ermittelt. Beispiele: int *zeiger1; zeiger1 = new int; zeiger1 = NULL; double *zeiger2 = NULL; zeiger2 = new double[10]; 29

Zusammenfassung: Dynamische Datenobjekte Ein Zeiger kann auch auf eine Struktur zeigen. Da ein Element der Struktur selbst wieder ein Zeiger sein kann, entsteht eine rekursive Datenstruktur. Beispiel: struct student { string nachname; string vorname; long matrikelnummer; student *next; }; student *zeigeraufliste = new student; zeigeraufliste->nachname = "Seeber\0"; zeigeraufliste->vorname = "Dirk\0"; (*zeigeraufliste).matrikelnummer = 123456; zeigeraufliste->next = NULL; 30

Zusammenfassung: Dynamische Datenobjekte Der Operator delete (in C verwendet man free) kann verwendet werden, um ein vorher mit new erzeugtes Objekt wieder freizugeben, damit der Speicherplatz erneut allokiert werden kann. Beispiele: int *zeiger1; zeiger1 = new int; delete zeiger1; double *zeiger2 = NULL; zeiger2 = new double[10]; delete [] zeiger2; 31

Zusammenfassung: Dynamische Datenobjekte Beispiel (Fortsetzung): struct student { string nachname; string vorname; long matrikelnummer; student *next; }; student *zeigeraufliste = new student; zeigeraufliste->nachname = "Seeber\0"; zeigeraufliste->vorname = "Dirk\0"; zeigeraufliste->matrikelnummer = 123456; zeigeraufliste->next = NULL; delete zeigeraufliste; 32

Verkettete Listen Als erstes Anwendungsbeispiel werden verkettete Listen demonstriert. Eine verkette Liste ist eine rekursive dynamische Struktur, bei dem ein Strukturelement auf ein Datenobjekt des gleichen Typs zeigt. Das heißt ein Knoten hat die Form: struct knoten { int info; knoten *next; }; 33

Verkettete Listen Damit lassen sich dann Listenelemente verketten: anfang ende 1 3 5 7 NULL 34

Verkettete Listen - Operationen Folgende Operationen werden nun auf der verketteten Liste implementiert: Ein neues Element mit info-wert neuwert soll immer am Ende der Liste eingefügt werden. void einfuegen( int neuwert, knoten **anfang, knoten **ende ); Die Liste wird vom Anfang an bis zum Ende durchlaufen und der info-teil jeden Knotens wird ausgegeben. void ausgeben( knoten *anfang ); Die Liste soll gelöscht werden. void loeschen( knoten *anfang ); Das erste Element mit info-wert suchwert soll gesucht werden. Wenn kein solches Element in der Liste ist, soll das Ergebnis NULL sein. knoten * suchen( int suchelement, knoten *anfang ); Die Struktur wird global definiert. 35

Verkettete Listen - Einfügen Neues Element am Ende einfügen: anfang ende 1 3 5 7 4 NULL 36

Verkettete Listen - Einfügen void einfuegen ( int x,... ) // Einfuegen am Ende { // der Liste struct knoten *p = new knoten; // erzeuge neuen Knoten p->info = x; // Infowert wird x p->next = NULL; // next-wert wird mit // NULL initialisiert if ( NULL == *anfang ) { // leere Liste *anfang = p; *ende = p; } else { // Liste nicht leer (*ende)->next = p; // Einfuegen am Ende *ende = p; // neues Ende } } 37

Verkettete Listen - Ausgeben Liste von Anfang bis Ende ausgeben: anfang ende 1 3 5 7 4 NULL hilf 38

Verkettete Listen - Ausgeben void ausgeben (knoten *anfang) // Ausgeben von Anfang { // bis Ende struct knoten *hilf = anfang; // p zeigt auf aktuellen // Knoten cout << Liste: ; while ( NULL!= hilf) { cout << hilf->info << ; // Infoteil des aktuellen // Knoten ausgeben hilf = hilf->next; // p auf Folgeelement setzen } cout << endl; } 39

Element in der Liste suchen: Verkettete Listen - Suchen suchwert 5 anfang ende 1 3 5 7 4 NULL hilf 40

Verkettete Listen - Suchen struct knoten *suchen (int x,...) // sequentielles suchen { struct knoten *p = anfang; // p zeigt auf aktuellen // Knoten while ( NULL!= p ) { if ( p->info == x ) // Wert gefunden return p; // Knoten ausgeben else p = p->next; // p auf Folgeelement setzen } return NULL; // nicht gefunden } 41

Verkettete Listen - Löschen Element aus der Liste entfernen: loeschelement anfang ende 1 3 5 7 4 NULL hilf 42

Verkettete Listen - Löschen void loeschen ( struct knoten *p,... ) { struct knoten *hilf = anfang; // hilf zeigt auf // aktuellen Knoten struct knoten *loesch = NULL; while ( NULL!= hilf ) { loesch = hilf; hilf = hilf->next; delete loesch; } // hilf auf Folgeelement setzen } 43

Verkettete Listen - Hauptprogramm int main() { struct knoten *anfang = NULL; // Leere Liste struct knoten *ende = NULL; int eingabe = 1; while (eingabe > 0) { cout << "Integer (Abbruch mit negativem Wert): "; cin >> eingabe; einfuegen(eingabe,, ); } ausgeben( ); cout << "Integer, der gesucht werden soll: "; cin >> eingabe; p = suchen(eingabe, ); if ( NULL!= p ) cout << eingabe << "in Liste vorhanden" << endl; else cout << eingabe << "nicht in Liste vorhanden" << endl; ausgeben( ); loeschen( ); return 0; } 44

Typedef In C gibt es kein Datentyp string oder bool. Diese Datentypen kann der Programmierer selbst definieren. Es existiert die Möglichkeit, Namen zu definieren. Mit typedef bestehendertyp neuername ; kann dem bestehenden Typ ein neuer Name gegeben werden. Es wird - eigentlich - kein neuer Typ definiert, sondern nur ein neuer Name eingeführt. 45

Beispiele: #include <iostream> using namespace std; typedef int BOOL; #define TRUE 1 #define FALSE 0 Typedef int main() { BOOL bool_var = TRUE; cout << "bool_var = " << bool_var << endl; bool_var = FALSE; cout << "bool_var = " << bool_var << endl; } return 0; 46

Beispiele: #include <iostream> using namespace std; typedef double real; Typedef int main() { real x = 1.2; cout << "x = " << x << endl; return 0; } oder typedef enum wie {nicht, aufsteigend, absteigend}; 47