删除双向链表上的功能

时间:2014-03-19 06:26:36

标签: c++ pointers delete-operator doubly-linked-list

我正在尝试将我的删除功能用于双向链表。我觉得我的代码是正确的,但它一直在破碎。我相信当我删除节点时它有一些事情要做,但我不确定编译器是否一直把我带到throw.cpp?所以我不太清楚什么是错的。这是我的代码:

  ItemType remove(int index) 
  {
    ItemType name;
    Node* temp;
    Node* current;
    int pos = 0;
    int endpos = size - 1;

    if (index >= 0 && index <= size)
    {
        if (index == 0)
        {
            temp = head;
            delete head;
            head = temp->next;
            size--;
            name = temp->info;
            return name;
        }
        else if (index == size - 1)
        {
            temp = tail;
            delete tail;
            tail = temp->prev;
            size--;
            name = temp->info;
            return name;
        }
        else if (index <= size/2)
        {
            current = head;
            while (pos != index)
            {
                current = current->next;
                pos++;
            }
        }
        else if (index > size/2)
        {           
            current = tail;
            while (endpos != index)
            {
                current = current->prev;
                endpos--;
            }
        }
    }

    temp = current;
    current->prev->next = current->next;
    current->next->prev = current->prev;
    delete current;
    size--;
    name = temp->info;
    return name;


  }

如果有人能看到可能会出现问题的问题。

2 个答案:

答案 0 :(得分:1)

错误是什么?

有些建议,在删除头部和尾部时,先将新的头/尾指针设置为先删除旧指针。所以代码

 temp = head;
 delete head;
 head = temp->next;

应改为

 temp = head;
 head = temp->next;
 delete temp;

为尾巴做同样的事情。这是因为当您致电delete head时,与temp指向同一位置的head现在具有垃圾值,因此您不能在后续使用temp->next命令。

同样在调用name = temp->info时,请确保它在删除变量之前。

答案 1 :(得分:0)

以下是一些更正

而不是

if (index >= 0 && index <= size)

使用

 if (index >= 0 && index < size)

您正在更新指针之前删除节点,这就是崩溃的原因。所以首先你需要更新头指针然后删除temp。喜欢这个

temp = head;
head = head->next;
delete temp;

同样适用于删除尾指针

temp = tail;
tail = tail->next;
delete temp;

此处删除临时非当前

temp = current;
current->prev->next = current->next;
current->next->prev = current->prev;
delete temp;

并使用

name = current->info;