读书人

free()的用法,该如何解决

发布时间: 2012-09-04 14:19:30 作者: rapoo

free()的用法

C/C++ code
taskList DeleteTask(taskList l, char* name){    if(l==NULL)    return NULL;        if(strcmp(l->name,name)==0){        if(l->prev==NULL&&l->next==NULL){            return NULL;        }        if(l->prev==NULL&&l->next!=NULL){            l=l->next;            l->prev=NULL;            l=DeleteTask(l,name);            return l;        }        else if(l->next==NULL &&l->prev!=NULL){            return NULL;        }else{            l=l->next;            l->prev=l->prev->prev;            l=DeleteTask(l,name);            return l;        }    }    l->next=DeleteTask(l->next,name);         return l;}




这是一个双链表的删除
我应该怎么使用free(),还是这个方法没问题?

[解决办法]
else{
p=l; l=l->next;
l->prev=l->prev->prev;
free(p)
l=DeleteTask(l,name);
return l;
}

[解决办法]
你这个问题貌似和free()其实没有太多关系,不如标为链表如何释放

还是这个方法没问题?
----------------------
其它不说,用递归的方式去释放链表中的一个节点,是非常不明智的。不尽效率低,而且有可能由于递归太深而导致函数栈爆了。

给一段代码,也许可以提供些帮助咯
---------------------
USERDATA _PopDListTheNode(_DLISTPTR *p_rsList, USERDATA value,
COMPAREFUNC func )
{
_DLIST*tmp = NULL, *tmp1 = NULL;
USERDATA p = NULL;

if( p_rsList == NULL || func == NULL ||
_CheckDListObjectType( *p_rsList ) < 0 )
{
_LogSysError( "2LST1405", "双向列表删节点:类型错误或者参数错误", NULL);
TRACEFUNC( "_PopDListTheNode" );
return NULL;
}

tmp1 = (_DLIST *)*p_rsList;
/* 如果是头部节点,则直接释放 */
if( func( tmp1->data, value ) == 0 )
{
*p_rsList = (_DLISTPTR)tmp1->next;
if( tmp1->next != NULL )
tmp1->next->prev = NULL;
p = tmp1->data;
free( tmp1 );
return p;
}
for( ; tmp1 != NULL; tmp1 = tmp )
{
tmp = tmp1->next;
if( func( tmp->data, value ) == 0 )
{
tmp1->next = tmp->next;
if( tmp->next != NULL )
tmp->next->prev = tmp1;
p = tmp->data;
free( tmp );
return p;
}
}
_LogSysError( "2LST1410", "双向列表删节点:指定对象不存在", NULL);
TRACEFUNC( "_PopDListTheNode" );
return NULL;
}

读书人网 >C语言

热点推荐