delphi指針鏈表使用方法?
因?yàn)閐elphi的數(shù)據(jù)類(lèi)型使用很方便,我一直以來(lái)都沒(méi)有使用過(guò)指針,但最近的一個(gè)軟件需要使用到鏈表,所以不得不學(xué)習(xí)delphi的指針。不用不知道,到用的時(shí)候才發(fā)現(xiàn)凡是介紹delphi的書(shū)籍都回避了指針的問(wèn)題,好不容易在網(wǎng)上找到一篇《淺談Object Pascal的指針》。雖然文章那delphi的指針和c/c++的進(jìn)行了對(duì)比學(xué)習(xí),但實(shí)用例子實(shí)在太少了,所以我在寫(xiě)完程序后,把一些使用過(guò)程里的感想寫(xiě)下。
現(xiàn)在假設(shè)我們的鏈表存儲(chǔ)的只是一個(gè)變量 i,那么在c/c++里的結(jié)構(gòu)體定義如下:
struct Ttest
{
int i;
struct Ttest * next;
};
我仿照c的定義方式寫(xiě)了一個(gè)結(jié)構(gòu)體
type Ttest = record
i: integer;
next: ^Ttest;
end;
試編譯了一次,出錯(cuò)在 next: ^Ttest; 上(類(lèi)型未定義),看來(lái)在delphi嚴(yán)格語(yǔ)法下,結(jié)構(gòu)體里不能出現(xiàn)自己的結(jié)構(gòu)體指針,這就讓我有些為難了,看來(lái)只有想辦法對(duì)他進(jìn)行迂回作戰(zhàn)。經(jīng)過(guò)再次研究《淺談Object Pascal的指針》發(fā)現(xiàn)有一種無(wú)類(lèi)型指針Pointer可以使用,便把^Ttest替換為Pointer。編譯通過(guò)了。既然next指針是作為無(wú)類(lèi)型的指針,那在使用時(shí)就必須先把這個(gè)指針賦值給一個(gè)有類(lèi)型指針后才能對(duì)指針?biāo)赶虻慕Y(jié)構(gòu)體變量進(jìn)行控制。
有了結(jié)構(gòu)體,接下來(lái),我設(shè)計(jì)了一個(gè)用鏈表實(shí)現(xiàn)的隊(duì)列的類(lèi)TQueue。(這里給出的類(lèi)是簡(jiǎn)化了的)
Type
TQueue = class
private
First, last: ^Ttest
Public
Procedure add(s: integer);
End;
Procedure TQueue.add(s: integer)
Var
P: ^Ttest;
Begin
Getmam(P, sizeof(Ttest));
p.i := i;
p.next := nil;
last.next := p;
last := p;
End;
Add()是往隊(duì)列里添加一個(gè)數(shù)據(jù),它先用getman函數(shù)獲得一塊內(nèi)存,然后變量賦值,在把新分配的變量掛入鏈表的末端。看起來(lái)很簡(jiǎn)單,實(shí)際寫(xiě)起代碼也很簡(jiǎn)單,不過(guò)編譯器就是不給你通過(guò)。在 last := p 這里提示變量類(lèi)型不一致。我又重新檢查了一遍代碼,并為發(fā)現(xiàn)又什么問(wèn)題,都是定義為^Ttext的指針,為什么就是不行!對(duì)著屏幕發(fā)呆了一會(huì),決定進(jìn)行迂回作戰(zhàn),這次把first,last都定義為無(wú)類(lèi)型指針Pointer,再次編譯通過(guò)了。不過(guò)需要對(duì)add()進(jìn)行一些相應(yīng)的改動(dòng),添加了一個(gè)臨時(shí)結(jié)構(gòu)體變量t。
Procedure TQueue.add(s: integer)
Var
t, P: ^Ttest;
Begin
Getmam(P, sizeof(Ttest));
p.i := i;
p.next := nil;
t := last;
t.next := p;
last := p;
End;