我有一个cd列表,我将它们附加到一个链表中。我可以成功地追加cd并显示它们。但是,当我试图通过仅使用CD名称作为参数来删除CD时,我得到一个运行时检查错误#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;
}
我认为在else中应该初始化为
previousNode = head;
nodePtr = head->next;
我还注意到以下内容:
void LinkedList1<T>::deleteNode( T searchValue)
{
discList *nodePtr; // To traverse the list
discList *previousNode;
这看起来很可疑,因为discList
应该与T
有某种联系。应该是像
Node<T> *nodePtr