Для начала обе функции должны быть объявлены с параметром, значение которого используется для инициализации члена данных data
созданного узла.
Например, функции могут быть определены следующим образом
sll * createNode( int data )
{
sll *node = malloc( sizeof( sll ) );
if ( node != NULL )
{
node->next = NULL;
node->data = data;
}
return node;
}
и
sll createNode( int data )
{
sll node = { data, NULL };
return node;
}
Оба фрагмента кода верны. Будет ли ваша программа неправильной, зависит от того, правильно ли вы будете использовать функции.
Например, вторая функция может использоваться в следующем контексте (добавление нового узла в конец списка):
int append( sll **head, int data )
{
while ( *head != NULL )
{
head = &( *head )->next;
}
*head = malloc( sizeof( sll ) );
if ( *head ) **head = createNode( data );
return *head != NULL;
}
Единственный недостаток второго фрагмента кода состоит в том, что в большинстве случаев лучше объединить в одной функции выделение узла и его инициализацию в одной функции вместо разделения этих двух операций, как это делается во втором коде. snippet.
Однако иногда имеет смысл поместить саму инициализацию в отдельную функцию, потому что инициализация может быть достаточно сложной. Это сделает код в целом более читабельным.
Кстати в C ++ это делается именно так за счет использования конструкторов. То есть за инициализацию отвечает конструктор (отдельная функция).
Таким образом, вы можете рассматривать эту функцию
sll createNode( int data )
{
sll node = { data, NULL };
return node;
}
как конструктор объекта типа sll
.
Итак, цели функций из представленных двух фрагменты кода разные. Первый динамически выделяет узел. А второй используется для инициализации уже существующего узла.