Я столкнулся с проблемой, когда пытаюсь отбросить новый элемент в список.Почему я не могу отбросить новый элемент в список
Эта проблема заключается в том, чтобы написать реализацию функции PushBack() в соответствии с ее вызовом в основном корпусе. Поэтому мой вопрос касается функции PushBack()
.
#include <iostream>
class Node{
public:
static Node* MakeNode() { return new Node(100); }
Node* prev;
Node* next;
int value;
private:
Node(int num) : value(num), prev(NULL), next(NULL) {}
};
void PushBack(Node* simple, Node* newNode){
if (simple == NULL){
//still a empty list
simple = newNode;
}
else{
//need to loop to the end of list because there is no "tail" in the class
Node* itr = simple;
while (itr->next != NULL){
itr = itr->next;
}
newNode->prev = itr;
itr->next = newNode;
}
return;
}
int main()
{
Node* simple = NULL;
PushBack(simple, Node::MakeNode());
std::cout << (simple == NULL);
PushBack(simple, Node::MakeNode());
PushBack(simple, Node::MakeNode());
PushBack(simple, Node::MakeNode());
while (simple != NULL){
std::cout << simple->value << std::endl;
simple = simple->next;
}
return 0;
}
У меня есть два вопроса о типе аргумента функции PushBack()
:
возвращаемый тип
MakeNode()
являетсяstatic Node*
, но почему мы должны установить второй тип аргумента вPushBack()
вNode*
? почему неstatic Node *
?В начале я пытался
void PushBack(Node* simple, Node* newNode)
, но когда до завершения программы и выхода изPushBack()
,simple
становитсяNULL
снова. Таким образом, новые элементы не могут быть добавлены в список. Я должен использоватьvoid PushBack(Node*& simple, Node* newNode)
.
Зачем нужен символ &
? Я думаю, что если я передам значение указателя в функцию, простой указатель можно изменить напрямую. Но, похоже, это не так.
В чем разница между моей проблемой и этим сегментом :?
void changeVal(int* data){
for (int i = 0; i < 9; i++)
*(data + i) = 99;
}
void main()
{
int *data;
data = new int[10];
changeVal(data);
for (int i = 0; i < 9; i++)
std::cout << data[i] << std::endl;
}
Я передал указатель data
в changeVal()
, а содержание может быть изменено внутри функции. Я не совсем понимаю разницу между ними.
Мне не удалось найти полезное объяснение в Интернете, поэтому я прошу здесь.
1. Вы можете полностью иметь параметры статической функции (в VC++) и 2. Это довольно запутанно. Функция может получить _copy_, но эта копия по-прежнему является точным адресом памяти объекта Node, который был передан, поэтому вы все равно можете изменять данные по адресу памяти, но не там, где указывает Node *. –
Где VC++ определяет параметры статической функции? 'static' не является допустимым модификатором параметра. –
Когда вы передаете переменную-указатель * по значению *, вы передаете ее значение, то есть адрес памяти объекта, на который указывает. Он НЕ передает адрес памяти самой указательной переменной. Вы получите это, когда вместо этого передаете указатель * по ссылке *. –