2010-10-09 98 views
2

林寻找一个良好的和简单的实现帕斯卡尔链表。 因为我是一名帕斯卡尔初学者,它会帮助我作为研究材料。链表帕斯卡尔

感谢您的任何提示。

回答

4

我发现早在我的旧邮件,我们做了一个实现。代码是“法语”,所以我不会去碰它,以免忘记某个地方会破坏汇编的功能:-)

首先,我们有一个“元素”类型,让我们轻松改变什么,我们想在清单上存储:

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,所以它可能不适合:-),但我认为这有助于语法和全球念头让老(很旧的)计划。

1

好文章:http://www.learn-programming.za.net/programming_pascal_learn14.html

网站似乎下降。在这里,你可以找到 - >Archived Version

+0

是的,我知道那篇文章。它是一个很好的,我喜欢所有的代码在一个文件中,所以我可以修补它,但不幸的是,该页面上的链接似乎已被打破。 – NumberFour 2010-10-09 08:52:47

+0

这也是第一个谷歌命中“pascal链表”。 – asveikau 2010-10-09 08:52:54

+1

+1 @NumberFour,代码就是你所需要的。由于两个原因,您无法找到更好的现成代码:(1)这是一个非常基本的数据结构,在日常生活中不是很有用。 (2)任何*真实*实现将在所有内容上都有太多的“装饰”代码。学习链表是关于处理指针,分配内存,释放内存,以及在出错时获取访问冲突。这实际上并不涉及数据结构。 – 2010-10-09 19:17:19