Hier ist unser Musterbeispiel zu den verkettenten Listen

//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
struct CWaggon            //Einzelner "Waggon"
{
	AnsiString data;      //Daten
	CWaggon *next;        //Zeiger auf nächsten Waggon
};
 
CWaggon *first=0;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
CWaggon *neu = new CWaggon;   //Anlegen eines neuen Waggons
 
 //	(*neu).data=Edit1->Text;     so wäre die eigentl. Syntax
neu->data=Edit1->Text;    //Daten in den Waggon übernehmen
neu->next=first;          //Zeiger zeigt auf ersten Waggon
first=neu;                //Erster Waggon ist der neue Waggon
Edit1->Text="";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
CWaggon *h;     //Hilfszeiger,
h=first;		//der auf den ersten Waggon zeigt
 
AnsiString ausgabe="";
 
while (h!=0)    //Solange Hilfszeiger nicht auf 0 zeigt.
{
   ausgabe=ausgabe+h->data+" -> ";   //Ausgabestring zusammensetzen
   h=h->next;   //Hilfszeiger soll auf nächsten Waggon zeigen
}
Memo1->Lines->Add(ausgabe);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int pos=StrToInt(InputBox("Einfügen an Position","An welcher Position?",""));
//neuer Waggon erstellt
CWaggon *neu = new CWaggon;
neu->data=Edit1->Text;
neu->next=0;   //vorerst
 
//Erste Stelle
if (pos==1) {
	neu->next=first;
	first=neu;
}
else     //Andere Stelle
{  //Hilfszeiger
   CWaggon *h;
   h=first;
   for (int i=1; i<pos-1; i++) {
	  h=h->next;     //"Weiterschreiten" der Waggons
   }
   neu->next=h->next;
   h->next=neu;
}
 
 
 
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
 int z=0;
 CWaggon *h;
 h=first;
 
 while (h!=0)
{
   z++;
   h=h->next;
}
 
Memo1->Lines->Add("Anzahl der Elemente: "+IntToStr(z));
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button5Click(TObject *Sender)
{
 int pos=StrToInt(InputBox("Löschen von Position","An welcher Position?",""));
 
 CWaggon *h1, *h2;
 h1=first;
 
 if (pos==1)
	{
	 first=h1->next;
	 delete(h1);
	}
 
 else
    {
	 for (int i=1; i<pos-1; i++)
		{
		 h1=h1->next;
		}
	 h2=h1->next;
	 h1->next=h2->next;
	 delete(h2);
	}
   }
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button6Click(TObject *Sender)
{
CWaggon *h1, *h2, *h3, *h4;       //Hilfszeiger deklarieren
h1=first; h3=first;
 
int j=StrToInt(InputBox("Tauschen","Erstes Element?",""));
int k=StrToInt(InputBox("Tauschen","Zweites Element?",""));
 
//j und k der Größe nach ordnen;
 
if (j>k) {   //j und k tauschen
	int h=j;
	j=k;
	k=h;
}
 
 
if (j!=k) {  //Tausch, nur wenn ungleich!
 
   //Wenn Erster Waggon betroffen:
   if (j==1) {
	 //h3 und h4 positionieren
	 for (int i=1;i<k-1 ;i++ ) {  //h3 positionieren
	 h3=h3->next;
	 }
	 h4=h3->next; 				//h4 positionieren
 
	 first=h4;
	 h3->next=h1;
	 h3=first->next;   //bzw. h3=h4->next (ist dasselbe!)
	 h4->next=h1->next;
	 h1->next=h3;
 
	} else
	{
  //Allgemeiner Fall (ohne 1. Element)
  //Positionieren der Hilfszeiger
  for (int i=1;i<j-1 ;i++ ) {  //h1 positionieren
  h1=h1->next;
  }
  h2=h1->next; 				//h2 positionieren
 
  for (int i=1;i<k-1 ;i++ ) {  //h3 positionieren
  h3=h3->next;
  }
  h4=h3->next; 				//h4 positionieren
 
  //Umhängen:
  h1->next=h4;
  h3->next=h2;
  h3=h4->next;
  h4->next=h2->next;
  h2->next=h3;
   }
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button7Click(TObject *Sender)
{
AnsiString suchstring;
suchstring=InputBox("Suche","Suchstring eingeben","");
int zaehler=0;
bool gefunden=false;
CWaggon *h=first;
 
while (h!=0)
	{
	  zaehler++;
	  if (h->data==suchstring) {
	  Memo1->Lines->Add("Gefunden an "+ IntToStr(zaehler)+ ". Stelle");
	  gefunden=true;
	  }
	  h=h->next;
	}
if (!gefunden) {
    Memo1->Lines->Add("Suchstring leider nicht gefunden!");
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button8Click(TObject *Sender)
{
                     //Sortiert einfügen
CWaggon *neu = new CWaggon;
neu->data= Edit1->Text;
neu->next=0;
 
if (first==0)
  {  //Fall leere Liste
	 first=neu;
  } else
 
  {
  CWaggon *h = first;
  while (Edit1->Text>h->data && h->next!=0) h=h->next;
	  if (Edit1->Text<=h->data) {
		  AnsiString temp = h->data;
		  h->data=neu->data;
		  neu->data=temp;
	  }
 
	  neu->next=h->next;
	  h->next=neu;
  }
  Edit1->Text="";
}
 
 /*
 
CWaggon *neu=new CWaggon;
CWaggon *h=first;
 
neu->data=Edit1->Text;
 
if (first==0 || first->data > neu->data)
   {                // Liste leer oder einfügen vor dem ersten
	neu->next=first;
	first=neu;
   }
 
else
   {
	while (h->data < neu->data && h->next!=0)
	   {
		h=h->next;
	   }
	 neu->next=h->next;
	 h->next=neu;
	}
 
 Edit1->Text="";
 Edit1->SetFocus();
								*/
 
//---------------------------------------------------------------------------
 
void ausgabeverkehrt(CWaggon *h, AnsiString &AS)
{
if (h->next!=0) ausgabeverkehrt(h->next,AS);
AS=AS+" <- "+h->data;
}
 
 
void __fastcall TForm1::Button9Click(TObject *Sender)
{
AnsiString AS="";
 
if (first!=0) {
	ausgabeverkehrt(first,AS);
	Memo1->Lines->Add(AS);
}
 
}
//---------------------------------------------------------------------------