2015-12-07 3 views
0

У меня есть назначение, которое связано с различными операциями связанного списка. Один из них связан с перегрузкой оператора квадратной скобки, чтобы иметь возможность печатать i-й элемент связанного списка. У меня есть все остальное, но я действительно потерял это. Это то, с чем я работаю. Класс списка выглядит следующим образом:Перегрузка C++ [] для печати n-го элемента связанного списка

class List { 
public: 
// Creates a default empty list 
List(); 

// Simple destructor 
~List(); 

// Insert "data" at the very end of the list 
void AddToFront(int data); 

// Remove and return the first data item from the list. 
int deleteFront(); 

// Prints the list 
void Print() ; 

// Returns the size of the list 
unsigned int Size() const; 


//overloaded assignment operator 
Node operator[](unsigned int i) ; 



private: 

Node *m_head; 

}; 

Кроме того, вот мой класс узел:

class Node { 
public: 
    Node(); 
    ~Node(); 
    Node(int data); 

    int m_data; 
    Node *m_next; 
}; 

Любая помощь на перегрузку [] оператора было бы весьма признателен.

+0

Как вы могли бы написать нормальную функцию для возврата i-го узла? – immibis

ответ

2
Node* operator [] (int value) { 
    Node *temp = this->m_head; 
    for(int i = 0; i < value && temp!=NULL; i++) { 
     temp = temp->m_next; 
    } 
    return temp; 
} 

Я предполагаю, что вы хотите, чтобы вернуть узел, соответствующий value указанным в квадратных скобках. Вы перегружаете любого оператора, используя ключевое слово operator, за которым следует оператор, а затем переданные параметры.

Для получения дополнительной информации проверить это :: Operator overloading

EDIT ::

Как указано на erip и Лайош там должен быть способ, в случае (value > size_of_list), в этом случае, возможное решение будет бросить исключение, которое позже вы можете поймать в своей программе, чтобы показать, что value не работает. Или, учитывая текущую реализацию, если value > size_of_list в этом случае temp станет NULL, поэтому во время выполнения вы можете проверить, вернётся ли значение Node *, NULL или нет.

Еще более оптимизированный способ будет держать переменную size_of_list в классе List, и тогда мы можем просто добавить if состояние функции, как это ::

if(value >= size_of_list) // equal to sign is put, considering your `size_of_list` starts from 1 
    return NULL; 

Это будет более оптимизированной в случае больших списков, что позволило бы избежать расточительного выполнения цикла for!

+0

Было бы разумнее вернуть 'm_data' для i-го' Node', но это не сильно изменится. Хороший ответ. – erip

+0

Возможно, вы должны сделать что-то еще, кроме 'temp! = NULL'. Например, 'if (size_of_list <значение)/* throw exception * /' – erip

+0

@erip True, но я не думаю, что OP хочет сохранить дополнительную переменную в классе 'list', более того, я намеревался проверить, что я return, если я верну 'NULL' из функции, которая будет означать' size_of_list user007

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