free()的用法C/C++ codetaskList DeleteTask(taskList l, char* name){if(lNULL)return NULLif(strcmp(
free()的用法
C/C++ codetaskList 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;
}