delphi 双向链表,单向链表,可以替换TList,添加删除效率更高

本文探讨了如何使用链表(包括单向链表和双向链表)替换Delphi的TList,以提高插入和删除操作的效率。通过内置的Node分配池减少内存分配频率,实现更优的性能。
摘要由CSDN通过智能技术生成

1、TList插入删除内存操作过于频繁,效率不高,可用以于链表替换

2、下链表实现自带了一个Node分配池,以避免内存分配的频率。

(包括:单线链表,双向链表,队列)

  
  //链表节点
  pTSingleLinkedNode = ^TSingleLinkedNode;

  TSingleLinkedNode = record
  private
    Next: pTSingleLinkedNode;
  public
    Data: TObject;
  end;

  pTMyLinkedNode = ^TMyLinkedNode;

  TMyLinkedNode = record
  public
    Data: TObject;
  private
    Prev, Next: pTMyLinkedNode;
  end;


  //链表池
  TLinkedNodePool = class
  protected
    m_Nodes: array of Pointer;
    m_Index: Integer;
    m_Capacity: Integer;
    m_Stoped: Boolean;
    function NewNode: Pointer; virtual; abstract;
    procedure DisposeNode(p: Pointer); virtual; abstract;
  public
    constructor Create(nCapacity: Integer = 512); virtual;
    destructor Destroy; override;
    function GetNode: Pointer;
    procedure RetNode(p: Pointer);
    procedure ReSize;
    procedure Clear;
  end;

  //单向链表
  TSingleLinkedBase = class(TLinkedNodePool)
  protected
    m_Head: pTSingleLinkedNode;
    m_Curr: pTSingleLinkedNode;
    m_Count: Integer;
    function NewNode: Pointer; override;
    procedure DisposeNode(p: Pointer); override;
    procedure AddObject(Obj: TObject);
    function DeleteObject(Obj: TObject): pTSingleLinkedNode;
  public
    constructor Create(nCapacity: Integer = 512); override;
    destructor Destroy; override;
    procedure Clear;
    function First: pTSingleLinkedNode;
    function Next: pTSingleLinkedNode;
    property Count: Integer read m_Count;
  end;

  //单向对象链表
  TSingleObjectLinked = class(TSingleLinkedBase)
  public
    procedure Add(Obj: TObject);
    function Delete(Obj: TObject): pTSingleLinkedNode;
  end;

  //单向指针链表
  TSinglePointerLinked = class(TSingleLinkedBase)
  public
    procedure Add(Ptr: Pointer);
    function Delete(Ptr: Pointer): pTSingleLinkedNode;
  end;

  //双链表基类,删除比单链表更快
  TMyLinkedBase = class(TLinkedNodePool)
  protected
    m_Head, m_Tail: pTMyLinkedNode;
    m_Curr: pTMyLinkedNode;
    m_Count: Integer;
    function NewNode: Pointer; override;
    procedure DisposeNode(p: Pointer); override;
    procedure AddObject(Obj: TObject);
    function DeleteObject(Obj: TObject): pTMyLinkedNode;
  publ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值