Merhaba
Pratikte çok kullandığımız bir yöntem değil fakat özellikle öğrenci ödevleri için bolca gelen sorulardan birini paylaşmak istedim. Bağlı liste (Linked List) dediğimiz yapılarda tek yönlü olarak ekleme,silme,listeleme için bir örnek hazırladım.
unit Unit1;
interface
uses
*Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
*Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
*TFrmOrnek = class(TForm)
* *memSonuc: TMemo;
* *BtnIslem: TButton;
* *memSonuc2: TMemo;
* *procedure BtnIslemClick(Sender: TObject);
*private
* *{ Private declarations }
*public
* *{ Public declarations }
*end;
*Ogrenci * = ^TOgrenci; // Struct Tanım
*TOgrenci *= record
* *No * * *: Integer;
* *Ad * * *: String;
* *Soyad * : String;
* *Sonraki : Ogrenci;
*end;
var
*FrmOrnek: TFrmOrnek;
*First : Ogrenci; // Bağlı Listenin İlk Elemanı
implementation
{$R *.dfm}
procedure Ekle(const No:Integer;const Adi,Soyadi:String); //Bağlı listeye eleman ekleme yapar
var AddItem,Temp : Ogrenci;
begin
* * New(AddItem);
* * AddItem^.No * * *:= No;
* * AddItem^.Ad * * *:= Adi;
* * AddItem^.Soyad * := Soyadi;
* * AddItem^.Sonraki := nil;
* * if First = nil then // İlk Eleman Boş İse
* * * *First := AddItem
* * else
* * begin
* * * * *Temp:= First;
* * * * *while Temp^.Sonraki nil do
* * * * *begin
* * * * * *Temp:=Temp^.Sonraki;
* * * * *end;
* * * * *Temp^.Sonraki:= AddItem; // Sona eleman eklendi
* * end;
end;
function Sil(const No:Integer):Boolean;
var
*Tmp,TmpSil : Ogrenci;
begin
*Result := False;
*if First = nil then // İlk Eleman Boş İse
* *Result := False
*else if First^.No = No then // Silinecek İlk Eleman İse
*begin
* *TmpSil := First;
* *First *:= First^.Sonraki;
* *Dispose(TmpSil);
* *Result := True;
*end
*else // Aradan veya sondan eleman silme
*begin
* *Tmp := First;
* *while Tmp^.Sonraki nil do
* *begin
* * *if Tmp^.Sonraki^.No = No then
* * *begin
* * * *TmpSil := Tmp^.Sonraki;
* * * *Tmp^.Sonraki := TmpSil^.Sonraki;
* * * *Dispose(TmpSil);
* * * *Result := True;
* * * *Break;
* * *end;
* * *Tmp := Tmp^.Sonraki;
* *end;
*end;
end;
procedure Listele(memLines:TStrings);
var
*Tmp : Ogrenci;
begin
*if First = nil then Exit;
*memLines.BeginUpdate;
*memLines.Clear;
*Tmp := First;
*while Tmp nil do
*begin
* *memLines.Add(Format('Numara = %d, Adı = %s, Soyadı = %s',[Tmp^.No,Tmp^.Ad,Tmp^.Soyad]));
* *Tmp := Tmp^.Sonraki;
*end;
*memLines.EndUpdate;
end;
procedure TFrmOrnek.BtnIslemClick(Sender: TObject);
begin
*Ekle(1,'Ahmet','TAŞARAN');
*Ekle(2,'Esra','KAYA');
*Ekle(3,'Canan','DEMİRCİ');
*Listele(memSonuc.Lines);
*Sil(2);
*Listele(memSonuc2.Lines);
{
*Sonuc1
*Numara = 1, Adı = Ahmet, Soyadı = TAŞARAN
*Numara = 2, Adı = Esra, Soyadı = KAYA
*Numara = 3, Adı = Canan, Soyadı = DEMİRCİ
}
{
*Sonuc2
*Numara = 1, Adı = Ahmet, Soyadı = TAŞARAN
*Numara = 3, Adı = Canan, Soyadı = DEMİRCİ
}
end;
end.
Pratikte çok kullandığımız bir yöntem değil fakat özellikle öğrenci ödevleri için bolca gelen sorulardan birini paylaşmak istedim. Bağlı liste (Linked List) dediğimiz yapılarda tek yönlü olarak ekleme,silme,listeleme için bir örnek hazırladım.
unit Unit1;
interface
uses
*Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
*Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
*TFrmOrnek = class(TForm)
* *memSonuc: TMemo;
* *BtnIslem: TButton;
* *memSonuc2: TMemo;
* *procedure BtnIslemClick(Sender: TObject);
*private
* *{ Private declarations }
*public
* *{ Public declarations }
*end;
*Ogrenci * = ^TOgrenci; // Struct Tanım
*TOgrenci *= record
* *No * * *: Integer;
* *Ad * * *: String;
* *Soyad * : String;
* *Sonraki : Ogrenci;
*end;
var
*FrmOrnek: TFrmOrnek;
*First : Ogrenci; // Bağlı Listenin İlk Elemanı
implementation
{$R *.dfm}
procedure Ekle(const No:Integer;const Adi,Soyadi:String); //Bağlı listeye eleman ekleme yapar
var AddItem,Temp : Ogrenci;
begin
* * New(AddItem);
* * AddItem^.No * * *:= No;
* * AddItem^.Ad * * *:= Adi;
* * AddItem^.Soyad * := Soyadi;
* * AddItem^.Sonraki := nil;
* * if First = nil then // İlk Eleman Boş İse
* * * *First := AddItem
* * else
* * begin
* * * * *Temp:= First;
* * * * *while Temp^.Sonraki nil do
* * * * *begin
* * * * * *Temp:=Temp^.Sonraki;
* * * * *end;
* * * * *Temp^.Sonraki:= AddItem; // Sona eleman eklendi
* * end;
end;
function Sil(const No:Integer):Boolean;
var
*Tmp,TmpSil : Ogrenci;
begin
*Result := False;
*if First = nil then // İlk Eleman Boş İse
* *Result := False
*else if First^.No = No then // Silinecek İlk Eleman İse
*begin
* *TmpSil := First;
* *First *:= First^.Sonraki;
* *Dispose(TmpSil);
* *Result := True;
*end
*else // Aradan veya sondan eleman silme
*begin
* *Tmp := First;
* *while Tmp^.Sonraki nil do
* *begin
* * *if Tmp^.Sonraki^.No = No then
* * *begin
* * * *TmpSil := Tmp^.Sonraki;
* * * *Tmp^.Sonraki := TmpSil^.Sonraki;
* * * *Dispose(TmpSil);
* * * *Result := True;
* * * *Break;
* * *end;
* * *Tmp := Tmp^.Sonraki;
* *end;
*end;
end;
procedure Listele(memLines:TStrings);
var
*Tmp : Ogrenci;
begin
*if First = nil then Exit;
*memLines.BeginUpdate;
*memLines.Clear;
*Tmp := First;
*while Tmp nil do
*begin
* *memLines.Add(Format('Numara = %d, Adı = %s, Soyadı = %s',[Tmp^.No,Tmp^.Ad,Tmp^.Soyad]));
* *Tmp := Tmp^.Sonraki;
*end;
*memLines.EndUpdate;
end;
procedure TFrmOrnek.BtnIslemClick(Sender: TObject);
begin
*Ekle(1,'Ahmet','TAŞARAN');
*Ekle(2,'Esra','KAYA');
*Ekle(3,'Canan','DEMİRCİ');
*Listele(memSonuc.Lines);
*Sil(2);
*Listele(memSonuc2.Lines);
{
*Sonuc1
*Numara = 1, Adı = Ahmet, Soyadı = TAŞARAN
*Numara = 2, Adı = Esra, Soyadı = KAYA
*Numara = 3, Adı = Canan, Soyadı = DEMİRCİ
}
{
*Sonuc2
*Numara = 1, Adı = Ahmet, Soyadı = TAŞARAN
*Numara = 3, Adı = Canan, Soyadı = DEMİRCİ
}
end;
end.