我需要将一张包含所有歌曲的CD添加到一个集合中。我正在试图弄清楚如何从CD集合中删除CD。例如,当我附加艺术家姓名,CD的名称,标题和每首歌曲的长度并调用显示功能时,它会显示所有信息。当我用艺术家,CD的名称和CD的长度作为参数调用deleteNode
函数时,显示功能仍然显示我追加的内容。程序构建正常,但我认为我没有正确调用deleteNode
函数。此外,链表具有类的数据类型。
结构
class CD
{
private:
string artist; // To hold artist nam
string name; // To hold name of CD
struct disc
{
string title; // To hold title of the song
double length; // To hold length of the song
}my_disc;
}
从主
调用deleteNode
函数
void remove_cd(LinkedList1<CD> *remove)
{
cout << "Enter the name of the artist of the CD you wish to remove: ";
cin.ignore();
getline(cin, artist);
cout << "Enter the title: ";
cin >> title;
cout << "Enter the length: ";
cin >> length;
CD removeNode(artist, title, length);
remove->deleteNode(removeNode);
}
如果我使用artist
,name
和length
)作为deleteNode
的参数,如何删除所有已插入的歌曲?我想删除CD
链表中的deleteNode
功能
template <class T>
void LinkedList1<T>::deleteNode( T searchValue)
{
discList **pp = &head;
while (*pp && (*pp)->value != searchValue)
pp = &(*pp)->next;
if (*pp)
{
discList *victim = *pp;
*pp = victim->next;
delete victim;
}
}
CD中的重载运算符
bool CD::operator == (const CD &e)
{
if (artist == e.artist)
return true;
return false;
}
bool CD::operator != (const CD &e)
{
if (artist != e.artist)
return true;
return false;
}
答案 0 :(得分:1)
我正在尝试使用最少的代码。
我很高兴您添加了评论。您可以像这样使用std::list
:
class CD {
private:
std::string artist; // To hold artist nam
std::string name; // To hold name of CD
struct disc {
std::string title; // To hold title of the song
double length; // To hold length of the song
} my_disc;
};
std::list<CD> list;
添加一个节点:
list.emplace_back(/* args for CD constructor */);
并删除一个节点:
list.pop_back();
这是最小的,也可以没有错误。当然,如果你感觉到双链表实现的重量,你可以随时回到std::forward_list
。
答案 1 :(得分:1)
如果没有进入不明智的递归之地,我想不出更短的东西,即便如此,这也是一段时间。
这将做你想要的。
template<typename T>
void LinkedList1<T>::deleteNode(const T& searchValue)
{
discList **pp = &head;
while (*pp && (*pp)->value != searchValue)
pp = &(*pp)->next;
if (*pp)
{
discList *victim = *pp;
*pp = victim->next;
delete victim;
}
}
在你问之前,是的,它适用于空列表和空头指针。该算法使用实际列表中的实际指针,而不仅仅是它们的值指针来遍历和销毁。它假设您的列表也以NULL结尾。
最后,你的算法(和这个算法)依赖于为CD
定义的逻辑等于运算符,其中我没有看到。如果你还没有实现,你需要这样做。
答案 2 :(得分:0)
它的c ++,但可能很有用。
template<class CAdat>
bool List<CAdat>::Delete(const string &name) {
Node *tmp = head->next;
while (tmp != head && tmp->data.getName() != name) {
tmp = tmp->next;
}
if (tmp != head) {
tmp->prev->next = tmp->next;
tmp->next->prev = tmp->prev;
delete tmp;
return true;
}
return false;
}