2012-04-13 2 views
-1

Скажем, у меня есть связанный класс узла списокФункция, которая возвращает указатель на переменную указателя?

class node { 
    private: 
     node *next_node; 
    public: 
     node *next() const; 
}; 

node *node::next() const { 
    return next_node; 
} 

ли следующий() возвращает узел ** next_node или узел * next_node. Также в чем смысл либо реализации функций класса списка (т. Е. Вставка, удаление, поиск)?

Причина, по которой я думаю, что она возвращает ** next_node, состоит в том, что next_node уже является указателем и возвращает его в функцию, поскольку указатель сделает его указателем на указатель. Я читал в других вопросах, таких как: Linked list head double pointer passing, что двойные указатели также работают в операциях с списками, поэтому я был немного смущен.

+5

Я полагаю, что вы делаете свою домашнюю работу самостоятельно –

+4

Можете ли вы объяснить, своими словами, почему вы думаете, что это может вернуть '' узел **? –

+0

Извините, я не был в школе пару месяцев. Я хотел освежить навыки программирования, и указатели - одна из моих слабых сторон. Я понимаю, может ли этот вопрос оторваться как вопрос о домашнем задании. – rcell

ответ

0

Выполняемая функция node::next() возвращает копию переменной-члена next_node. И next_node, и эта копия указывает на тот же экземпляр node, но они не зависят друг от друга.

Вот некоторые довольно плохо ASCII искусство, которое пытается продемонстрировать свои отношения

 
next_node ----> [node instance] 
       ^
the copy ------/ 
+0

Какая разница, если функция была реализована как node node :: следующая() const { return next_node; } Это просто возвращает значение next_node по значению и будет таким же: node * node :: next() const { return & next_node; } – rcell

+0

@rcell, который на самом деле не будет компилироваться. Вам нужно написать 'node node :: next() const {return * next_node; } '. Это вернет неглубокую копию значения «next_node». – JaredPar

+0

Я бы подумал, что 'return * next_node;' было бы таким же, как '* node :: next'. По моему пониманию, последний возвращает то, что называется глубокой копией? – rcell

0

Как говорится в декларации, то она возвращает указатель на следующий узел, типа node*.

Используется для продвижения по списку; например:

for (node * n = list.head(); n; n = n->next()) { 
    // Process node n 
} 
Смежные вопросы