Delphi双向链表的问题
所得寺内 2008-03-18 10:50:49 type
PNode = ^Node;
Node = record
data : Integer;
FUper : PNode;
FDown : PNode;
end;
TmList = record
FHead : PNode;
FLast : PNode;
end;
var global_list : TmList;
插入链表:InsertInToList(ANode : PNode);
if global_list.FHead = nil then
begin//如果链表表头为空时直接将链表头、尾节点设置成此记录
ANode^.FUper := nil;
ANode^.FDown := nil;
global_list.FHead := ANode;
global_list.FLast := ANode;
end
else//插入到链表尾
begin
global_list.FLast^.FDown := ANode;
ANode^.FUper := global_list.FLast;
ANode^.FDown := nil;
global_list.FLast := ANode;
end;
删除链表节点:RemoveFromList(ANode : PNode);
if ANode = global_list.FHead then
begin//先判断是否是链表头节点
if ANode = global_list.FLast then
begin//此前链表只有一个节点而已,清空链表
global_list.FHead := nil;
global_list.FLast := nil;
end
else//此节点是头节点但不是尾节点
begin
global_list.FHead := ANode^.FDown;//链表头节点指向此节点的后继
ANode^.FDown^.FUper := nil;//此节点后继的前驱改为空
end;
end
else//此节点不是头节点
begin
if ANode = global_list.FLast then//如果是尾节点的话修正新的尾节点
begin
global_list.FLast := ANode^.FUper;//链表尾指向此节点的前驱
ANode^.FUper^.FDown := nil;//此节点前驱的后继设为空
end
else//处于链表中间的非头节点非尾节点
begin
ANode^.FUper^.FDown := ANode^.FDown;(程序运行一段时间之后在这里会出现内存访问错误,不知道为什么)
ANode^.FDown^.FUper := ANode^.FUper;
end;
end;
访问链表(查找某一个节点):FindInList(ANode : PNode):Boolean;
var tmp : PNode;
tmp := global_list.FHead;
Result := false;
while tmp <> nil do
begin
if tmp^.data = ANode^.data then
begin
Result := true;
break;//找到之后跳出循环
end;
if tmp = global_list.FLast then
break
else
tmp := tmp^.FDown;
end;
//程序运行一段时间之后会在访问链表时无限循环,不知道问题出在哪里,还望各位达人解惑一下。
刚开始在论坛里逛,没有分,望见谅!