C ++ Doubly-linked list" delete tail"功能

时间:2016-03-19 11:18:25

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

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

结构:

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;}

2 个答案:

答案 0 :(得分:0)

enter image description here

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 :(得分:0)

好的,所以我的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,你让我重新分析了这个功能,感谢你的兴趣。除此之外,我只需要注意实际删除尾部以释放内存,应该没问题。