Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi Bağlı Liste Ekleme,Silme,Listeleme
#1
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.
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#2
Aslında bunu bir (TList<T> gibi) generics tip ile tanımlı Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. yazıp ona uyarlamak mümkün olabilir. Tabi bu öğrenciye verilen ödev açısından pek uygun düşmeyebilir ama generic tip tanımlayarak bu gibi ortak görevleri tek sınıfta tanımlamak ve o sınıfı geliştirmek yeterli olabilmektedir.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi Çift Yönlü Bağlı Liste Ekleme,Silme,Listeleme,Arama narkotik 0 362 26-11-2018, Saat: 22:05
Son Yorum: narkotik
Thumbs Up [Delphi] Yeni Başlayanlar İçin Güzel Kaynak Halil Han Badem 1 1.948 06-02-2018, Saat: 01:25
Son Yorum: Halil Han Badem
  Bilgisayar domain sunucuya bağlı mı SimaWB 2 2.014 18-01-2018, Saat: 12:50
Son Yorum: SimaWB



Konuyu Okuyanlar: 1 Ziyaretçi