如何在链表中使用对象?(200分)

  • 主题发起人 主题发起人 东张西望
  • 开始时间 开始时间

东张西望

Unregistered / Unconfirmed
GUEST, unregistred user!
我创建了一个动态链表,其中的每个元素是对象类型,根据需要动态生成节点时,
我的方法用该元素的create函数来生成临时对象然后取地址赋值给链指针,而不是
用new分配内存,结果该指针指向的对象无法保存,一旦有内存操作,该地址又被
夺去分配。现在我该如何才能在链表中使用对象呢?!
这个问题折腾我好几天了,请高手赐教!200分献上!
 
贴出源码看看。
 
loOK:

Type
TSensorp = ^TSensor;
TSensor = class(TObject)
private
.........
FName: ShortString;
FNextSensor: TSensorp;
...
procedure SetName(const Value: ShortString);
procedure SetNextSensor(const Value: TSensorp);

public
...
property Name:ShortString read FName write SetName;
property NextSensor:TSensorp read FNextSensor write SetNextSensor;

end;

//Delaration of class <TSensorLink>
TSensorLink = class
// Data Members:
public
...
Head: TSensorp;
Current: TSensorp;
private

// Function Members:
public
...
function Insert(ASensor:Tsensor):boolean;

end;
....



function TSensorLink.Insert(ASensor: Tsensor): boolean;
var
tempSensor:TSensor;
tempPoint:TSensorp;
begin

tempSensor := TSensor.create;
tempSensor.name:=ASensor.name;
...
if head=NIL then
begin //原为空串
tempSensor.nextSensor:=NIL;
head := @tempSensor;
end
else if head^.number>TempSensor.number then
begin //加入的纪录比头节点还要小
tempSensor.nextSensor:=head^.nextSensor;
head^.nextSensor:=@tempSensor;
end
else begin //在表中搜索
current:=head;
tempPoint:=current;

while (current<>NIL) and (current^.number<tempSensor.number) do
begin
tempPoint:=current;
current:=current.nextSensor;
end;
tempSensor.nextSensor:=current;
tempPoint.nextSensor:=@tempSensor;
end;
.....

end;
 
TSensorp = ^TSensor;
TSensorp的定义似乎没有必要,在Object Pascal中,对象名本身就是指针。

于是,链表定义中Head和Current的类型应为TSensor即可,同样链表节点定义中的NextSensor
的类型也应为TSensor。

当你需要把节点Sensor1链接到Sensor2的后面时,只需写:
Sendor2.NextSensor := Sensor1;
而不是
Sensor2^.NextSensor := @Sensor1;

我猜你原先是一个c/c++程序员,right?
 
delphi中没有new啦,你inherite了object的create就是new了

我左看右看你的程序不会有错,很标准。

你不是用ASensor来insert的而是create了另一个tempsensor,也就是为每一个节点都分配了一个
单元。


 
还没测试,不过无论如何你的答案给我的启示是巨大,200分只是微小敬意,
先奉献上。


ps : 我也称不上C/C++程序员,以前学oop,还有学数据结构时看的是C/C++代码,
开发中用的更多的还是DELPHI,不过对object pascal没什么研究,语言掌
握上还是C/C++更有心得。
再次表示感谢!
 
TList!创建你的对象后,调用Add(P: Pointer)方法,如果你要准确定位的话,
可以采用hash查找定位,因为它是线性的。
 
to sonie: 谁说Delphi中没有New?看看Delphi帮助:

Creates a new dynamic variable and sets P to point to it.

Unit

System

Category

dynamic allocation routines

procedure New(var P: Pointer);

Description

The New procedure creates a new dynamic variable and sets a pointer variable
to point to it. ......

虽然“东张西望”的程序确实不需要用到New过程,但你也不能说Delphi没有这个过程啊。
 
to 昊海
不好意思,结了帖才看到你的文章,有没办法另外给分?
 
to 飞龙在天:此new非彼new也.
我指的new是要调用对象的构造函数分配空间,你这里的动态创建了一个指针空间。
 
后退
顶部