2013-10-15 1 views
1

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

Я хотел бы написать функцию в классе List, которая позволяет мне увеличиваться до следующего элемента getNext(), а также для getPrev();

Я написал GetNext так:

T* getNext(){return next;} 

Однако он говорит мне следующий не объявлена ​​в области. Я также хотел бы написать функцию, которая позволяет мне получить доступ и изменить объект в списке. Я рассматривал возможность использования оператора скобки, но сначала мне нужно написать функцию, чтобы вернуть элемент данных. Возможно, если я возьму такой же подход, как и в моих поп-функциях, подумайте об этом сейчас. Тем не менее, я все равно буду признателен за любые советы.

Вот мой класс List:

#ifndef LIST_H 
#define LIST_H 


//List Class 
template <class T> 
class List{ 
    struct Node { 
     T data; 
     Node *next; 
     Node *prev; 
     //Constructs Node Element 
     Node(T t, Node* p, Node* n) { data = (t); prev = (p); next = (n); } 
//  T *getNext() {return next;} 
    }; 
     Node *head; 
     Node *tail; 
public: 
    //Constructor 
    List() { head = NULL; tail=NULL; } 
    //Destructor 
    ~List() { 
     while(head){ 
      Node * temp(head); 
      head = head->next; 
      delete temp; 
     } 
    } 
    //is empty 
    bool empty() const {return (!head || !tail); } 
    operator bool() const {return !empty(); } 
    //Push back 
    void push_back(T data) { 
     tail = new Node(data, tail, NULL); 
     if(tail->prev) //if the node in front of tail is initilized 
      tail->prev->next = tail; 

     if(empty()) 
      head = tail; 
    } 
    //Push front 
    void push_front(T data) { 
     head = new Node(data, NULL, head); 
     if(head->next)//if the node following head is initilized 
      head->next->prev = head; 

     if(empty()) 
     tail = head; 
    }; 
    T pop_back() { 
     if(empty()) 
      throw("Error in List: List is empty\n"); 

     Node* temp(tail); 
     T data(tail->data); 
     tail = tail->prev; 

     if(tail) 
      tail->next = NULL; 
     else 
      head = NULL; 

     delete temp; 
     return data; 
    } 
    T pop_front() { 
     if (empty()) 
      throw("Error in List: List is empty\n"); 

     Node* temp(head); 
     T data(head->data); 
     head = head->next; 

     if(head) 
      head->prev=NULL; 
     else 
      tail = NULL; 

     delete temp; 
     return data; 
    } 

    T getNext(){return next;} 
}; 


#endif 

ответ

0

для начала getNext() не должна возвращать указатель на шаблон класса, он должен вернуть указатель на Node структуру.

Так оно и должно быть

Node* getNext(){return next;} 
1

getNext должны быть частью struct Node и возвращают Node*

Node* getNext() { return next; } 

Тогда из этого можно получить значение.

Если вы должны иметь это часть самого list, который я бы не рекомендовал его нужно будет принимать параметр, что Node вы хотели бы next из:

Node* getNext(Node* n) {return n->next;} 

Опять же, я рекомендую первый вариант.

Вот примерный весь класс с обоими из них:

template<typename T> 
class List { 
    public: 
    struct Node { 
     Node* next, prev; 
     T data; 

     //some constructor and stuff 

     Node* Next() {return next;} 
    } 

    //some constructors and other functions 

    Node* getNext(Node* _n) {return _n->Next();} 
} 

затем использовать:

int main() { 
    List<int> l; 
    //add some stuff to the list 
    //get the head of the list 
    List<int>::Node* head = l.head; //or some corresponding function 

    //then 
    List<int>::Node* next = head->Next(); 
    //or 
    List<int>::Node* next2 = l.getNext(head); 
} 
+0

Первый аргумент логически логичен, и для его вызова из списка я попытался сделать что-то вроде этого: 'Node * getNext() {return Next(); } // внутри списка' И когда я пытаюсь сделать второй способ, он выводит, что «класс List не имеет члена с именем getNext()» – TaylorTheDeveloper

+0

, это, вероятно, потому, что вы говорите 'Next()' и у которого нет объекта, связанного с ним , Если вы заметили, что в моем втором подходе функция нуждается в аргументе. – pippin1289

+0

Я попытался использовать второй метод, однако эта ошибка произошла, когда я устал компилировать: 'нет подходящей функции для вызова в âList :: getNext() â ' – TaylorTheDeveloper

0

Потому что член Node структуры и getNext является членом List. Вы должны получить к нему доступ от объекта типа Node.

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