《Delphi 算法与数据结构》学习与感悟[10]: 双向链表

摘要:
如果在结构中取出另一个4字节的地址空间以指向上一个节点,它将成为一个双向链表;界面使用Windows、消息、SysUtils、变量、类、图形、控件、窗体、对话框、StdCtrls;typeTForm1=类(TForm)按钮1:T按钮;按钮2:T按钮
如果在结构中再拿出 4 个字节的地址空间指向上一个节点, 就成了双向链表了.

本例效果图:
《Delphi 算法与数据结构》学习与感悟[10]: 双向链表第1张
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  PMyRec = ^MyRec;
  MyRec = record
    Name: string[8];
    Age : Word;
    Prev,Next: PMyRec; {上一个与下一个的结构指针}
  end;

var
  CurrentNode: PMyRec;

{建立双向链表}
procedure TForm1.FormCreate(Sender: TObject);
var
  PrevNode: PMyRec;
  i: Integer;
begin
  PrevNode := nil;
  for i := 65 to 71 do  {建七个节点, 准备用 AA, BB, CC, DD, EE, FF, GG 来指定 MyRec.Name }
  begin
    New(CurrentNode);
    CurrentNode.Name := Chr(i) + Chr(i);
    CurrentNode.Age := i;
    CurrentNode.Prev := PrevNode;
    if Assigned(PrevNode) then PrevNode.Next := CurrentNode;
    PrevNode := CurrentNode;
  end;

  Button1.Caption := '上一个';
  Button2.Caption := '下一个';
end;

{上一个}
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned(CurrentNode.Prev) then
  begin
    CurrentNode := CurrentNode.Prev;
    Text := CurrentNode.Name + #44 + IntToStr(CurrentNode.Age);
  end else Text := '这是第一个节点';
end;

{下一个}
procedure TForm1.Button2Click(Sender: TObject);
begin
  if Assigned(CurrentNode.Next) then
  begin
    CurrentNode := CurrentNode.Next;
    Text := CurrentNode.Name + #44 + IntToStr(CurrentNode.Age);
  end else Text := '这是最后一个节点';
end;

end.

免责声明:文章转载自《《Delphi 算法与数据结构》学习与感悟[10]: 双向链表》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇socket-自我总结(1)vgrant使用简易教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SQL Server 事务、异常和游标

Ø 事务 在数据库中有时候需要把多个步骤的指令当作一个整体来运行,这个整体要么全部成功,要么全部失败,这就需要用到事务。 1、 事务的特点 事务由若干条T-SQL指令组成,并且所有的指令昨晚一个整体提交给数据库系统,执行时,这组指令要么全部执行完成,要么全部取消。因此,事务是一个不可分割的逻辑单元。 事务有4个属性:原子性(Atomicity)、一...

JS调用Delphi编写的OCX控件

原文:http://www.mamicode.com/info-detail-471283.html 一、使用Delphi XE2编写OCX控件   生成OCX工程:   1、File-New-Other,在New Items对话框中选择Delphi Projects-ActiveX-ActiveX Library   2、File-New-Ot...

HashMap之原理及死锁

一、HashMap原理 1.HashMap的本质就是数组和链表。table是一个entry数组,每一个数组元素保存一个Entry节点,而Entry节点内部又连接着同样key的下一个Entry节点,就构成了链表。. 详情见 HashMap源码分析 2.HashMap死锁原因: HashMap会造成死锁,因为HashMap是线程非安全的,多并发的情况...

Delphi 匿名函数的几个实际应用(一)  转

转 busintel 专栏包含如下的六个部分:   Anonymous Event Handlers 匿名事件处理器 Timing Anonymous Methods 计时功能匿名方法 Thread Synchronization with the VCL   VCL线程同步 Parallel For Loop 并行循环 AJAX in Delphi De...

RedisTemplate访问Redis数据结构(五)——ZSet

Redis 有序集合和无序集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。有序集合的成员是唯一的,但分数(score)却可以重复。redis正是通过分数来为集合中的成员进行从小到大的排序。 ZSetOperations提供了一系列方法对有序集合进行操作。首先初始化spring工厂获得redis...

delphi Firemonkey ListView 使用参考

delphi Firemonkey ListView 使用参考 Tokyo版本 http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Customizing_FireMonkey_ListView_Appearance  http://docwiki.embarcadero.com/RADStudio/Toky...