回 帖 发 新 帖 刷新版面

主题:论坛里有没高手知道怎么删除一个链表结点啊?(2天了没人能解决吗)

要求:只删除最大的结点,用递归,最好别用引用类型( *&a .)
void DelMax(LinkList *h)
{
    ...........
   ........DelMax(.);
}
int main()
{
   Creat(h);
   DelMax(h);
   Disp(h);
}

回复列表 (共10个回复)

沙发

蛮简单得呀!只要将该节点的钱前一节点及后一节点指针修改,然后将该节点释放掉就可以了!

板凳

1.找最大的结点不容易
2.不能破坏
3.必须用递归
p->next=p->next->next
是绝对不行的

3 楼


最大的节点  什么东西  
值最大  还是空间最大 ?
  貌似可以先筛选在  p->next=q->next;
  在释放那个q节点 就可以了吧!

4 楼

补充:
  “貌似可以先筛选在  p->next=q->next;”

应该是  貌似可以先筛选  再  p->next=q->next;
   p指向最大节点的前一个  q指向最大节点

5 楼

[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 楼

如果像LZ这样不用成员函数的,那么就这样

struct LinkList {
    ....;
    LinkList* next;
};

void DelMax(LinkList *h)
{
    if (...) {    //判断条件
    ...    //删除操作
    } 
      else {
        DelMax(h->next);        
    }

}

7 楼

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 楼

递归调用只能写在函数尾么?显然不是

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 楼

回来了!谢谢各位的捧场,这些天差点绝望了.前3位的回复虽然没什么技术作用,但是给了我光明.zzz822163的全局变量就是问题的突破口.bpttc试问到这个时候你怎么删除 if ( L == p )
    {
        Del( L );
    }
L的前后指针找起来可不容易.

10 楼

[quote]回来了!谢谢各位的捧场,这些天差点绝望了.前3位的回复虽然没什么技术作用,但是给了我光明.zzz822163的全局变量就是问题的突破口.bpttc试问到这个时候你怎么删除 if ( L == p )
    {
        Del( L );
    }
L的前后指针找起来可不容易.[/quote]

至于怎么删除,我想讲数据结构的书上都有

单链表有单链表的方法,双链表有双链表的方法

如果你需要额外的数据来进行删除,那么应该...

总之,这题的思路是很多的。关键点在于如何确定最大的点,以及何时删除。

何时删除? 很多选择

我来回复

您尚未登录,请登录后再回复。点此登录或注册