Манипуляции со связанными списками, проблемы с извлечением данных c ++

0

Я пытаюсь реализовать некоторые функции для управления связанным списком. Реализация представляет собой шаблонное имя типа T, а класс - "Список", который включает в себя указатель "head", а также структуру:

struct Node {             // the node in a linked list
    T* data;              // pointer to actual data, operations in T
    Node* next;           // pointer to a Node
};

Так как это шаблон, а "T" могут быть любыми данными, как я могу проверить данные списка, чтобы увидеть, соответствует ли он данным, вводимым в функцию?

Эта функция называется "retrieve" и принимает два параметра: данные и указатель:

bool retrieve(T target, T*& ptr); // This is the prototype we need to use for the project

"bool retrieve: похожее на удаление, но не удаленное из списка.Если в списке есть дубликаты, первый из них будет найден. Второй параметр является ненадежным, если возвращаемое значение false. Например,

Employee target("duck", "donald"); 
success = company1.retrieve(target, oneEmployee); 
if (success) { cout << "Found in list: " << *oneEmployee << endl; } 

И функция называется так:

company4.retrieve(emp3, oneEmployee)

Так что, когда вы cout * oneEmployee, вы получите данные этого указателя (в этом случае данные имеют тип Employee).

(Кроме того, предполагается, что все типы данных имеют соответствующие перегруженные операторы)

Надеюсь, это имеет смысл до сих пор, но моя проблема заключается в сравнении данных в параметре и данных при просмотре списка. (Типы данных, которые мы используем, включают в себя перегрузки для операторов равенства, поэтому допустим одноvalue == twoData)

Это то, что у меня есть до сих пор:

template <typename T>
bool List<T>::retrieve(T target , T*& ptr) {

List<T>::Node* dummyPtr = head;  // point dummy pointer to what the list head points to

for(;;) {
if (*dummyPtr->data == target) {  // EDIT: it now compiles, but it breaks here and I get an Access Violation Reading Access error.

    ptr = dummyPtr->data;  // set the parameter pointer to the dummy pointer
    return true;           // return true
} else {

    dummyPtr = dummyPtr->next;  // else, move to the next data node
}
}
return false;
}

Вот реализация для класса Employee:

    //--------------------------  constructor  -----------------------------------
    Employee::Employee(string last, string first, int id, int sal) {
   idNumber = (id >= 0 && id <= MAXID? id : -1);
   salary = (sal >= 0 ? sal : -1);
   lastName = last;
   firstName = first;
   }   

//--------------------------  destructor  ------------------------------------
// Needed so that memory for strings is properly deallocated
Employee::~Employee() { }

//---------------------- copy constructor  -----------------------------------
   Employee::Employee(const Employee& E) {
      lastName = E.lastName;
      firstName = E.firstName;
      idNumber = E.idNumber;
      salary = E.salary;
   }

//-------------------------- operator= ---------------------------------------
   Employee& Employee::operator=(const Employee& E) {
      if (&E != this) {
         idNumber = E.idNumber;
         salary = E.salary;
         lastName = E.lastName;
         firstName = E.firstName;
      }
      return *this;
   }

//-----------------------------  setData  ------------------------------------
// set data from file
bool Employee::setData(ifstream& inFile) {
   inFile >> lastName >> firstName >> idNumber >> salary;
   return idNumber  >= 0 && idNumber <= MAXID && salary >= 0; 
}

//-------------------------------  <  ----------------------------------------
// < defined by value of name
bool Employee::operator<(const Employee& E) const { 
   return lastName < E.lastName ||
          (lastName == E.lastName && firstName < E.firstName);
}


//-------------------------------  <= ----------------------------------------
// < defined by value of inamedNumber
bool Employee::operator<=(const Employee& E) const { 
   return *this < E || *this == E;
}

//-------------------------------  >  ----------------------------------------
// > defined by value of name
bool Employee::operator>(const Employee& E) const { 
   return lastName > E.lastName ||
          (lastName == E.lastName && firstName > E.firstName);
}

//-------------------------------  >= ----------------------------------------
// < defined by value of name
bool Employee::operator>=(const Employee& E) const { 
   return *this > E || *this == E;
}

//----------------- operator == (equality) ----------------
// if name of calling and passed object are equal,
//   return true, otherwise false
//
bool Employee::operator==(const Employee& E) const {
   return lastName == E.lastName && firstName == E.firstName;
}

//----------------- operator != (inequality) ----------------
// return opposite value of operator==
bool Employee::operator!=(const Employee& E) const {
   return !(*this == E);
}

//-------------------------------  <<  ---------------------------------------
// display Employee object

ostream& operator<<(ostream& output, const Employee& E) { 
   output << setw(4) << E.idNumber << setw(7) << E.salary << "  " 
          << E.lastName << " " << E.firstName << endl; 
   return output;
}

Я включу проверку на указатель NULL, но я просто хочу, чтобы эта работа работала и проверит ее в списке, который включает данные, которые я проверяю.

Благодаря тому, кто может помочь и как обычно, это для курса, поэтому я не ожидаю и не хочу ответа, но любые советы о том, что может пойти не так, помогут очень!

  • 3
    Если ваша проблема заключается в том, что вы получаете ошибку компиляции, когда == применяется к двум различным типам, «при условии, что все типы данных имеют соответствующие перегруженные операторы», это не очень полезный способ осмысления вопроса. Очевидно, что нет. Вам нужно показать больше кода, здесь. Возможно, вы имеете в виду, if (*dummyPtr->data == target) или что-то еще.
  • 0
    Вам нужно будет отладить его, чтобы решить новую проблему. В подавляющем большинстве случаев вероятно, что используемый вами указатель либо равен NULL , либо не инициализирован, либо указывает на память, которую вы ранее delete d. Такой инструмент, как Valgrind , очень поможет вам здесь.
Теги:
pointers
linked-list

1 ответ

2

В строке, которая не компилируется, вы сравниваете структуру Node (слева) с объектом типа T (с правой стороны). Вместо этого вы хотите сравнить два объекта типа T Поэтому вам нужно сделать это вместо этого (предполагая, что, как вы сказали, тип T задает метод operator==()):

if (*dummyPtr->data == target) {
  • 0
    Я не уверен, почему, но он говорит мне, что проблема связана с оператором, и ошибка, которую я получаю: Ошибка 1 Ошибка C2679: двоичный файл "==": не найден оператор, который принимает правый операнд типа ' Сотрудник »(или нет приемлемого преобразования) e: \ dropbox \ uwb файлы курса \ css 342 \ назначение 3 \ назначение 3 \ назначение 3 \ list.h 133 1 назначение 3
  • 0
    Можете ли вы опубликовать обновленный код после внесения изменений, предложенных в этом ответе и после его тестирования, вместе с новым сообщением об ошибке, если оно есть?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню