Einfache verkettete Liste

Hi, kann mir einer mal die einfache verkettete Liste in C erklären. Ich Blick da einfach nicht durch. Oder ein sehr gutes Tut. Alle, die ich bisher gefunden habe waren zu ungenau erörtert.

Hi, kann mir einer mal die einfache verkettete Liste in C
erklären. Ich Blick da einfach nicht durch. Oder ein sehr
gutes Tut. Alle, die ich bisher gefunden habe waren zu ungenau
erörtert.

Woran hapert es denn? Am theoretischen Verständnis von einer einfach verketteten Liste oder an deren praktischer Umsetzung? Wenn die Definition eines Elements (eine struct!?) postest, können wir hier gemeinsam eine Lösung suchen.

Markus

Das Problem ist, dann ist hinter die ganze Liste noch net so durchsteig. Mir fehlt da der zusammenhang von Pointer *Next und der Datenstuktur und der Liste. Also im Prinzip verstehe ich die Liste net.

Das Problem ist, dann ist hinter die ganze Liste noch net so
durchsteig. Mir fehlt da der zusammenhang von Pointer *Next
und der Datenstuktur und der Liste. Also im Prinzip verstehe
ich die Liste net.

struct ListenElement {
 int wert; // irgend ein Wert, für das Prinzip nicht relevant
 struct ListenElement\* naechstes\_element; 
};

Eine Liste besteht aus einer Anzahl von Elementen oder ist leer, wenn sie kein Element hat.

struct ListenElement\* erstes\_element = 0;

Die Liste ist anfangs leer, zeigt also auf kein(=0) Element.

struct* neues_element = malloc( sizeof(struct ListenElement) );

Legt die ein neues Element an, du musst es nur noch initialisieren.
Ein neues Element fügst du immer wie folgt in deine Liste ein:

neues\_element-\>naechstes\_element = erstes\_element;
erstes\_element = neues\_element;

In Worten: Ein neues Element hat als Nachfolger das aktuell erste Element in deiner Liste. Dann machst du das neue Element zum ersten Element, stellst es also an die erste Position in deiner Liste.
Ein weiteres element hat als nachfolger dein zuletzt eingefügtes Element und wird wieder zum ersten Element.

Nun möchtest du deine Liste von anfang bis ende durchgehen:

struct ListenElement\* position = erstes\_element;
while( position != 0 )
{
 // mache etwas mit dem Element
 position = position-\>naechstes\_element;
}

Markus

Das Problem ist, dann ist hinter die ganze Liste noch net so
durchsteig. Mir fehlt da der zusammenhang von Pointer *Next
und der Datenstuktur und der Liste. Also im Prinzip verstehe
ich die Liste net.

Hi InTocNiCo!

Die einfach verkettete Liste ist eine im Prinzip recht einfache Datenstruktur: Jedes Element enthält zusätzlich zu den eigentlichen Daten einen Verweis auf das nachste Element. Dein Programm speichert dann (idR) lediglich einen Pointer auf das erste Element, indem du den im jeweiligen Element enthaltenen Pointern „folgst“ kannst du elementweise die gesamte Liste abarbeiten.

Etwas ausführlicher hier: http://hal.iwr.uni-heidelberg.de/lehre/inf1/html/nod…

Wenn du konkrete Fragen hast, dann immer her damit.

Gruß
Martin

Das Problem ist, dann ist hinter die ganze Liste noch net so
durchsteig. Mir fehlt da der zusammenhang von Pointer *Next
und der Datenstuktur und der Liste. Also im Prinzip verstehe
ich die Liste net.

Hallo InTocNico,

eine „einfach verkettete Liste“ ist sowas wie eine
Reihe von Menschen bei der Polonaise.

Das „Listenelement“ ist der angeheiterte Partygänger,
er hat die Eigenschaft, einen Namen zu haben
(Element-Daten) und zwei Arme, die den Vordermann
berühren
(Element-Pointer).
Also:

 LISTENELEMENT {
 NAME\_DES\_PARTYGÄNGERS;
 ARME\_DES\_PARTYGÄNGERS;
 };

Die Liste sieht nun so aus

FELD von LISTENENELEMENTEN,

wobei (grob)

{ "erstes Element"
 LISTENELEMENT[1]---NAME\_DES\_PARTYGÄNGERS = "HANSI"
 LISTENELEMENT[1]---ARME\_DES\_PARTYGÄNGERS = **LISTENELEMENT[2]**
}

{ "zweites Element"
 LISTENELEMENT[2]---NAME\_DES\_PARTYGÄNGERS = "MARIA"
 LISTENELEMENT[2]---ARME\_DES\_PARTYGÄNGERS = **LISTENELEMENT[3]**
}

usw. gilt.

Nun zu den „Pointern“. Was bedeutet
LISTENELEMENT[x]—ARME_DES_PARTYGÄNGERS = LISTENELEMENT[y]

bei der Polonaise kann man auch sagen,
die Arme " zeigen auf" den Vordermann,
die Arme sind also eine Art Zeiger.

Dass das in C/C++ mit einem ‚*‘ gesschrieben wird,
musst Du einfach akzeptieren. Daran gewöhnst Du
Dich :wink:

Grüße

Big THX an alle, habt mir echt weitergeholfen. Aber jetzt noch ne Frage, wie Speicher ich etwas in diesen Elementen, und wie rufe ich sie ab. Die Lösung kann ganz einfach sein, aber wenn ich mich jetzt da reinsteiger, dann vergess ich wieder das andere Zeugs.

Big THX an alle, habt mir echt weitergeholfen. Aber jetzt noch
ne Frage, wie Speicher ich etwas in diesen Elementen, und wie
rufe ich sie ab. Die Lösung kann ganz einfach sein, aber wenn
ich mich jetzt da reinsteiger, dann vergess ich wieder das
andere Zeugs.

Bislang sieht dein Listenelement ja wie folgt aus:

struct Element {
 struct Element\* naechstes\_element;
};

So zeigt das Element jeweils nur auf das näcshte in der Liste. Du kannst in dem Element aber weitere Informaten/Daten ablegen, indem do dort weitere Variablen deklarierst:

struct Element {
 struct Element\* naechstes\_element;
 // ab hier kommen deine Daten:
 int eine\_zahl;
 float eine\_fließkomma-zahl
 char\* ein\_text; // Achtung: char\* ist wieder nur ein Zeiger
 // ...
};

Gruß Markus

Hab das zwar jetzt alles hingegrieg. Beim komilieren zeigt er keine Fehler an, aber der Linker mückt rum:

LIBCD.lib(wincrt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _WinMain@16
Debug/Liste.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise

2 Fehler

Was hat das zu bedeuten?

Hallo,

LIBCD.lib(wincrt0.obj) : error LNK2001: Nichtaufgeloestes
externes Symbol _WinMain@16

Damit das Betriebssystem weiss wo dein Programm überhaupt anfängt, wurde in C vereinbart, dass diese Funktion main() heist.

Unter Windows muss die halt WinMain() heissen, und die scheint zu fehlen, aber schau dir doch einmal die Beispielprogramme an.

Debug/Liste.exe : fatal error LNK1120: 1 unaufgeloeste externe
Verweise

Da WinMain() nicht existiert, kann auch keine .EXE erstellt werden.

MfG Peter(TOO)

Vermutlich arbeitest du mit Visual C++ und hast eine WIN32 Anwendung erstellt. Besser verwendest du als Projekttype eine Win32 Konsolen-Anwendung, hier werden garantiert alle Standard C++ Programme laufen.
Für Win-App selbst gelten andere Konventionen, etwa wie Peter erwähnte, eine WinMain() statt eine main() Funktion.

Gruß Markus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]