Циклический связанный список с необъявленной ошибкой идентификатора

Я пытаюсь создать круговой связанный список, который проходит через интервалы и удаляет узел, в котором он находится. Но я продолжаю получать ошибку необъявленного идентификатора. Я не вижу, где я могу исправить эту ошибку.

#include <iostream>
using namespace std;
class Node {                                
public:
   int data;                              
   Node *next;                                
   Node() {data = 0;next = NULL;}                  
   Node(int x) {data = x;next = NULL;}                 
   };
class CircularLinkedList {              
public:
   int addAtFront(Node *n);                            
   int isEmpty();                                  
   int addAtEnd(Node *n);                     
   CircularLinkedList() {head = NULL;}     
   Node *head;                               
   Node* search(int k);                            
   Node* deleteNode(int x);                            
};

int search(int x) {                                    
Node *ptr = head;                                   
while(ptr != NULL &&  ptr->data  != x) {             
    ptr = ptr->next;                                
}
return ptr;
}

int addAtFront(Node *n) {                                   
int i = 0;                                                 
 if(head == NULL) {   //error: undeclared identifier 'head'                                  
   n->next = head;                                                         
   head = n;       //error: undeclared identifier 'head'                                       
   i++;                                                                    
  }
 else {                                              
   n->next = head;             //error: undeclared identifier 'head'                       
   Node* last = getLastNode(); //error: undeclared identifier 'getLastNode'             
   last->next = n;                                 
   head = n;         //error: undeclared identifier 'head'                  
   i++;
   }
 return i;                                               
}

int deleteNode(int x) {               
  Node *n = search(x);  //error: Cannot initialize a variable  of type 'Node *' with an rvalue of type 'int'                                 
  Node *ptr = head;     //error: undeclared identifier 'head'          
     if(ptr == NULL) {                                       
       cout << "List is empty";
       return NULL;                                        
     }
    else if(ptr == n) {                                
        ptr->next = n->next;                           
        return n;
     }
    else {
      while(ptr->next != n) {
        ptr = ptr->next;
                    }
     ptr->next = n->next;
return n;
  }
 }

int main(){};

person Jen    schedule 28.04.2017    source источник
comment
Какова фактическая ошибка, которую вы получаете?   -  person NathanOliver    schedule 28.04.2017
comment
Всегда добавляйте текст сообщения об ошибке к своему вопросу. Если это Visual Studio, скопируйте текст с вкладки «Вывод» вместо вкладки «Ошибки».   -  person drescherjm    schedule 28.04.2017
comment
Методы должны знать, к каким классам они принадлежат. В противном случае они просто старые добрые бесплатные функции.   -  person user4581301    schedule 28.04.2017
comment
@NathanOliver Извините за это. Я отредактировал его. Ошибки есть в комментариях.   -  person Jen    schedule 28.04.2017
comment
@drescherjm У меня нет Visual Studio. Я использую xcode, но спасибо, что указали на это. Я сделал несколько комментариев с указанием ошибок, которые я получал.   -  person Jen    schedule 28.04.2017


Ответы (2)


Вы неправильно определили определения функций-членов.

Они должны начинаться с имени класса, т.е.

int CircularLinkedList::addAtFront(Node *n)
{
    // ...
}

У вас могут быть и другие ошибки. Я заметил, что ваша функция search не соответствует определению в классе (другой тип возврата). И я не удивлюсь, если у вас есть и другие проблемы.

Лучший совет, который я могу дать прямо сейчас, — это прочитайте сообщение об ошибке — оно пытается вам что-то сказать.

person paddy    schedule 28.04.2017

Пара вопросов:

а) Заголовок параметра является необъявленным идентификатором внутри методов search, addAtFront, deleteNode.

Чтобы исправить это, вы можете определить функции, объявленные в вашем классе, как CircularLinkedList::search, а не просто search, и ссылаться на элемент head как this->head.

б) Вам нужно определить getLastNode(), он отсутствует

person SomeDude    schedule 28.04.2017