首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

:大家帮看看删除链表项时如何释放内存空间啊

2012-02-05 
求救:大家帮看看删除链表项时怎么释放内存空间啊?我的是单向链表typeincomingcallptr^incomingcalltypei

求救:大家帮看看删除链表项时怎么释放内存空间啊?
我的是单向链表

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管理一个节点

热点排行