求救:大家帮看看删除链表项时怎么释放内存空间啊?
我的是单向链表
type
incomingcallptr = ^incomingcalltype;
incomingcalltype = record
callId: Integer;
nextitem : incomingcallptr;
end;
var
callitemlists :incomingcallptr ;
//---------------------------------------
procedure TMainform.incomingcalladditem(item:incomingcallptr); //插入链表项
var
i:integer;
ptr:incomingcallptr;
begin
if (callitemlists = nil) then
begin
new(callitemlists);
callitemlists := item;
end
else
begin
ptr := callitemlists;
while (ptr.nextitem <> nil) do
ptr := ptr.nextitem; //查询链表尾
ptr.nextitem := item; //在链表尾部加入链表项
end;
end;
//---------------------------------------
procedure TMainform.incomingcalldeleteitem(index:integer); //删除链表项
var
i,count:integer;
ptr,ptr2:incomingcallptr;
begin
count := incomingcallitemcount();
ptr := callitemlists;
ptr2 := callitemlists;
sendtodebug_log( 'delete ');
if count =1 then
begin
dispose(callitemlists);
callitemlists :=nil;
end
else if count > 1 then
begin
while(i <index-1) do
begin
ptr2 :=ptr2.nextitem;
end;
ptr := ptr2.nextitem;
ptr2.nextitem := ptr2.nextitem.nextitem;
dispose(ptr);//这样释放被删除的链表项正确吗?
end;
end;
//---------------------------------------
function TMainform.incomingcallitemcount():integer; //计算链表项数目
var
i:integer;
ptr:incomingcallptr;
begin
ptr := callitemlists;
i :=0;
while (ptr <> nil) do
begin
ptr := ptr.nextitem;
inc(i);
end;
result := i;
end;
[解决办法]
是通过Dispose释放的,不过你程序其它部分错漏的地方比较多
例如:
//插入链表项的时候就不用new(callitemlists);
//Index定位时i没有加1
建议用TList管理一个节点