| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 444 人关注过本帖
标题:递归删除,求改错!
只看楼主 加入收藏
爱编聪聪
Rank: 2
等 级:论坛游民
帖 子:26
专家分:20
注 册:2013-9-16
结帖率:100%
收藏
已结贴  问题点数:17 回复次数:8 
递归删除,求改错!
删除 不带头结点 的单链表 中 数据域 为x的全部结点
递归实现,求改错!!
void delete_linklist(linklist *L,int x)
{
    linklist *p;
    if(L==NULL)
        return;
    else if(L->data==x)
    {
        p=L;
        L=L->next;
        free(p);
        delete_linklist(L,x);
    }
    else
        delete_linklist(L->next,x);
}
搜索更多相关主题的帖子: return 
2013-11-10 13:31
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:12 
else if(L->data==x)
{
    p=L;
    L=L->next;
    free(p);
    delete_linklist(L,x);
}

这部分代码执行后,你把当前节点成功删除,但是该节点的前驱(假设存在)和后驱(假设存在)断了

比如说 1 2 3 4 5,要删除3,把3删除后,2 的next应该是 4 的,但你的代码没有这个实现


[fly]存在即是合理[/fly]
2013-11-10 14:08
爱编聪聪
Rank: 2
等 级:论坛游民
帖 子:26
专家分:20
注 册:2013-9-16
收藏
得分:0 
回复 2楼 azzbcc
这个递归实现的就是一直判断首节点是否满足删除条件 如果满足,则删除首节点,如果不满足,则让 head->next作为参数,进行再次调用本函数,再次判断首节点是否满足删除条件,所以这个过程一直实现的是删除首节点,不就是
        p=L;
        L=L->next;
        free(p);(删除首节点)吗?(L为首节点)
2013-11-10 14:55
爱编聪聪
Rank: 2
等 级:论坛游民
帖 子:26
专家分:20
注 册:2013-9-16
收藏
得分:0 
回复 2楼 azzbcc
哦哦,我知道了,就是这错了,谢谢
2013-11-10 15:33
爱编聪聪
Rank: 2
等 级:论坛游民
帖 子:26
专家分:20
注 册:2013-9-16
收藏
得分:0 
回复 2楼 azzbcc
版主,我是真写不对了,再指点我一下吧。。。。。。。。
2013-11-10 16:12
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:5 
有两种思路,一是把前驱的指针以参数形式添加到函数中;二就是当前节点不动,删除后驱


[fly]存在即是合理[/fly]
2013-11-10 22:38
唐书豪
Rank: 2
等 级:论坛游民
帖 子:28
专家分:52
注 册:2013-5-10
收藏
得分:0 
可以给删除函数返回一个参数是链表的头结点,参数L改为head头结点,每一次调用都去从头遍历链表,然后删除节点的时候定义两个结点指针,1 2 3 4 5要删除3,这时pf->2,pd->3,  pf->next = pd->next;free(pd);
2013-11-10 23:07
爱编聪聪
Rank: 2
等 级:论坛游民
帖 子:26
专家分:20
注 册:2013-9-16
收藏
得分:0 
回复 2楼 azzbcc
嗯嗯,我知道怎么改了,谢谢
2013-11-11 23:22
请叫我α
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-11-12
收藏
得分:0 
我尝试按你的思路去修改,没成功,你传进去的节点始终作为了第一个节点,那么由于是单向链表,所以无法找到前节点。你可以把函数改为传三个参数的,待判断节点的前一个节点,待判断节点,以及要匹配的数值,这样就好写程序了,分为头结点和非头结点的两种情况来递归就行啦。
2013-11-12 13:10
快速回复:递归删除,求改错!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016879 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved