Как сделать функцию на C++ для удаления узла из связанного списка (узел может быть любой, кроме первого узла), который соответствует искомому ключу

У меня есть эта функция с именем DeleteData, которую я использую для удаления любого узла из моего связанного списка.

void DeleteData(Node *node, int key)
{
   Node temp;
   //If key is in the first node itself
   if (node != NULL && node->read_data() == key)
   {
      temp = *node->next;
      node->next = NULL;
      delete node;
      cout << "New List";
      // It's just a function that reads all data from the linked list given the head reference.
      ListTraverse(&temp);
      return;
   }
   //If key is not in first node
else if (node->read_data() != key)
{
    while (node != NULL && node->read_data() != key)
    {
        // Function to loop thorugh all the nodes
    }
    if (node->read_data() == key)
    {
        //Steps to do, If node is found
    }
}
else
{
    cout<<"Invalid Search key";
}

}

Этот DeleteData принимает два аргумента, 1. ссылка на 1-й узел, 2. Ключ. Мне нужно удалить узел, значением которого является соответствующий ключ. Я успешно сделал 1-ю часть, т. Е. Когда ключ находится только в 1-м узле, но я не могу спроектировать его так, чтобы, если ключ не найден в 1-м узле, он должен был искать оставшиеся узлы.

Node — это класс C++, имеющий это определение

class Node
{
private:
  int data;

public:
  Node *next;
  void push_data(int x)
  {
      data = x;
  }
  int read_data()
  {
     return data;
  }
};

person Soumalya Bhattacharya    schedule 13.01.2021    source источник
comment
Ознакомьтесь с дополнением сообщества к этому ответу. Если это не решает вашу проблему напрямую, задайте вопросы об этом.   -  person user4581301    schedule 13.01.2021
comment
Нет, я думаю, что это не решило мою проблему   -  person Soumalya Bhattacharya    schedule 13.01.2021
comment
Это странно. Он делает именно то, что вы просите.   -  person user4581301    schedule 13.01.2021
comment
Поделитесь своим полным кодом, используя ideone.com   -  person Jahirul Islam Monir    schedule 13.01.2021
comment
Я вижу одну возможную проблему: void DeleteData(Node *node, int key) делает невозможным удаление первого узла. Вам нужно что-то вроде void DeleteData(Node *&node, int key), чтобы вы могли обновить вызывающую программу новым первым узлом.   -  person user4581301    schedule 13.01.2021
comment
@JahirulIslamMonir Весь код не рекомендуется. Вместо этого попросите минимально воспроизводимый пример. Кроме того, в вопросе должна содержаться вся информация, необходимая для понимания вопроса. Ссылки гниют, блокируются брандмауэрами и, как правило, доставляют неудобства. Если для правильного ответа на вопрос требуется больше кода, а вы, вероятно, правы в этом случае, люди в будущем не смогут понять ответы, если код больше не доступен.   -  person user4581301    schedule 13.01.2021
comment
tl;dr: включите в вопрос минимально воспроизводимый пример вашего кода;)   -  person 463035818_is_not_a_number    schedule 13.01.2021


Ответы (2)


Для начала параметр, указывающий головной узел, должен иметь ссылочный тип.

Функция может быть объявлена ​​и определена следующим образом

bool DeleteData( Node * &head, int key )
{
    Node **current = &head;

    while ( *current && ( *current )->read_data() != key )
    {
        current = &( *current )->next; 
    }

    bool success = *current != nullptr;

    if ( success )
    {
        Node *tmp = *current;
        *current = ( *current )->next;
        delete tmp;
    }

    return success;
}
person Vlad from Moscow    schedule 13.01.2021

Во-первых, примените принцип единой ответственности:

Отделите поиск удаляемого узла от его удаления.

Отделите выполнение работы от решения, что делать с результатом.

Таким образом, любой ошибке будет гораздо труднее спрятаться в путанице, и ее будет легко исправить.

Node*& findNode(Node*& root, int key) {
    auto p = &root;
    while (*p && (*p)->data != key)
        p = &(*p)->next;
    return *p;
}
void deleteNode(Node*& node) {
    if (node)
        delete std::exchange(node, node->next);
}
bool deleteNode(Node*& root, int key) {
    auto& node = findNode(root, key);
    if (!node) return false;
    deleteNode(node);
    return true;
}
person Deduplicator    schedule 13.01.2021