Kurs 1575, Klausur vom , Musterlösung

Ähnliche Dokumente
Kurs 1575, Klausur vom

Syntax der Sprache PASCAL

Kurs 1575, Musterlösung zur Winter Klausur 2003/04

Kurs 1613 Einführung in die imperative Programmierung

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

6. Verkettete Strukturen: Listen

15 Der strukturierte Datentyp»set«(Mengen)

Manipulation binärer Bäume Binäre Bäume II

Über Arrays und verkettete Listen Listen in Delphi

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

4.Grundsätzliche Programmentwicklungsmethoden

Ursprünge. Die Syntax von Java. Das Wichtigste in Kürze. Konsequenzen. Weiteres Vorgehen. Rund um Java

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

1953/54 (USA) PS FORTRAN (FORmula TRANslating system) 1958/60 (Europa) ALGOL (ALGOrithmic Language)

Kurs 1613 Einführung in die imperative Programmierung

3. Übungsblatt zu Algorithmen I im SoSe 2017

Algorithmen und Datenstrukturen

Klausur Informatik B April Teil I: Informatik 3

Kurs 1613 Einführung in die imperative Programmierung

Vorlesung Datenstrukturen

Kurs 1613 Einführung in die imperative Programmierung Lösungen der Aufgaben zum Studientag

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

Wir wollen ein Programm schreiben, das die Ziehung der Lottozahlen vornimmt und zu den

Die Syntax von Java. Ursprünge. Konsequenzen. Das Wichtigste in Kürze. Weiteres Vorgehen. Rund um Java. Sun Microsystems. Borland Software Corp

Klausur zur Wirtschaftsinformatik II im Grundstudium

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 15/16. Kapitel 12. Listen. Listen 1

{$MODE Delphi} // fuer Free Pascal unit UCd;

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

Praxis der Programmierung

Andere Arten von Listen. Vorlesung 4

Datenstrukturen Teil 1. Arrays, Listen, Stapel und Warteschlange. Arrays. Arrays. Array

4. Algorithmen und Datenstrukturen I Grundlagen der Programmierung 1 (Java)

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / Vorlesung 10, Donnerstag 8.

Wintersemester 2010/2011 Hinweise zur Bearbeitung der Klausur zum Kurs 1613 Einführung in die imperative Programmierung

11.1 Grundlagen - Denitionen

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

1. Allgemeine Datei (Binärdatei mit formatierten Inhalt)

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

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

Schleifenprogrammierung in C/C++, Fortran und Pascal

Übungen zu Programmierung I - Blatt 8

Kurs 1613 Einführung in die imperative Programmierung Musterlösung zur Nachklausur am

11. Elementare Datenstrukturen

Fachbericht DPR. Name: René Wagener. Klasse: CI3O1. Fachlehrer: Herr Balog

C- Kurs 09 Dynamische Datenstrukturen

Kurs 1612 Konzepte imperativer Programmierung Kurs 1613 Einführung in die imperative Programmierung

Datentypen: integer, char, string, boolean

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Informatik II, SS 2014

Kurs 1613 Einführung in die imperative Programmierung

Wiederholung. Bäume sind zyklenfrei. Rekursive Definition: Baum = Wurzelknoten + disjunkte Menge von Kindbäumen.

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

Beispiel: Temperaturumwandlung. Imperative Programmierung. Schwerpunkte. 3. Grundlegende Sprachkonstruktionen imperativer Programme

Algorithmen und Datenstrukturen (für ET/IT)

Studienseminar Koblenz - Fachseminar Informatik Visualisierung von Sortieralgorithmen

Übungsklausur Algorithmen I

Aufgabe (Schreibtischtest, Algorithmenanalyse)

Suchen in Texten. Naives Suchen Verfahren von Knuth-Morris-Pratt Verfahren von Boyer-Moore Ähnlichkeitssuchen Editierdistanz

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

Algorithmen und Datenstrukturen

Teil X. Von Mini Pascal zu Pascal

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

Aufgabe (Schreibtischtest, lexikographische Ordnung)

Hochschule Darmstadt Informatik-Praktikum SS 2017 EIT Bachelor 5. Aufgabenblatt Datenstruktur, Dateieingabe und -ausgabe

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

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

7. Organisation von Informationen

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

Institut für Informatik Christian-Albrechts-Universität zu Kiel. Borland Delphi. Einführung in die Programmiersprache

13. Dynamische Datenstrukturen

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: B Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Schriftliche Reifeprüfung aus INFORMATIK: Klasse 8D Haupttermin 2002/03

Hinweise zur Bearbeitung der Klausur zum Kurs Einführung in die imperative Programmierung

Um mit dem Computer über ein Programm in Kontakt treten zu können braucht man sogenannte Ein- und Ausgabebefehle.

13. Bäume: effektives Suchen und Sortieren

Algorithmen & Datenstrukturen Midterm Test 2

Kurs 1613 Einführung in die imperative Programmierung Musterlösung zur Klausur am

Einstieg in die Informatik mit Java

Übung Algorithmen und Datenstrukturen

Android-Apps Gegenüberstellung Delphi java

Institut für Computational Science Prof. Dr. H. Hinterberger. Praxismodul 1. Einführung in die Programmierung Erste Programme

Informatik II Übung 5

Verbund/Struktur (record/struct)

Algorithmen I - Tutorium 28 Nr. 11

BUBBLE SORT. Können wir die gefundenen Algorithmen auch auf Listen mit mehr als drei Elementen ausdehnen?

3. Grundlegende Sprachkonstruktionen imperativer Programme

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

Voronoi-Diagramme. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK

Buch-Add-Ons. Jürgen Bayer. Object Pascal-Tipps und Tricks. 1 Konvertieren und auf numerische Werte überprüfen 2

Berichte aus der Informatik. Dieter Pawelczak. Start in die C-Programmierung

Einführung in die Programmierung mit VBA

Typisierte Dateien von Martin Strohal. Einleitung. Der Record

Grundlagen der Informatik

Kurs 1663 Datenstrukturen" Musterlösungen zur Klausur vom Seite 1. Musterlösungen zur Hauptklausur Kurs 1663 Datenstrukturen 15.

Kapitel 2: Analyse der Laufzeit von Algorithmen Gliederung

Transkript:

Kurs 1575, Klausur vom 7.2.1998, Musterlösung Sie wollen die Tause von Büchern in Ihrem heimischen Bücherregal lich systematisch erfassen. Dazu schreiben Sie sich von jedem Buch Autorenname, Titel sowie ein beschreibes Schlagwort auf. Sie möchten nun Ihre Bücherliste unter drei Aspekten sortiert dargestellt haben jeweils in einer Liste - : nach Autorennamen, nach Titeln und nach Schlagworten. Als erfahrener Pascalprogrammierer wird das kein Problem für Sie sein. Sie treffen folge Entwurfsentscheidungen: Jeder der drei Begriffe kann jeweils in einer Zeichenkette der Länge 30 untergebracht werden. Da die Anzahl Ihrer Bücher sich im Laufe der Zeit ändern wird, ist zur Darstellung der Bücherliste in Ihrem Programm eine dynamische Datenstruktur angebracht. Da die Liste nach drei Kriterien sortiert werden soll, ist es sinnvoll, sie nach diesen drei Kriterien zu verketten. Es ergibt sich also als Datenstruktur eine dreifach verkettete lineare Liste (oder vielleicht besser: Knoten, die in drei einfach verketteten Listen verkettet sind). Ein Knoten in dieser Liste enthält also drei Zeichenkettenkomponenten, die die drei Begriffe Autorenname, Titel und Schlagwort aufnehmen, sowie drei (Vorwärts-) Zeigerkomponenten für die sortierte Verkettung bezüglich Autorenname, Titel und Schlagwort. Bei geschickter Wahl der Datenstruktur können die Prozeduren, die zum Aufbau der Liste sowie zu ihrer Ausgabe benötigt werden, so parametrisiert werden, daß sie für jede der drei gewünschten Sortierungen nur einmal geschrieben werden müssen. Dazu faßt man die Zeichenketten- und die Zeigerkomponenten eines Knotens jeweils in einem (dreielementigen) Array zusammen, deren Indextyp ein Aufzählungstyp mit den Ausprägungen Autor, Titel und Schlagwort ist (oder auf die feine englische Art: Author, Title und Keyword). Damit ergeben sich folge Pascal-Typenvereinbarungen: type Index = (Author, Title, Keyword); Text30 = packed array[1..30] of char; ListPointer = ^ListElement; ListElement = record Entry: array[index] of Text30; Next: array[index] of ListPointer ; ListStart = array[index] of ListPointer; Eine Variable vom Typ ListStart wird dazu dienen, auf den Kopf der Liste zu weisen. Die Eingabedaten für Ihr Programm sehen so aus, daß die drei Begriffe, die zu einem Buch gehören, jeweils in einer Eingabezeile stehen in der Reihenfolge Autor, Titel, Schlagwort, - und jeweils durch ein Komma (das nicht mehr zum Text gehört) beet werden. Beliebig viele Leerzeichen dürfen vor und nach den Begriffen stehen und sollen vom Programm überlesen werden. Also könnte die Eingabe z.b. so aussehen: 1

Conan-Doyle, Der Hund von Baskerville, Krimi, Marx, Das Kapital, Sachbuch, Zoller, Windows 95 im Detail, Sachbuch, Goethe, Die Wahlverwandtschaften, Roman, Heine, Deutschland-ein Wintermaerchen, Gedicht, Goethe, Goetz von Berlichingen, Drama, Die Ausgabe, die Sie sich wünschen, hätte ungefähr folges Aussehen: Autorenliste Conan-Doyle Der Hund von Baskerville Krimi Goethe Die Wahlverwandtschaften Roman Goethe Goetz von Berlichingen Drama Heine Deutschland-ein Wintermaerchen Gedicht Marx Das Kapital Sachbuch Zoller Windows 95 im Detail Sachbuch Titelliste Das Kapital Marx Sachbuch Der Hund von Baskerville Conan-Doyle Krimi Deutschland-ein Wintermaerchen Heine Gedicht Die Wahlverwandtschaften Goethe Roman Goetz von Berlichingen Goethe Drama Windows 95 im Detail Zoller Sachbuch Schlagwortliste Drama Goethe Goetz von Berlichingen Gedicht Heine Deutschland-ein Wintermaerchen Krimi Conan-Doyle Der Hund von Baskerville Roman Goethe Die Wahlverwandtschaften Sachbuch Marx Das Kapital Sachbuch Zoller Windows 95 im Detail Eine grafische Darstellung der gewünschten Datenstruktur finden Sie am Ende dieser Klausur. Das Programm wird Funktionen/Prozeduren benötigen : Funktion zum Erzeugen eines neuen Knotens function NewElement: ListPointer; Prozedur zum Aufbau der Liste(n) durch sortiertes Einfügen eines neuen Knotens hinter einem gefundenen Knoten procedure InsertAfter (var Start: ListStart; NewElem: ListPointer; TypeOfList: Index); Diese Prozedur benutzt (ruft auf) eine Prozedur zum Finden des Knotens, hinter dem eingefügt werden soll procedure FindPos (var PrevPointer: ListPointer; Start: ListStart; NewElem: ListPointer; TypeOfList: Index); Prozedur zum Ausdrucken der Liste: procedure PrintList ( StartPointer: ListPointer; TypeOfList: Index); 2

Aufgabe 1: Schreiben Sie das Hauptprogramm zum Aufbau sowie zur Ausgabe der verketteten Listen. Nehmen Sie an, daß die oben skizzierten Funktion und Prozeduren zur Verfügung ständen. (Benotung: Maximal 15 Punkte) program Literat(input,output); type Index = (Author, Title, Keyword); Text30 = packed array[1..30] of char; ListPointer = ^ListElement; ListElement = record Entry: array[index] of Text30; Next: array[index] of ListPointer ; ListStart = array[index] of ListPointer; var Start: ListStart; NewElem: ListPointer; function NewElement: ListPointer;... {NewElement}; procedure FindPos (var PrevPointer: ListPointer; Start: ListStart; NewElem: ListPointer; TypeOfList: Index);... {FindPos}; procedure InsertAfter (var Start: ListStart; NewElem: ListPointer; TypeOfList: Index);... {InsertAfter}; procedure PrintList ( StartPointer: ListPointer; TypeOfList: Index);... {PrintList}; {Hauptprogramm} reset(input); rewrite(output); writeln; Start[Author]:=nil; Start[Title]:=nil; Start[Keyword]:=nil; while not eof do NewElem:=NewElement; InsertAfter(Start, NewElem, Author); InsertAfter(Start, NewElem, Title); InsertAfter(Start, NewElem, Keyword); ; writeln('autorenliste'); writeln; Printlist (Start[Author], Author); writeln('titelliste'); writeln; Printlist (Start[Title], Title); writeln('schlagwortliste'); writeln; Printlist (Start[Keyword], Keyword); 3

. 4

Aufgabe 2: Schreiben Sie die Funktion function NewElement: ListPointer; Die Funktion erzeuge einen neuen Knoten für die Liste und lese die Daten für ein Buch in die entsprechen Zeichenkettenkomponenten des Knotens ein. (Benotung: Maximal 20 Punkte) function NewElement: ListPointer; var NewElem: ListPointer; procedure ReadText30 (var Text: Text30); var pos, i: integer; z: char; pos:=1; read(z); while (z=' ') do read(z); while (z<>',') do Text[pos]:=z; pos:=pos+1; read(z) ; for i:=pos to 30 do Text[i]:=' ' {ReadText30}; new(newelem); ReadText30(NewElem^.Entry[Author]); ReadText30(NewElem^.Entry[Title]); ReadText30(NewElem^.Entry[Keyword]); readln; NewElem^.Next[Author]:=nil; NewElem^.Next[Title]:=nil; NewElem^.Next[Keyword]:=nil; NewElement:=NewElem {NewElement}; 5

Aufgabe 3: Schreiben Sie die Prozedur procedure FindPos (var PrevPointer: ListPointer; Start: ListStart; NewElem: ListPointer; TypeOfList: Index); Die Prozedur finde n am Anfang Start der Liste von der Art TypeOfList den Knoten (auf den der Zeiger PrevPointer als Ergebnis zeigt), hinter dem der Knoten mit dem Zeiger NewElem einzufügen wäre. (Benotung: Maximal 20 Punkte) procedure FindPos (var PrevPointer: ListPointer; Start: ListStart; NewElem: ListPointer; TypeOfList: Index); var gefunden: boolean; Pointer: ListPointer; gefunden:=false; PrevPointer:=nil; Pointer:=Start[TypeOfList]; while ((Pointer<>nil) and (not gefunden)) do if Pointer^.Entry[TypeOfList] <= NewElem^.Entry[TypeOfList] then PrevPointer:=Pointer; Pointer:=PrevPointer^.Next[TypeOfList] else gefunden:=true {Suche nach Vorgaengerknoten} {FindPos}; 6

Aufgabe 4: Schreiben Sie die Prozedur procedure InsertAfter (var Start: ListStart; NewElem: ListPointer; TypeOfList: Index); Die Prozedur füge den Knoten, auf den Zeiger NewElem weist, in die Liste ein. Die Art der Liste (Autoren-, Titel- bzw. Schlagwortliste) ist durch TypeOfList parametrisiert. Die Prozedur bedient sich zum Auffinden der Einfügeposition der (global definierten) Prozedur FindPos (s. Aufgabe 3). Beachten Sie auch den Sonderfall der leeren Liste. (Benotung: Maximal 15 Punkte) procedure InsertAfter (var Start: ListStart; NewElem: ListPointer; TypeOfList: Index); var PrevPointer: ListPointer; FindPos(PrevPointer, Start, NewElem, TypeOfList); if PrevPointer=nil then {Einfuegen am Anfang der Liste} NewElem^.Next[TypeOfList]:=Start[TypeOfList]; Start[TypeOfList]:=NewElem else { Einfuegen im Innern oder am Ende der Liste} NewElem^.Next[TypeOfList]:=PrevPointer^.Next[TypeOfList]; PrevPointer^.Next[TypeOfList]:=NewElem {InsertAfter}; 7

Aufgabe 5: Schreiben Sie die Prozedur procedure PrintList ( StartPointer: ListPointer; TypeOfList: Index); zur Ausgabe der drei Listenarten Autorennamen, Titel, Schlagwort (sortiert nach Autorennamen) Titel, Autorennamen, Schlagwort (sortiert nach Titeln) Schlagwort, Titel, Autorenname (sortiert nach Schlagworten). Die Listenart ist parametrisiert durch TypeOfList. Das Layout der Ausgabe soll etwa dem Beispiel auf S.2 folgen. (Benotung: Maximal 10 Punkte) procedure PrintList ( StartPointer: ListPointer; TypeOfList: Index); while (StartPointer<>nil) do case TypeOfList of Author: write ( StartPointer^.Entry[Title],' ', Title: write (StartPointer^.Entry[Title],' ', Keyword:write (StartPointer^.Entry[Keyword],' ', StartPointer^.Entry[Title]) {case}; writeln; StartPointer:=StartPointer^.Next[TypeOfList] {PrintList}; 8

Aufgabe 6: Ihr Programm ist so erfolgreich, daß Sie es bis nach Australien exportieren wollen. Auf der südlichen Hälfte der Erdhalbkugel läuft aber alles, wie Sie wissen, anders herum. Deshalb müssen Sie Ihrem Programm noch eine Variante der Ausgabeprozedur PrintList hinzufügen. Diese Variante heiße PrintInvers und drucke die Listen in umgekehrter Reihenfolge. Sie erreicht das auf rekursive Art. procedure PrintInvers ( StartPointer: ListPointer; TypeOfList: Index); (Benotung: Maximal 20 Punkte) procedure PrintInvers ( StartPointer: ListPointer; TypeOfList: Index); if (StartPointer<>nil)then PrintInvers(StartPointer^.Next[TypeOfList], TypeOfList); case TypeOfList of Author: write ( StartPointer^.Entry[Title],' ', Title: write (StartPointer^.Entry[Title],' ', Keyword:write (StartPointer^.Entry[Keyword],' ', StartPointer^.Entry[Title]) {case}; writeln {PrintListInvers}; Das Hauptprogramm muß entsprech ergänzt werden:... writeln('autorenliste invers'); writeln; PrintInvers (Start[Author], Author); writeln('titelliste invers'); writeln; PrintInvers (Start[Title], Title); writeln('schlagwortliste invers'); writeln; PrintInvers (Start[Keyword], Keyword);. 9

Hier noch einmal das komplette Programm: program Literat(input,output); type Index = (Author, Title, Keyword); Text30 = packed array[1..30] of char; ListPointer = ^ListElement; ListElement = record Entry: array[index] of Text30; Next: array[index] of ListPointer ; ListStart = array[index] of ListPointer; var Start: ListStart; NewElem: ListPointer; function NewElement: ListPointer; var NewElem: ListPointer; procedure ReadText30 (var Text: Text30); var pos, i: integer; z: char; pos:=1; read(z); while (z=' ') do read(z); while (z<>',') do Text[pos]:=z; pos:=pos+1; read(z) ; for i:=pos to 30 do Text[i]:=' ' {ReadText30}; new(newelem); ReadText30(NewElem^.Entry[Author]); ReadText30(NewElem^.Entry[Title]); ReadText30(NewElem^.Entry[Keyword]); readln; NewElem^.Next[Author]:=nil; NewElem^.Next[Title]:=nil; NewElem^.Next[Keyword]:=nil; NewElement:=NewElem {NewElement}; procedure FindPos (var PrevPointer: ListPointer; Start: ListStart; NewElem: ListPointer; TypeOfList: Index); var gefunden: boolean; Pointer: ListPointer; gefunden:=false; PrevPointer:=nil; Pointer:=Start[TypeOfList]; while ((Pointer<>nil) and (not gefunden)) do if Pointer^.Entry[TypeOfList] <= NewElem^.Entry[TypeOfList] then PrevPointer:=Pointer; Pointer:=PrevPointer^.Next[TypeOfList] else gefunden:=true {Suche nach Vorgaengerknoten} {FindPos}; procedure InsertAfter (var Start: ListStart; NewElem: ListPointer; TypeOfList: Index); 10

var PrevPointer: ListPointer; FindPos(PrevPointer, Start, NewElem, TypeOfList); if PrevPointer=nil then {Einfuegen am Anfang der Liste} NewElem^.Next[TypeOfList]:=Start[TypeOfList]; Start[TypeOfList]:=NewElem else { Einfuegen im Innern oder am Ende der Liste} NewElem^.Next[TypeOfList]:=PrevPointer^.Next[TypeOfList]; PrevPointer^.Next[TypeOfList]:=NewElem {InsertAfter}; procedure PrintList ( StartPointer: ListPointer; TypeOfList: Index); while (StartPointer<>nil) do case TypeOfList of Author: write ( StartPointer^.Entry[Title],' ', Title: write (StartPointer^.Entry[Title],' ', Keyword:write (StartPointer^.Entry[Keyword],' ', StartPointer^.Entry[Title]) {case}; writeln; StartPointer:=StartPointer^.Next[TypeOfList] {PrintList}; procedure PrintInvers ( StartPointer: ListPointer; TypeOfList: Index); if (StartPointer<>nil)then PrintInvers(StartPointer^.Next[TypeOfList], TypeOfList); case TypeOfList of Author: write ( StartPointer^.Entry[Title],' ', Title: write (StartPointer^.Entry[Title],' ', Keyword:write (StartPointer^.Entry[Keyword],' ', StartPointer^.Entry[Title]) {case}; writeln {PrintListInvers}; {Hauptprogramm} assign(input,'d:\k1575\nklaus98\literat.dat'); assign(output,'d:\k1575\nklaus98\literat.out'); reset(input); rewrite(output); writeln; Start[Author]:=nil; Start[Title]:=nil; Start[Keyword]:=nil; while not eof do 11

NewElem:=NewElement; InsertAfter(Start, NewElem, Author); InsertAfter(Start, NewElem, Title); InsertAfter(Start, NewElem, Keyword); ; writeln('autorenliste'); writeln; Printlist (Start[Author], Author); writeln('titelliste'); writeln; Printlist (Start[Title], Title); writeln('schlagwortliste'); writeln; Printlist (Start[Keyword], Keyword); writeln('autorenliste invers'); writeln; PrintInvers (Start[Author], Author); writeln('titelliste invers'); writeln; PrintInvers (Start[Title], Title); writeln('schlagwortliste invers'); writeln; PrintInvers (Start[Keyword], Keyword);. 12

Versuch, die Datenstruktur grafisch darzustellen. Start Grafische Darstellung eines Knotens der Liste: [Author] [Title] [Keyword] Entry[Author] Entry[Title] Entry[Keyword] Next[Author] Next[Title] Next[Keyword] Conan-Doyle Marx Zoller Goethe Heine Goethe Der Hund von Baskerville Das Kapital Windows 95 im Detail Die Wahlverwandtschaften Deutschland-ein Wintermaerchen Goetz von Berlichingen Krimi Sachbuch Sachbuch Roman Gedicht Drama 13