虚拟头节点循环链表,删除问题

时间:2017-08-05 17:05:48

标签: c++ linked-list

我目前正在学习循环链表,我遇到圆形链表模板的问题。它源自ADT链表类型。

我遇到的问题是删除节点,在某些情况下,程序在删除时会崩溃。我知道当我创建一个列表以防止这种情况发生时,我需要实现某种虚拟节点,但我不知道在代码中是这样做的。

我已经查看了有关此事的其他帖子,但我仍然迷失了。

如果有人可以就如何实现这一点分享一些指导,我会这样做 感激。

谢谢

插入

template <class Type>
void unorderedCircularLinkedList<Type>::insertFirst(const Type& newItem)
{
    nodeType<Type> *newNode;
    nodeType<Type> header;   <--- implement here?
    header.link = &header; <---- dereference the header?
    newNode = new nodeType<Type>; //create the new node
    newNode->info = newItem;    //store the new item in the node
    if (first == NULL)
    {
        first = newNode;
        last = first;
        last->link = first;
    }
    else
    {
        last->link = newNode;       //make last point to new node
        newNode->link = first;      //make new node point to first
        first = newNode;            //make first point to new node
    }
    count++;                    //increment count
}

删除:

template <class Type>
void unorderedCircularLinkedList<Type>::deleteNode(const Type& deleteItem)
{
    nodeType<Type> *current; //pointer to traverse the list
    nodeType<Type> *trailCurrent; //pointer just before current

    bool found;

    if (first == NULL)    //Case 1; the list is empty.
        cout << "Cannot delete from an empty list."
             << endl;
    else
    {
         if (first->info == deleteItem) //Case 2
         {
             current = first;
             count--;
         if (first->link == first) //the list has only one node
         {
             first = NULL;
             last = NULL;
         }
         else if (first->link == last) //the list has two nodes
         {
             first = first->link;
             first->link = first;
             last = first;
         }
         else
         {
             first = first->link;
             last->link = first;    
         }
         delete current;
    }
    else //search the list for the node with the given info
    {
        found = false;
        trailCurrent = first; //set trailCurrent to point to the first node
        current = first->link; //set current to point to the second node
        /* set pointer to point to the last node*/
        while (current != NULL && !found)
            if (current->info != deleteItem)
            {
                trailCurrent = current;
                current = current->link;
            }
            else
                found = true;
        if (found) //Case 3; if found, delete the node
        {

            trailCurrent->link = current->link;
            if (current == last)
                first = first->link;

            delete current;

            count--;

             //delete the node from the list

        }
        else
            cout << "The item to be deleted is not in the list." << endl;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

你的花括号搞砸了

if (first->info == deleteItem) //Case 2
         {
             current = first;
             count--;
         //missing '}' here
         if (first->link == first) //the list has only one node
         {
             first = NULL;
             last = NULL;
         }

并且我认为当你添加上面的

时,最后会有一个额外的