Вопрос по односвязным спискам
Код взял с лекции. Не могу понять почему функция creat_list типа Node и почему само название функции - указатель (*creat_list).
#include <iostream>
using namespace std;
struct Node {
int data;
Node *next;
};
Node* create_list(int n);
int main() {
setlocale(LC_ALL, "ru");
srand(time(NULL));
Node *head;
head = create_list(10);
return 0;
}
Node* create_list(int n) {
Node *head, *last, *p;
head = new Node;
head -> data = INT_MAX;
head -> next = NULL;
last = head;
for (int i = 0; i < n; i++) {
p = new Node;
p -> data = rand();
p -> next = NULL;
last -> next = p;
last = p;
}
}
Ответы (1 шт):
Вам нужно повторить указатели.
Node* это возвращаемый тип того узла который вы вернете написав, если код той функции которую вы написали полный, то его можно вообще изменить на void.
Функция может быть и Node&, и Node*, и просто Node. Через Node& вы напрямую обратитесь к объекту, который в return (что-то типа Node*); Через Node* вы через указатель получите тот объект, который в return.
И наконец, тип Node вернет вам копию того объекта и модифицировать объект при передаче его по значению не получится, потому что вызов такой функции внутри вашего класса вызовет дефолтный конструктор копирования или свой, если вы переопределили конструктор.
Копирование - это создание 2 одинаковых объектов, под разными адресами в памяти и модифицирование одной копии не повлияет на другой.
если код полный и там нету return'а внутри, то смело можете менять возвращаемый тип на void, потому что как раз таки внутри вашей функции создаются объекты типа Node* и через них они получают доступ к вашем переменным внутри класса Node. Вообще это ошибка делать Node* и тут подходит void, но есть шанс того, что этот код будут модифицировать в дальнейшем и тогда возвращаемый тип должен стать Node*.