diff --git a/20191128/hp-musterloesung-20191121.pdf b/20191128/hp-musterloesung-20191121.pdf
deleted file mode 100644
index a8adbf2b369d7073ba44f6aa9791ac4bb8d4ac2d..0000000000000000000000000000000000000000
Binary files a/20191128/hp-musterloesung-20191121.pdf and /dev/null differ
diff --git a/20191128/hp-musterloesung-20191121.tex b/20191128/hp-musterloesung-20191121.tex
deleted file mode 100644
index fcfee6bff213e6bb5404d0c0bfdae3918e7b4d70..0000000000000000000000000000000000000000
--- a/20191128/hp-musterloesung-20191121.tex
+++ /dev/null
@@ -1,278 +0,0 @@
-% hp-musterloesung-20191128.pdf - Solutions to the Exercises on Low-Level Programming
-% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
-%
-% This document is free software: you can redistribute it and/or
-% modify it either under the terms of the Creative Commons
-% Attribution-ShareAlike 3.0 License, or under the terms of the
-% GNU General Public License as published by the Free Software
-% Foundation, either version 3 of the License, or (at your option)
-% any later version.
-%
-% This document is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this document.  If not, see <http://www.gnu.org/licenses/>.
-%
-% You should have received a copy of the Creative Commons
-% Attribution-ShareAlike 3.0 Unported License along with this
-% document.  If not, see <http://creativecommons.org/licenses/>.
-
-% README: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster
-
-\documentclass[a4paper]{article}
-
-\usepackage{pgscript}
-\usepackage{sfmath}
-
-\begin{document}
-
-  \section*{Hardwarenahe Programmierung\\
-            Musterlösung zu den Übungsaufgaben -- 28.\ November 2019}
-
-  \exercise{Datum-Bibliothek}
-
-  Zerlegen Sie die Datum-Bibliothek aus der Übungsaufgabe 2 vom 7.\,11.\,2019
-  in eine \file{.c}- und eine \file{.h}-Datei. \points{4}
-
-  Hinweis: Schreiben Sie zusätzlich ein Test-Programm.
-
-  \solution
-
-  Die Dateien \gitfile{hp}{20191128}{dates.c} und \gitfile{hp}{20191128}{dates.h} enthalten die Bibliothek,
-  die Datei \gitfile{hp}{20191128}{test-dates.c} ein Programm zum Testen der Bibliothek.
-
-  \exercise{Text-Grafik-Bibliothek}
-
-  Schreiben Sie eine Bibliothek für "`Text-Grafik"' mit folgenden Funktionen:\vspace*{-\medskipamount}
-  \begin{itemize}
-    \item
-      \lstinline|void clear (char c)|\\
-      Bildschirm auf Zeichen \lstinline|c| löschen,\\
-      also komplett mit diesem Zeichen (z.\,B.: Leerzeichen) füllen
-    \item
-      \lstinline|void put_point (int x, int y, char c)|\\
-      Punkt setzen (z.\,B.\ einen Stern (\lstinline{*}) an die Stelle $(x,y)$ "`malen"')
-    \item
-      \lstinline|char get_point (int x, int y)|\\
-      Punkt lesen
-%    \item
-%      \lstinline|void fill (int x, int y, char c, char o)|\\
-%      Fläche in der "`Farbe"' \lstinline|o|,
-%      die den Punkt \lstinline|(x, y)| enthält,
-%      mit der "`Farbe"' \lstinline|c| ausmalen
-    \item
-      \lstinline|void display (void)|\\
-      das Gezeichnete auf dem Bildschirm ausgeben
-  \end{itemize}
-
-  Hinweise:\vspace*{-\medskipamount}
-  \begin{itemize}
-    \item
-      Eine C-Bibliothek besteht aus (mindestens)
-      einer \file{.h}-Datei und einer \file{.c}-Datei.
-    \item
-      Verwenden Sie ein Array als "`Bildschirm"'.
-
-      Vor dem Aufruf der Funktion \lstinline|display()| ist nichts zu sehen;\\
-      alle Grafikoperationen erfolgen auf dem Array.
-    \item
-      Verwenden Sie Präprozessor-Konstante,
-      z.\,B.\ \lstinline{WIDTH} und \lstinline{HEIGHT},\\
-      um Höhe und Breite des "`Bildschirms"' festzulegen:
-      \begin{lstlisting}[gobble=8]
-        #define WIDTH 72
-        #define HEIGHT 24
-      \end{lstlisting}
-    \item
-     Schreiben Sie zusätzlich ein Test-Programm,
-     das alle Funktionen der Bibliothek benutzt,\\
-     um ein hübsches Bild (z.\,B.\ ein stilisiertes Gesicht -- "`Smiley"')
-     auszugeben.
-  \end{itemize}
-  \points{8}
-
-  \solution
-
-  Siehe die Dateien \gitfile{hp}{20191128}{textgraph.c} und \gitfile{hp}{20191128}{textgraph.h} (Bibliothek)
-  sowie \gitfile{hp}{20191128}{test-textgraph.c} (Test-Programm).
-
-  Diese Lösung erfüllt zusätzlich die Aufgabe,
-  bei fehlerhafter Benutzung (Koordinaten außerhalb des Zeichenbereichs)
-  eine sinnvolle Fehlermeldung auszugeben,
-  anstatt unkontrolliert Speicher zu überschreiben und abzustürzen.
-
-  Das Schlüsselwort \lstinline{static}
-  bei der Deklaration der Funktion \lstinline{check_coordinates()}
-  bedeutet, daß diese Funktion nur lokal (d.\,h.\ innerhalb der Bibliothek)
-  verwendet und insbesondere nicht nach außen
-  (d.\,h.\ für die Benutzung durch das Hauptprogramm) exportiert wird.
-  Dies dient dazu, nicht unnötig Bezeichner zu reservieren
-  (Vermeidung von "`Namensraumverschmutzung"').
-
-  Man beachte die Verwendung einfacher Anführungszeichen (Apostrophe)
-  bei der Angabe von \lstinline{char}-Kon"-stanten (\lstinline{'*'})
-  im Gegensatz zur Verwendung doppelter Anführungszeichen
-  bei der Angabe von String-Konstanten
-  (String = Array von \lstinline{char}s, abgeschlossen mit Null-Symbol).
-  Um das einfache Anführungszeichen selbst als \lstinline{char}-Konstante anzugeben,
-  ist ein vorangestellter Backslash erforderlich: \lstinline{'\''} ("`Escape-Sequenz"').
-  Entsprechendes gilt für die Verwendung doppelter Anführungszeichen
-  innerhalb von String-Konstanten:
-  \lstinline{printf ("Your name is: \"%s\"", name);}
-
-  \exercise{LED-Blinkmuster}
-
-  Wir betrachten das folgende Programm für einen ATmega32-Mikro-Controller
-  (Datei: \gitfile{hp}{20191128}{aufgabe-3.c}).
-
-  \begin{minipage}[t]{7cm}
-    \begin{lstlisting}[gobble=6]
-      #include <stdint.h>
-      #include <avr/io.h>
-      #include <avr/interrupt.h>
-
-      uint8_t counter = 1;
-      uint8_t leds = 0;
-
-      ISR (TIMER0_COMP_vect)
-      {
-        if (counter == 0)
-          {
-            leds = (leds + 1) % 8;
-            PORTC = leds << 4;
-          }
-        counter++;
-      }
-    \end{lstlisting}
-  \end{minipage}\hfill\begin{minipage}[t]{8.5cm}
-    \begin{lstlisting}[gobble=6]
-      void init (void)
-      {
-        cli ();
-        TCCR0 = (1 << CS01) | (1 << CS00);
-        TIMSK = 1 << OCIE0;
-        sei ();
-        DDRC = 0x70;
-      }
-
-      int main (void)
-      {
-        init ();
-        while (1)
-          ; /* do nothing */
-        return 0;
-      }
-    \end{lstlisting}
-  \end{minipage}
-
-  An die Bits Nr.\ 4, 5 und 6 des Output-Ports C des Mikro-Controllers sind LEDs angeschlossen.\\
-  Sobald das Programm läuft, blinken diese in charakteristischer Weise:
-  \begin{quote}
-    \newcommand{\tdn}[1]{\raisebox{-2pt}{#1}}
-    \begin{tabular}{|c|c|c|c|}\hline
-      \tdn{Phase} & \tdn{LED oben (rot)} & \tdn{LED Mitte (gelb)} & \tdn{LED unten (grün)} \\[2pt]\hline
-      1 & aus & aus & an  \\\hline
-      2 & aus & an  & aus \\\hline
-      3 & aus & an  & an  \\\hline
-      4 & an  & aus & aus \\\hline
-      5 & an  & aus & an  \\\hline
-      6 & an  & an  & aus \\\hline
-      7 & an  & an  & an  \\\hline
-      8 & aus & aus & aus \\\hline
-    \end{tabular}
-  \end{quote}
-  Jede Phase dauert etwas länger als eine halbe Sekunde.
-  Nach 8 Phasen wiederholt sich das Schema.
-
-  Erklären Sie das Verhalten des Programms anhand des Quelltextes:
-  \vspace{-\medskipamount}
-  \begin{itemize}\itemsep0pt
-    \item[(a)]
-      Wieso macht das Programm überhaupt etwas,
-      wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt,
-      in der \emph{nichts} passiert?
-      \points{1}
-    \item[(b)]
-      Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen,
-      wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert,
-      wobei die Variable \lstinline|counter| auf 1 initialisiert,
-      fortwährend erhöht und nirgendwo zurückgesetzt wird?
-      \points{2}
-    \item[(c)]
-      Wie kommt das oben beschriebene Blinkmuster zustande?
-      \points{2}
-    \item[(d)]
-      Wieso dauert eine Phase ungefähr eine halbe Sekunde?
-      \points{2}
-    \item[(e)]
-      Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'?
-      \points{1}
-  \end{itemize}
-
-  \goodbreak
-  Hinweis:
-  \vspace{-\medskipamount}
-  \begin{itemize}\itemsep0pt
-    \item
-      Die Funktion \lstinline|init()| sorgt dafür, daß der Timer-Interrupt Nr.\ 0 des Mikro-Controllers
-      etwa 488mal pro Sekunde aufgerufen wird.
-      Außerdem initialisiert sie die benötigten Bits an Port C als Output-Ports.
-      Sie selbst brauchen die Funktion \lstinline|init()| nicht weiter zu erklären.
-  \end{itemize}
-
-  \solution
-
-  \begin{itemize}\itemsep0pt
-    \item[(a)]
-      \textbf{Wieso macht das Programm überhaupt etwas,
-      wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt,
-      in der \emph{nichts} passiert?}
-
-      Das Blinken wird durch einen Interrupt-Handler implementiert.
-      Dieser wird nicht durch das Hauptprogramm,
-      sondern durch ein Hardware-Ereignis (hier: Uhr) aufgerufen.
-
-    \item[(b)]
-      \textbf{Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen,
-      wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert,
-      wobei die Variable \lstinline|counter| auf 1 initialisiert,
-      fortwährend erhöht und nirgendwo zurückgesetzt wird?}
-
-      Die vorzeichenlose 8-Bit-Variable \lstinline{counter} kann nur
-      Werte von 0 bis 255 annehmen; bei einem weiteren
-      INkrementieren springt sie wieder auf 0 (Überlauf),
-      und die \lstinline{if}-Bedingung ist erfüllt.
-
-    \item[(c)]
-      \textbf{Wie kommt das oben beschriebene Blinkmuster zustande?}
-
-      In jedem Aufruf des Interrupt-Handlers wird die Variable
-      \lstinline{leds} um 1 erhöht und anschließend modulo 8 genommen.
-      Sie durchläuft daher immer wieder die Zahlen von 0 bis 7.
-
-      Durch die Schiebeoperation \lstinline{leds << 4} werden die 3 Bits 
-      der Variablen \lstinline{leds} an diejenigen Stellen im Byte
-      geschoben, an denen die LEDs an den Mikro-Controller
-      angeschlossen sind (Bits 4, 5 und 6).
-
-      Entsprechend durchläuft das Blinkmuster immer wieder
-      die Binärdarstellungen der Zahlen von 0 bis 7
-      (genauer: von 1 bis 7 und danach 0).
-
-    \item[(d)]
-      \textbf{Wieso dauert eine Phase ungefähr eine halbe Sekunde?}
-
-      Der Interrupt-Handler wird gemäß Hinweis 488mal pro Sekunde aufgerufen.
-      Bei jedem 256sten Aufruf ändert sich das LED-Muster.
-      Eine Phase dauert somit $\frac{256}{488} \approx 0.52$ Sekunden.
-
-    \item[(e)]
-      \textbf{Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'?}
-
-      Deklaration eines Interrupt-Handlers für den Timer-Interrupt Nr.\ 0
-  \end{itemize}
-
-\end{document}
diff --git a/README.md b/README.md
index 6d7fb5b14539c00b1fd140423766eb0d2fb104d5..8a0dca3f9b234fc16cb6ae158106d77687753a50 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@ Vortragsfolien und Beispiele:
  * [02.01.2020: Quantencomputer, Datensicherheit und Datenschutz](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200102/hp-20200102.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200102/)
  * [09.01.2020: Rekursion, Aufwandsabschätzungen, objektorientierte Programmierung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200109/hp-20200109.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200109/)
  * [16.01.2020: objektorientierte Programmierung, dynamische Speicherverwaltung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200116/hp-20200116.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200116/)
- * [23.01.2020: objektorientierte Programmierung, dynamische Speicherverwaltung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-20200123.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200123/)
+ * [23.01.2020: Objektorientierte Programmierung, Datenstrukturen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-20200123.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200123/)
  * [alle in 1 Datei](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/hp-slides-2019ws.pdf)
 
 Übungsaufgaben:
@@ -59,7 +59,8 @@ Musterlösungen:
  * [07.11.2019: Arrays mit Zahlen, Datum-Bibliothek](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/hp-musterloesung-20191107.pdf)
  * [14.11.2019: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/hp-musterloesung-20191114.pdf)
  * [21.11.2019: Zahlensysteme, Mikrocontroller](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191121/hp-musterloesung-20191121.pdf)
- * [28.11.2019: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191128/hp-musterloesung-20191121.pdf)
+ * [28.11.2019: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191128/hp-musterloesung-20191128.pdf)
+ * [23.01.2020: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-musterloesung-20200123.pdf)
 
 Tafelbilder:
 ------------
diff --git a/hp-slides-2019ws.pdf b/hp-slides-2019ws.pdf
index e58c987c624249785e642c33b8475ad5a6c6db0b..c595e42272702a392ba628da579edda7245a0242 100644
Binary files a/hp-slides-2019ws.pdf and b/hp-slides-2019ws.pdf differ
diff --git a/hp-slides-2019ws.tex b/hp-slides-2019ws.tex
index c976bd232a8ca75a32615f181e26bd6bc81ac5a9..8d98f8761191d0652da4f3bedc1f95891c1373a3 100644
--- a/hp-slides-2019ws.tex
+++ b/hp-slides-2019ws.tex
@@ -38,4 +38,6 @@
   \includepdf[pages=-]{20200109/hp-20200109.pdf}
   \pdfbookmark[1]{16.01.2020: objektorientierte Programmierung, dynamische Speicherverwaltung}{20200116}
   \includepdf[pages=-]{20200116/hp-20200116.pdf}
+  \pdfbookmark[1]{23.01.2020: Objektorientierte Programmierung, Datenstrukturen}{20200123}
+  \includepdf[pages=-]{20200123/hp-20200123.pdf}
 \end{document}