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

简介:
Delphi中使用链表,我们第一个想到的自然是使用TList类来实现(以前我也是这样做的)。但是当我们仔细看一下TList的实现就会发现这个类的实现其实使用的是数组的方式来实现的。哪如何编写自己的链表管理类呢?
其实这个问题在几乎每个将数据结构的书中都有讲到。这里我大概写一下我在写自己的链表管理中使用的方法。如有不正确的地方希望大家指正。
首先定义一个保存数据的结构:
PMyInfo = ^TMyInfo;
TMyInfo = record
       NameID:Integer;
       Name:String[20];
       Age:Word;
       Next: PMyInfo;
End;
 
定义一个类:
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方法,此方法我看了一下使用的是快速排序法进行排序,至于排序条件它是透出了一个用户自己的函数来实现的。我在我写的类中试着也用这种方法实现,可是没有实现,希望实现过的朋友不吝赐教。谢谢。
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/105296如需转载请自行联系原作者

fxh7622
相关文章
|
6月前
|
C++
【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境
【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境
84 1
|
存储 安全 Java
【JavaSE专栏49】Java集合类LinkedList解析,链表和顺序表有什么不同?
【JavaSE专栏49】Java集合类LinkedList解析,链表和顺序表有什么不同?
|
6月前
|
设计模式 测试技术
在实现链表的代码中,为什么要使用`Node`类而不是直接在`LinkedList`类中定义节点?
在实现链表的代码中,为什么要使用`Node`类而不是直接在`LinkedList`类中定义节点?
57 1
指针_链表_结构体_类 2021-02-17
指针_链表_结构体_类 2021-02-17
|
Java 容器
Java每日一练(20230510) 生成器类、螺旋矩阵II、删除链表的重复元素II
Java每日一练(20230510) 生成器类、螺旋矩阵II、删除链表的重复元素II
96 0
|
索引 Python
Python 触“类”旁通5|链表类才是单链表的主咖
Python 触“类”旁通5|链表类才是单链表的主咖
65 0
|
测试技术 Python 容器
Python 触“类”旁通4|重载运算符之单链表的“加减乘除”
Python 触“类”旁通4|重载运算符之单链表的“加减乘除”
68 0
|
存储 机器学习/深度学习 算法
Python 触“类”旁通2|数据结构入门之单链表的创建和遍历
Python 触“类”旁通2|数据结构入门之单链表的创建和遍历
154 0
|
存储 算法 Python
Python 触“类”旁通1|以单链表为例,一步步深入了解类
Python 触“类”旁通1|以单链表为例,一步步深入了解类
56 0
|
存储 C++ 索引
Python 新手刚学链表,做了一个“捣浆糊”版的单链表类
Python 新手刚学链表,做了一个“捣浆糊”版的单链表类
95 0
下一篇
无影云桌面