Вопрос по односвязным спискам

Рейтинг: -1Ответов: 1Опубликовано: 02.04.2023

Код взял с лекции. Не могу понять почему функция 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*.