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;
//程序运行一段时间之后会在访问链表时无限循环,不知道问题出在哪里,还望各位达人解惑一下。

刚开始在论坛里逛,没有分,望见谅!
...全文
110 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
所得寺内 2008-03-18
  • 打赏
  • 举报
回复
忘了给出新节点了
//申请内存
ANode := PNode(GlobalAlloc(GPTR, sizeof(Node)));

//释放内存
GlobalFree(DWORD(ANode));

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧