Это объявление функции
void merged_lists (cell * l1, cell * l2, cell * l3);
недопустимо, поскольку указатели передаются по значениям. То есть функция имеет дело с копиями оригинальных указателей на заголовочные узлы списков. В результате исходные указатели не будут изменены.
Вот демонстрационная программа, которая показывает, как функция может быть объявлена и определена.
#include <stdio.h>
#include <stdlib.h>
typedef struct cell
{
int data;
struct cell *next;
} cell;
size_t append( cell **head, const int a[], size_t n )
{
size_t i = 0;
if ( n )
{
while ( *head != NULL ) head = &( *head )->next;
for ( ; ( i < n ) && ( ( *head = malloc( sizeof( cell ) ) ) != NULL ); i++ )
{
( *head )->data = a[i];
( *head )->next = NULL;
head = &( *head )->next;
}
}
return i;
}
void display( const cell *head )
{
for ( ; head != NULL; head = head->next )
{
printf( "%d -> ", head->data );
}
puts( "NULL" );
}
cell * merged_list( cell **list1, cell **list2 )
{
cell *list3 = NULL;
cell **current = &list3;
while ( *list1 != NULL && *list2 != NULL )
{
if ( ( *list2 )->data < ( *list1 )->data )
{
*current = *list2;
*list2 = ( *list2 )->next;
}
else
{
*current = *list1;
*list1 = ( *list1 )->next;
}
current = &( *current )->next;
}
for ( ; *list1 != NULL; current = &( *current )->next )
{
*current = *list1;
*list1 = ( *list1 )->next;
}
for ( ; *list2 != NULL; current = &( *current )->next )
{
*current = *list2;
*list2 = ( *list2 )->next;
}
return list3;
}
int main(void)
{
cell *list1 = NULL;
cell *list2 = NULL;
int a1[] = { 1, 7, 9, 10 };
int a2[] = { 2, 3, 8 };
append( &list1, a1, sizeof( a1 ) / sizeof( *a1 ) );
append( &list2, a2, sizeof( a2 ) / sizeof( *a2 ) );
display( list1 );
display( list2 );
putchar( '\n' );
cell *list3 = merged_list( &list1, &list2 );
display( list1 );
display( list2 );
display( list3 );
return 0;
}
Выходные данные программы
1 -> 7 -> 9 -> 10 -> NULL
2 -> 3 -> 8 -> NULL
NULL
NULL
1 -> 2 -> 3 -> 7 -> 8 -> 9 -> 10 -> NULL
Функция merged_list
может быть написана короче
cell * merged_list( cell **list1, cell **list2 )
{
cell *list3 = NULL;
cell **current = &list3;
while ( *list1 != NULL || *list2 != NULL )
{
if ( *list1 == NULL || ( *list2 != NULL && ( *list2 )->data < ( *list1 )->data ) )
{
*current = *list2;
*list2 = ( *list2 )->next;
}
else
{
*current = *list1;
*list1 = ( *list1 )->next;
}
current = &( *current )->next;
}
return list3;
}