Ein ADT ist kein echter Typ. Deshalb nennt man es ADT. Ist 'Knoten' ein ADT? Nicht wirklich, IMO. Es kann ein Teil von einem sein, wie eine verknüpfte Liste ADT. Ist 'dieser Knoten, den ich gerade erstellt habe, um ein ADT zu enthalten? Absolut nicht! Es ist bestenfalls ein Beispiel für die Implementierung eines ADT.
Es gibt wirklich nur einen Fall, in dem ADTs als Code ausgedrückt werden können, und das ist wie Templates. Zum Beispiel ist std :: list aus der C++ - STL eine tatsächliche ADT und nicht nur ein Beispiel für eine Instanz von eins. Auf der anderen Seite ist std::list<thingy>
ein Beispiel für eine Instanz eines ADT.
Einige könnten sagen, dass eine Liste, die alles enthalten kann, was einer Schnittstelle gehorcht, auch ein ADT ist. Ich würde ihnen leicht widersprechen. Es ist ein Beispiel für eine Implementierung eines ADT, das eine Vielzahl von Objekten enthalten kann, die alle einer bestimmten Schnittstelle unterliegen müssen.
Ein ähnliches Argument könnte über die Anforderungen der std :: list "Konzepte" gemacht werden. Zum Beispiel muss dieser Typ T kopierbar sein. Ich würde dem entgegensetzen, indem ich sage, dass dies nur Anforderungen des ADT selbst sind, während die vorherige Version tatsächlich eine spezifische Identität erfordert. Konzepte sind höher als Schnittstellen.
Wirklich, ein ADT ist einem "Muster" ziemlich ähnlich, außer dass mit ADT wir über Algorithmen sprechen, großes O, usw. ... Mit Mustern sprechen wir über Abstraktion, Wiederverwendung, usw ... Mit anderen Worten, Muster sind ein Weg, um etwas zu bauen, das durch Implementierungen einen bestimmten Problemtyp löst und erweitert/wiederverwendet werden kann. Ein ADT ist eine Möglichkeit, ein Objekt zu erstellen, das durch Algorithmen manipuliert werden kann, aber nicht genau erweiterbar ist.
Nizza Antwort rundum. Ich denke jedoch, dass der Container-Ansatz für eine verkettete Liste oft "unterlegen" ist, weil er auf vielen der * Vorteile * einer verknüpften Liste verliert (er behält einige der Leistungsmerkmale bei); die Fähigkeit, unabhängig durch eine (hoffentlich) unveränderliche Kette zu gehen (und sie zu verwerfen), ist sehr wertvoll und zu wenig genutzt (IMOHO). Eine Reihe von [funktionalen] Sprachen (Haskell, Lisp/Scheme/Clojure, Scala, um nur ein paar zu nennen) stützen sich stark auf diese Nicht-Container-Linked-List-Herangehensweise und leiten daraus viel Kraft ab. –