2015-10-12 5 views
0

Я работаю над назначением с использованием модифицированной версии класса списка.Связанные с C++ списки

class List 
{ 
private: 
    class Node 
    { 
    public: 
     std::string _entry; 
     Node * _link; 

     Node(std::string entry, Node * link) : _entry(entry), _link(link) 
     {} 
    }; 
}; 

Цель Я пытаюсь выполнить после ввода списка, мне нужно, чтобы иметь возможность удалить один элемент так, если я вхожу:

a 
b 
c 
d 
e 

Мне нужно, чтобы иметь возможность удалить с, и оставить остальных незатронутыми. Моя функция:

bool deleteOneOf(const std::string & target) 
     { 
      Node * & del = _first; 
      Node * temp = _first; 
      if (contains(target)) 
      { 
       del = find(temp, target); 
       del = del->_link; 
      } 
       delete temp; 
       return true; 

      } 
      else 
      { 
       return false; 
      } 

     } 

и функция находка:

Node * & find(Node * & ptr, const std::string & target) 
    { 
     if (ptr == nullptr || ptr->_entry == target) 
     { 
      return ptr; 
     } 
     else 
     { 
      return find(ptr->_link, target); 
     } 
    } 

Проблема у меня в том случае, если я вход C должен быть удален, это не правильно связать B с D, так C, D, E, удаляются, а не только C. Таким образом, выход AB, а не ABDE, как и должно быть.

+0

Почему вы называете 'find' ближе к началу' deleteOneOf', когда похоже, что вы только что нашли цель? –

+0

Я не вижу никакого кода, который каким-либо образом меняет «ссылку», а тем более правильный. –

ответ

0

Код в deleteOneOf() выглядит немного запутанным для меня. Мне непонятно, какой подход вы пытались реализовать, но это не должно быть так сложно.

Я предполагаю, что _first является указателем на список. В этом случае:

bool deleteOneOf(const std::string & target) 
{ 
    Node **del = &_first; 

    while (*del) 
    { 
     if ((*del)->_entry == target) 
     { 
      Node *ptr=*del; 

      (*del)=ptr->_link; 
      delete ptr; 
      return true; 
     } 

     del=&(*del)->_link; 
    } 
    return false; 
} 

Если мне не хватает части вашего требования, это должно быть все, что необходимо.

+0

Когда я запускаю это, и я ввожу, что ему нужно удалить C из ABCDE, когда я распечатываю новый список, он просто AB, а не ABD E. – drade13

+0

Я сделал небольшую опечатку, и вы, вероятно, догадались, что исправить должно быть. Исправлен код. Следующее значение указателя должно быть установлено как «del = & (* del) -> _ link;». –

Смежные вопросы