在Delphi中编写自己的链表管理类。

Delphi中使用链表,我们第一个想到的自然是使用TList类来实现(以前我也是这样做的)。但是当我们仔细看一下TList的实现就会发现这个类的实现其实使用的是数组的方式来实现的。哪如何编写自己的链表管理类呢?
其实这个问题在几乎每个将数据结构的书中都有讲到。这里我大概写一下我在写自己的链表管理中使用的方法。如有不正确的地方希望大家指正。
首先定义一个保存数据的结构:
PMyInfo = ^TMyInfo;
TMyInfo = record
       NameID:Integer;
       Name:String[20];
       Age:Word;
       Next: PMyInfo;
End;
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

定义一个类:
type
  TListControl = class
  private
      FCount: Integer;
      { Private declarations }
  protected
  public
    constructor Create;
destructor Destroy; override;
//向链表中加入信息
procedure       AddList(NameID:Integer;Name:String;Age:Integer);
//根据条件删除信息
procedure       DelList(NameID:Integer);
//根据条件查询信息
procedure       SelList(NameID:Integer;var Name:String;var Age:Integer);
//清空链表中的信息
procedure      CleatList;
//得到链表数量
property  Count:Integer read FCount; 
end;

 

implementation
procedure TListControl.AddList(NameID: Integer; Name: String;

  Age: Integer);

var

  FMyInfo:PMyInfo;

begin

  Entercriticalsection(FCriticalSection);

  try

    New(FMyInfo);

    FMyInfo.NameID:=NameID;

    FMyInfo.Name:=Name;

    FMyInfo.Age:=Age;

    FMyInfo.Next:=nil;

    //头指针是否为空
if not Assigned(FFirst) then

    begin

      FFirst:=FMyInfo;

    end

    else

    begin

      FLast.Next:=FMyInfo;

    end;

    FLast:=FMyInfo;

    Inc(FCount);

  finally

    Leavecriticalsection(FCriticalSection);

  end;

end;

 

procedure TListControl.ClearList;

var

  FMyInfo,FOldMyInfo:PMyInfo;

begin

  Entercriticalsection(FCriticalSection);

  try

    FMyInfo:=FFirst;

    while Assigned(FMyInfo) do

    begin

      FOldMyInfo:=FMyInfo.Next;

      Dispose(FMyInfo);

      FMyInfo:=FOldMyInfo;

end;
FCount:=0;

    FLast:=nil;

  finally

    Leavecriticalsection(FCriticalSection);

  end;

end;

 

constructor TListControl.Create;

begin

  InitializeCriticalSection(FCriticalSection);

  FCount:=0;

end;

 

procedure TListControl.DelList(NameID: Integer);

var

  FMyInfo,FOldMyInfo:PMyInfo;

begin

  Entercriticalsection(FCriticalSection);

  try

    FMyInfo:=FFirst;

    FOldMyInfo:=nil;

    while Assigned(FMyInfo) do

    begin

      if FMyInfo.NameID = NameID then

      begin

        //删除的是否是尾指针
if FMyInfo = FLast then

        begin

          FLast:=FOldMyInfo;

        end

        else

        begin

          FOldMyInfo.Next:=FMyInfo.Next;

        end;

        Dispose(FMyInfo);

        Dec(FCount);

        break;

      end;

      FOldMyInfo:=FMyInfo;

      FMyInfo:=FMyInfo.Next;

    end;

  finally

    Leavecriticalsection(FCriticalSection);

  end;

end;

 

destructor TListControl.Destroy;

begin

  DeleteCriticalSection(FCriticalSection);

  inherited;

end;

 

procedure TListControl.SelList(NameID: Integer; var Name: String;

  var Age: Integer);

var

  FMyInfo,FOldMyInfo:PMyInfo;

begin

  Entercriticalsection(FCriticalSection);

  try

    FMyInfo:=FFirst;

    FOldMyInfo:=nil;

    while Assigned(FMyInfo) do

    begin

      if FMyInfo.NameID = NameID then

      begin

        Name:=FMyInfo.Name;

        Age:=FMyInfo.Age;

        break;

      end;

      FOldMyInfo:=FMyInfo;

      FMyInfo:=FMyInfo.Next;

    end;

  finally

    Leavecriticalsection(FCriticalSection);

  end;

end;

 

以上我大致写了一下自己编写链表类的实现,现在有个问题我一直没有想出来,就是如果对于这个类写Sort(排序)方法,在TList类中有个Sort方法,此方法我看了一下使用的是快速排序法进行排序,至于排序条件它是透出了一个用户自己的函数来实现的。我在我写的类中试着也用这种方法实现,可是没有实现,希望实现过的朋友不吝赐教。谢谢。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值