2015-02-12 2 views
-2

Я создаю функцию, которая удаляет головной узел связанного списка и делает его главой другого связанного списка. Я прототипировал функцию moveNode в внешнем классе под названием LinkedList, и позже я определил функцию в своем коде. Однако мой компилятор дает мне сообщения об ошибках, в которых говорится: «class LinkedList :: Node является приватным» и «LinkedList :: Node» LinkedList: голова закрыта. Я не понимаю, что мне нужно сделать, чтобы исправить это.У меня есть прототип функции, но мой класс все еще говорит, что это не член?

#include <iostream> 
#include <cstdlib> 
using namespace std; 


class LinkedList 
{ 
public: 
    LinkedList() { head = NULL; } // default constructor 

    friend ostream& operator<<(ostream& os, const LinkedList &ll); 
    void insertHead(int item); // insert at the head of the list 
    int count(int searchFor, const LinkedList &ll); 
    void moveNode(LinkedList &other, LinkedList &currentList); 


private: 
    class Node // inner class for a linked list node 
    { 
     public: 
     Node(int item, Node *n); 
     int data; // the data item in a node 
    Node *next; // a pointer to the next node in the list 
}; 

Node *head; // the head of the list 
}; 

LinkedList::Node::Node(int item, Node *n) 
{ 
    data = item; 
    next = n; 
} 

ostream& operator<<(ostream& os, const LinkedList &ll) 
{ 
    LinkedList::Node *current; 
    for(current = ll.head; current != NULL; current = current->next) 
    { 
     os << current->data << " "; 
    } 
} 

int LinkedList::count(int searchFor, const LinkedList &ll) 
{ 
    LinkedList::Node *current; 
    current = ll.head; 
    int howmanytimes = 0; 
    while(current != NULL){ 
     if(current->data == searchFor) 
     { 
      howmanytimes++; 
     } 
    } 
    cout << searchFor << " appears in " << ll << " | " << howmanytimes << "time(s)" << endl; 
} 

void moveNode(LinkedList &other, LinkedList &currentList) 
{ 
    LinkedList::Node *current = other.head; 
    if(current!=NULL) 
    { 
     current->next = currentList.head; 
    } 

} 

void LinkedList::insertHead(int item) 
{ 
    head = new Node(item, head); 
} 
+0

'недействительным LinkedList :: moveNode (LinkedList & другие, LinkedList и CurrentList)' должны это исправить. –

ответ

1

Вы не квалифицируя имя класса в moveNode() реализации:

// note the LinkedList:: 
void LinkedList::moveNode(LinkedList &other, LinkedList &currentList) 
{ 
    LinkedList::Node *current = other.head; 
    if(current!=NULL) 
    { 
     current->next = currentList.head; 
    } 
} 

это, как говорится, эта реализация не совпадает с описанием:

функция, которая удаляет головной узел с линем рунец список и делает его голову другого связанного списка

реализация, которая на самом деле делает то, что говорит, будет выглядеть примерно так:

void LinkedList::moveNode(LinkedList &other, LinkedList &currentList) 
{ 
    LinkedList::Node *current = other.head; 
    if (current != NULL) 
    { 
     other.head = current->next; 
     current->next = currentList.head; 
     currentList.head = current; 
    } 
} 

При этом, этот метод должен быть переименован в чем-то например, moveHead(). И поскольку он не имеет доступа ни к чему с помощью указателя this, его можно даже объявить static. В противном случае, я хотел бы предложить повторно его реализацию, чтобы удалить параметр currentList, по крайней мере, например:

void LinkedList::moveHead(LinkedList &other) 
{ 
    LinkedList::Node *newhead = other.head; 
    if (newhead != NULL) 
    { 
     other.head = newhead->next; 
     newhead->next = this->head; 
     this->head = newhead; 
    } 
} 
+0

Пока ваш ответ в порядке, вопрос все еще дерьмо. –

+0

Возможно, но наша задача здесь - ответить на вопросы, поскольку их действительно спрашивают. Независимо от того, задают ли они правильные вещи или нет, это другое дело. –

+0

Ну, наша работа здесь также модерирует и выкидывает дерьмовые вопросы. Это то, что я на самом деле сделал, оставив полезный комментарий для OP. –

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