Beispiel von Schulübung
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Liste1Unit1.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 eine neuen leeren Waggons neu->data = Edit1->Text; // (*neu).data = (*Edit1).Text; neu->next = first; // neu->next = 0; first=neu; } //---------------------------------------------------------------------------
Hier ist ein vollständiges Musterbeispiel zu den verketteten 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 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); } } //---------------------------------------------------------------------------