链表删除功能的运行时错误

时间:2014-03-09 20:57:53

标签: c++ linked-list nodes

我有一张CD附加到链接列表的CD列表。我可以成功附加CD并显示它们。但是当我尝试通过仅使用CD名称作为参数来删除CD时,我得到RunTime检查错误#3变量'previousNode'正在被使用而没有初始化。因此,当我将其初始化为0并调用remove函数时,程序会遇到错误并需要关闭。它建立得很好。如何使用正确的参数设置deleteNode?或者deleteNode函数有问题吗?我需要询问用户哪个CD要删除并删除该CD。如果您需要查看更多代码,请告诉我们。这是我追加到节点的内容。 CD NAME,ARTIST,LENGTH,SONG,SONG TITLE,SONG LENGTH,但我只想让用户输入CD NAME,整个节点将被删除。

删除Main中的功能

void remove_cd(LinkedList1<CD> *del)
{
    string name;        // To hold name of CD
    cout << "CD name to remove: ";
    cin.ignore();
    getline(cin, name);
    CD cd(name);
    del->deleteNode(cd);
}

链接列表删除功能

template <class T>
class LinkedList1 
{
private:
// Declare a structure
struct discList
{
    T value;
    struct discList *next;  // To point to the next node
};
discList *head;     // List head pointer
public:
// Default Constructor
LinkedList1()
{ head = NULL; }
// Destructor
~LinkedList1();
// Linked list operations
void appendNode(T);
void insertNode(T);
void deleteNode(T);
void displayList() const;
};

template<class T>
void LinkedList1<T>::deleteNode( T searchValue)
{
    discList *nodePtr;          // To traverse the list
    discList *previousNode;     // To point to the previous node

    // If the list is empty, do nothing
    if (!head)
        return;

    // Determine if the first node is the one
    if (head->value==searchValue)
    {
        nodePtr = head->next;
        delete head;
        head = nodePtr;
    }
    else
    {
        // Intialize nodePtr to head of list
        nodePtr = head;

        while (nodePtr != NULL && nodePtr->value != searchValue)
        {
            previousNode = nodePtr;
            nodePtr = nodePtr->next;
        }
        if (nodePtr)
        {
            previousNode->next = nodePtr->next;
            delete nodePtr;
        }
    }
}

CD中定义的重载运算符。这可能是问题吗?

bool CD::operator != (const CD &e)
{
    if (name != e.name)
        return true;
    return false;
}
bool CD::operator == (const CD &e)
{
    if (name == e.name)
        return true;
    return false;
}

1 个答案:

答案 0 :(得分:0)

我认为在&#34;其他&#34;你应该初始化为

    previousNode = head;
    nodePtr = head->next;

我还注意到以下内容:

void LinkedList1<T>::deleteNode( T searchValue)
{
    discList *nodePtr;          // To traverse the list
    discList *previousNode;

我觉得非常可疑,因为discList应该与T有某种关联。它应该像

    Node<T> *nodePtr