主题:论坛里有没高手知道怎么删除一个链表结点啊?(2天了没人能解决吗)
sageking2
[专家分:200] 发布于 2008-04-25 23:09:00
要求:只删除最大的结点,用递归,最好别用引用类型( *&a .)
void DelMax(LinkList *h)
{
...........
........DelMax(.);
}
int main()
{
Creat(h);
DelMax(h);
Disp(h);
}
最后更新于:2008-04-27 20:35:00
回复列表 (共10个回复)
沙发
qiaoqi [专家分:10] 发布于 2008-04-25 23:56:00
蛮简单得呀!只要将该节点的钱前一节点及后一节点指针修改,然后将该节点释放掉就可以了!
板凳
sageking2 [专家分:200] 发布于 2008-04-26 08:47:00
1.找最大的结点不容易
2.不能破坏
3.必须用递归
p->next=p->next->next
是绝对不行的
3 楼
free_fly_jie [专家分:10] 发布于 2008-04-27 20:54:00
最大的节点 什么东西
值最大 还是空间最大 ?
貌似可以先筛选在 p->next=q->next;
在释放那个q节点 就可以了吧!
4 楼
free_fly_jie [专家分:10] 发布于 2008-04-27 20:57:00
补充:
“貌似可以先筛选在 p->next=q->next;”
应该是 貌似可以先筛选 再 p->next=q->next;
p指向最大节点的前一个 q指向最大节点
5 楼
chanjar [专家分:160] 发布于 2008-05-01 22:24:00
[color=FF0000]struct Test {
.....;
Test* next;
void DelMax();
void Creat();
void Disp(h);
};
void Test::DelMax() {
if (...) { //判断是否是最大的条件你自己写
... //删除的操作
}
else {
next->DelMax(); //递归,移动到下一个变量,并调用下一个变量的DelMax()成员函数
}
}[/color]
int main() {
Creat(h);
DelMax(h);
Disp(h);
}
6 楼
chanjar [专家分:160] 发布于 2008-05-01 22:30:00
如果像LZ这样不用成员函数的,那么就这样
struct LinkList {
....;
LinkList* next;
};
void DelMax(LinkList *h)
{
if (...) { //判断条件
... //删除操作
}
else {
DelMax(h->next);
}
}
7 楼
zzz822163 [专家分:140] 发布于 2008-05-02 20:10:00
linka *pre;
int maxd;
int NoFirst;
void DelMax(linka *h)
{
if (!h->next)
{
if(NoFirst)
pre->next=pre->next->next;
else
{ //最大的是第一个点
pre->data=pre->next->data;
pre->next=pre->next->next;
}
return ;
}
else
{
if(h->next->data>maxd)
{
NoFirst=1;
maxd=h->next->data;
pre=h;
}
DelMax(h->next);
}
}
int main() {
Creat(h);
maxd=h->data;
pre=h;
DelMax(h);
Disp(h);
}
主要是用了3个全局变量
8 楼
bpttc [专家分:8790] 发布于 2008-05-03 11:44:00
递归调用只能写在函数尾么?显然不是
1.先判断当前节点是否最大,若最大,记录下当前节点的地址(全局)
2.递归到下一个节点
3.递归出来之后,判断记录的是不是本身的节点,若是,删除即可
写了个伪代码
void DelMax( list L )
{
static p = NULL, max = -INF;
if ( NULL == L )
{
return;
}
if ( L->data > max )
{
max = L->data;
p = L;
}
DelMax( L->next );
if ( L == p )
{
Del( L );
}
}
9 楼
sageking2 [专家分:200] 发布于 2008-05-03 20:15:00
回来了!谢谢各位的捧场,这些天差点绝望了.前3位的回复虽然没什么技术作用,但是给了我光明.zzz822163的全局变量就是问题的突破口.bpttc试问到这个时候你怎么删除 if ( L == p )
{
Del( L );
}
L的前后指针找起来可不容易.
10 楼
bpttc [专家分:8790] 发布于 2008-05-03 20:38:00
[quote]回来了!谢谢各位的捧场,这些天差点绝望了.前3位的回复虽然没什么技术作用,但是给了我光明.zzz822163的全局变量就是问题的突破口.bpttc试问到这个时候你怎么删除 if ( L == p )
{
Del( L );
}
L的前后指针找起来可不容易.[/quote]
至于怎么删除,我想讲数据结构的书上都有
单链表有单链表的方法,双链表有双链表的方法
如果你需要额外的数据来进行删除,那么应该...
总之,这题的思路是很多的。关键点在于如何确定最大的点,以及何时删除。
何时删除? 很多选择
我来回复