Для начала функцию sublist
следует объявить как
struct node * sublist( const struct node *A, const struct node *pos_list );
, поскольку ни список A
, ни список pos_list
не изменены в функции. В противном случае объявление функции сбивает читателей с кода.
Плохая идея, что список pos_list
содержит фиктивный узел, как написано в комментарии к этому утверждению
for (i = 0, curr = pos_list->next; (curr != NULL); curr = curr->next) { //pos_list->data has a dummy node so loop until the end of pos_list->data
Ни один фиктивный узел не должен быть в списке.
В этом внутреннем цикле
for(int i=0;i<=pos_list->data;i++){
не используется фиктивный узел списка. Кроме того, pos_list проходит через два цикла: внешний цикл и внутренний цикл
for (i = 0, curr = pos_list->next; (curr != NULL); curr = curr->next) { //pos_list->data has a dummy node so loop until the end of pos_list->data.
struct node* newList = (struct node *) malloc(sizeof (struct node));
for(int i=0;i<=pos_list->data;i++){
Внутри циклов значение переменной newList
изменяется
newList = newList->next;
Так чтоВ результате функция всегда возвращает неопределенное значение вместо заголовка вновь созданного списка. Значение является неопределенным, поскольку следующий элемент данных нового созданного узла не инициализирован.
newList->data = A->data; //Putting value of list A data in new list.
newList = newList->next;
Функция может быть определена следующим образом
struct node * sublist( const struct node *A, const struct node *pos_list )
{
struct node *newList = NULL;
struct node **current = &newList;
for ( ; pos_list != NULL; pos_list = pos_list->next )
{
const struct node *target = A;
for ( int index = pos_list->data; index != 0 && target != NULL; --index )
{
target = target->next;
}
if ( target != NULL )
{
*current = malloc( sizeof( struct node ) );
( *current )->data = target->data;
( *current )->next = NULL;
current = &( *current )->next;
}
}
return newList;
}