free()的用法

伟明 2012-08-30 07:54:05
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(),还是这个方法没问题?
...全文
108 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
伟明 2012-08-30
  • 打赏
  • 举报
回复
typedef struct task{
struct task *prev;
struct task *next;
char *name;
unsigned int t;
int type;
int fre;
}taskNode, *taskList;

taskList CreateTask(unsigned int n_t, int n_fre,char *n_name, int n_type){

taskList l = (taskList)malloc(sizeof(taskNode));
l->t=n_t;
l->name= strdup(n_name);
l->type=n_type;
l->fre=n_fre;
l->prev=NULL;
l->next=NULL;
return l;
}

taskList InsertTask(taskList l, taskList n_l){
if(l==NULL)
return n_l;

if(n_l->t <= l->t){
if(l->prev==NULL){
n_l->next=l;
l->prev=n_l;
return n_l;
}
n_l->prev = l->prev;
n_l->next=l;
l->prev->next=n_l;
l->prev=n_l;
return n_l;
}
if(l->next==NULL){
l->next = n_l;
n_l->prev=l;
return l;
}

l->next = InsertTask(l->next, n_l);
return l;
}
int main(int argc, char **argv){

taskList t_list =NULL;

t_list = InsertTask(t_list,CreateTask(0,0,"a",0));
t_list = InsertTask(t_list,CreateTask(1,0,"b",0));
t_list = InsertTask(t_list,CreateTask(2,0,"c",0));

taskList temp =NULL;
temp= t_list;



t_list = InsertTask(t_list,CreateTask(3,0,"d",0));
t_list = InsertTask(t_list,CreateTask(4,0,"f",0));
if(temp->next==NULL)
printf("1s%d %s\n",temp->t,temp->name);
while(temp->next!=NULL){
printf("2s%d %s\n",temp->t,temp->name);
temp = temp->next;

}if(temp->next==NULL);
printf("3s%d %s\n",temp->t,temp->name);




return 0;
}

为什么temp会被改动 ,如何使temp不被后面加上去的改动,只显示abc
伟明 2012-08-30
  • 打赏
  • 举报
回复
tasklist up=NULL;
	taskList temp=NULL;
temp=up;
if(FindSchedule(scheduler_list,current_time)==NULL){

scheduler_list=InsertSchedule(scheduler_list,CreateSchedule(current_time,NULL,temp));
}
else{
FindSchedule(scheduler_list,current_time)->upcomingTask = InsertTask(FindSchedule(scheduler_list,current_time)->upcomingTask,temp);
}


我觉得是这段代码有问题,up是tasklist(双链表) 来存数据 假设up有1,2,3,4的数据 之后递给FindSchedule(scheduler_list,current_time)->upcomingTask(是一个tasklist 双链表),传递完后up加数据5
FindSchedule(scheduler_list,current_time)->upcomingTask 这个upcomingTask的双链表居然也加了5进去,为什么?

在后面用free(temp)就有问题 不用数据又不正确
wqkjj 2012-08-30
  • 打赏
  • 举报
回复
你这个问题貌似和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;
}
yht8708 2012-08-30
  • 打赏
  • 举报
回复
else{
p=l; l=l->next;
l->prev=l->prev->prev;
free(p)
l=DeleteTask(l,name);
return l;
}
伟明 2012-08-30
  • 打赏
  • 举报
回复
我如果我建以
dlist a -》假设已经有一些数据
dlist temp
temp =a
a有改动会影响temp吗?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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