Delphi Can
Delphi Çift Yönlü Bağlı Liste Ekleme,Silme,Listeleme,Arama - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: İpuçları (https://www.delphican.com/forumdisplay.php?fid=24)
+--- Konu Başlığı: Delphi Çift Yönlü Bağlı Liste Ekleme,Silme,Listeleme,Arama (/showthread.php?tid=2948)



Delphi Çift Yönlü Bağlı Liste Ekleme,Silme,Listeleme,Arama - narkotik - 26-11-2018

Bir önceki konu başlığında tek yönlü bağlı liste ile işlemler yapmıştık. 
Bu sefer çift yönlü bağlı liste üzerinde çalışacağız...

 Ogrenci   = ^TOgrenci;
TOgrenci  = record
  Numara  : Integer;
  Ad      : String;
  Soyad   : String;
  Onceki  : Ogrenci;
  Sonraki : Ogrenci;
end;

var
 Form1: TForm1;
 First,Last,Temp : Ogrenci;
implementation

{$R *.dfm}

procedure AddItem(xNo:Integer;xAd,xSoyad:string);
Var Item : Ogrenci;
begin
 New(Item);
 Item^.Ad        := xAd;
 Item^.Soyad     := xSoyad;
 Item^.Numara    := xNo;
 if First = nil then
 begin
   First         := Item;
   Last          := Item;
   Last^.Onceki  := nil;
   Last^.Sonraki := nil;
 end
 else
 begin
   Last^.Sonraki := Item;
   Item.Onceki   := Last;
   Last          := Item;
   Last^.Sonraki := nil;
 end;
end;

procedure List(mem:TMemo);
begin
 mem.Lines.Clear;
 Temp := First;
 while Temp <> nil do
 begin
   mem.Lines.Add(Format('%d %s %s',[Temp^.Numara,Temp^.Ad,Temp^.Soyad]));
   Temp := Temp^.Sonraki;
 end;
end;

function Search(No:Integer):Ogrenci;
begin
 Temp := First;
 while Temp<>nil do
 begin
   if Temp^.Numara = No then
   begin
     Result := Temp;
     Break;
   end;
   Temp := Temp^.Sonraki;
 end;
end;

procedure Delete(No:Integer);
Var DeleteTemp : Ogrenci;
begin
 if First = nil then Exit;
 if First^.Numara = No then
 begin
   DeleteTemp    := First;
   First         := First^.Sonraki;
   First^.Onceki := nil;
   Dispose(DeleteTemp);
 end
 else
 begin
   Temp := First;
   while Temp^.Sonraki <> nil do
   begin
     if Temp^.Sonraki^.Numara = No then
     begin
       DeleteTemp := Temp^.Sonraki;
       if DeleteTemp = Last then
       begin
         Last          := Temp;
         Last^.Sonraki := nil;
       end
       else
       begin
         Temp^.Sonraki := DeleteTemp^.Sonraki;
         DeleteTemp^.Sonraki^.Onceki := Temp;
       end;
       Dispose(DeleteTemp);
       Break;
     end;
     Temp := Temp^.Sonraki;
   end;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 AddItem(171,'Mehmet','YILMAZ');
 AddItem(172,'Ali','KÜÇÜK');
 AddItem(173,'Merve','ŞEN');
 List(Memo1);
 Delete(172);
 AddItem(174,'Halil','İBRAHİM');
 List(Memo1);
{
 SONUÇ
 171 Mehmet YILMAZ
 173 Merve ŞEN
 174 Halil İBRAHİM
}
end;