delphi - Pascal 中的链表

标签 delphi data-structures linked-list pascal

我正在寻找 Pascal 中链表的良好且简单的实现。 由于我是 Pascal 初学者,它作为学习 Material 对我有很大帮助。

感谢您的任何提示。

最佳答案

我在旧邮件中发现了我们已经完成的实现。该代码是“法语”,所以我不会碰它,以免忘记某个会破坏编译的函数:-)

首先,我们有一个“元素”类型,让我们可以轻松更改要存储在列表中的内容:

unit U_ELEMENT;

interface

{ We store integers }
type
    T_ELEMENT = Integer;

{ Reads an element }
procedure lireElement(out res:INTEGER; out code:WORD; out ch:STRING);
{ Write and element }
procedure ecrireElement(const t:T_ELEMENT);

implementation

procedure lireElement(out res:T_ELEMENT; out code:WORD; out ch:STRING);
begin
    write('> ');readln(ch);
    val(ch,res,code);
end;

procedure ecrireElement(const t:T_ELEMENT);
begin
    write(t);
end;

end.

然后是实际的列表模块,其设计目的是在列表的开头添加元素:

unit U_LISTE;

interface

uses U_ELEMENT;

const LISTEVIDE = NIL;
type
    T_LISTE = ^T_CELLULE; 
    T_CELLULE = record
        info: T_ELEMENT; { The stored information }
        suivant: T_LISTE; { Pointer to the next element }
    end;
{ Add an heading element }
function ajouteEnTete(e:T_ELEMENT;l:T_LISTE):T_LISTE;
{ returns the head of the list }
function tete(l:T_LISTE):T_ELEMENT;
{ returns the list, without the head }
function reste(l:T_LISTE):T_LISTE;
{ List empty? }
function estListeVide(l:T_LISTE):BOOLEAN;
{ Modify the header element }
procedure modifierTete(var l:T_LISTE;const e:T_ELEMENT);
{ Modify the list after the head }
procedure modifierReste(var l1:T_LISTE; const l2:T_LISTE);

implementation

function ajouteEnTete(e:T_ELEMENT;l:T_LISTE):T_LISTE;
var l1:T_LISTE;
begin
    new(l1);
    l1^.info := e;
    l1^.suivant := l;
    ajouteEnTete := l1;
end;

function tete(l:T_LISTE):T_ELEMENT;
begin
    tete := l^.info;
end;

function reste(l:T_LISTE):T_LISTE;
begin
    reste := l^.suivant;
end;

function estListeVide(l:T_LISTE):BOOLEAN;
begin
    estListeVide := l=NIL;
end;

procedure modifierTete(var l:T_LISTE;const e:T_ELEMENT);
begin
    l^.info := e;
end;

procedure modifierReste(var l1:T_LISTE; const l2:T_LISTE);
begin
    l1^.suivant := l2;
end;

end.

还有一个小测试程序:

program testeliste;

uses U_ELEMENT,U_LISTE;

procedure afficherListe(const l:T_LISTE);
var l1: T_LISTE;
    vide: BOOLEAN;
begin
    write('(');
    l1 := l;
    vide := estListeVide(l1);
    while not(vide) do
    begin
        ecrireElement(tete(l1));
        l1 := reste(l1);
        vide := estListeVide(l1);
        if not(vide) then
            write(',');
    end;
    write(')');
    writeln;
end;

var res:T_ELEMENT;
    code:WORD;
    ch:STRING;
    i:INTEGER;
    l:T_LISTE;

Begin
    l:=LISTEVIDE;
    for i:=0 to 9 do
    begin
        lireElement(res,code,ch);
        l := ajouteEnTete(res,l);
    end;
    afficherListe(l);

    afficherListe(reste(l));
    afficherListe(reste(reste(reste(l))));
    afficherListe(ajouteEnTete(tete(l),l));

End.

正如我所说,这是我开始学习 CS 时编写的一个旧(非常旧)程序,因此它可能不适合:-),但我认为它对语法和全局有帮助想法。

关于delphi - Pascal 中的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3896629/

相关文章:

delphi - 自定义数字键盘并将特定数字发送到事件文本框

c++ - 这样使用嵌套 vector/multimap/map 可以吗?

c# - .Net 中对 LinkedList 的多线程访问

c++ - C++中不同对象的多个链表

arrays - 复制相同类型的数组

Java双端队列实现: Unable to find logic error in method addLast()

delphi - 将常量传递给作为开放记录数组的函数参数

delphi - Win32/Induc.A, "Delphi"-病毒,感染SysConst.pas,有人有代码示例可供搜索吗?

delphi - 如何强制链接器包含调试期间所需的函数?

algorithm - 用于查找具有相似含义的单词的最佳数据结构