【问题标题】:C++ Doubly-linked list "delete tail" functionC++双向链表“删除尾部”函数
【发布时间】:2016-07-06 04:34:11
【问题描述】:

我已经制作了单链循环列表,效果很好,但是在这种情况下,我遇到了这样的问题,如果我想删除尾部,它将删除它,如果节点作为尾部插入,但如果它作为头部插入则不会。我想,问题出在inserthead-inserttail连接或delete tail功能上,但找不到。我会很感激你的帮助。

结构:

struct Element{
int value;
Element *prev, *next;

};

struct List2W{
    Element *tail;
};

代码:

void insertHead(List2W& l, int x){

Element *new_head = new Element;
new_head->value=x;

if(isEmpty(l))
{
    new_head->next=new_head;
    new_head->prev=new_head;
    l.tail=new_head;
}
else
{
    new_head->next=l.tail->next;
    new_head->prev=l.tail;
    l.tail->next=new_head;
}

}

void insertTail(List2W& l, int x){

Element *new_tail = new Element;
new_tail->value=x;

if(isEmpty(l))
{
    new_tail->next=new_tail;
    new_tail->prev=new_tail;
}
else
{
    new_tail->next=l.tail->next;
    new_tail->prev=l.tail;
    l.tail->next=new_tail;
}
l.tail=new_tail;

}

bool deleteTail(List2W& l, int &value){

if(isEmpty(l))
    return false;

else if(l.tail->next==l.tail)
    {
        value=l.tail->value;
        l.tail=NULL;
    }

else
{
    value=l.tail->value;
    (l.tail->prev)->next=l.tail->next;
    (l.tail->next)->prev=l.tail->prev;
    l.tail=l.tail->prev;
}
return true;}

【问题讨论】:

    标签: c++ doubly-linked-list unordered cyclic


    【解决方案1】:

    void insertTail(List2W& l, int x) {
        // a part is omitted
        new_tail->next = l.tail->next;
        new_tail->prev = l.tail;
        l.tail->next = new_tail;
        (l.tail->next)->prev = new_tail;  // is this unnecessary?
    }
    

    【讨论】:

    • 哇,你还费心去画画。谢谢你。不过,我不明白你为什么说插入头是不可能的。我没有看到任何错误,它似乎工作正常。请您进一步解释为什么(1)不起作用? new_tail->下一个=l.tail->下一个; //对于新元素中的“下一个”,我分配了与指向头部相同的尾部,因此在此之后new_tail->next应该指向l.tail->next(即头部)
    【解决方案2】:

    好的,所以我的 inserthead 函数缺少一行,应该将 head 的前一个与 new_head 连接起来:

     else
        {
            (l.tail->next)->prev=new_head; // here
            new_head->next=l.tail->next;
            new_head->prev=l.tail;
            l.tail->next=new_head;
        }
    

    感谢@nariuji,您让我重新分析了该功能,并感谢您的关注。除此之外,我只需要注意实际删除尾部以释放内存,应该没问题。

    【讨论】:

      猜你喜欢
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2014-03-04
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      相关资源
      最近更新 更多