如何删除节点

时间:2014-03-06 17:20:15

标签: c++ linked-list nodes

我需要将一张包含所有歌曲的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);
}

如果我使用artistnamelength)作为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;
}

3 个答案:

答案 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;
}