Для начала это утверждение в начале main
head = malloc(sizeof(node));
не имеет смысла. Вы создали неинициализированный узел. В результате программа уже вызывает неопределенное поведение, если вы попытаетесь выполнить какую-либо операцию со списком, кроме освобождения выделенной памяти.
Удалите этот оператор.
Вы забыли выделить память для узла в функции insertBack
.
node* insertBack(node* head, int d)
{
node *ptr;
ptr->data=d;
ptr->next = NULL;
//...
Также тело оператора if
if(head==NULL)
{
head->data=d;
head->next=NULL;
}
не имеет смысла.
Если оставить объявление функции как Тогда его определение может выглядеть следующим образом:
node * insertBack( node *head, int d )
{
node *ptr = malloc( sizeof( node ) );
ptr->data = d;
ptr->next = NULL;
if ( head == NULL )
{
head = ptr;
}
else
{
node *temp = head;
while ( temp->next != NULL )
{
temp = temp->next;
}
temp->next = ptr;
}
return head;
}
Также эти функции
int max (node* head)
{
int max;
while (head != NULL)
{
if (max > head->data)
max = head->data;
}
return max;
}
int min (node* head)
{
int min;
while (head != NULL)
{
if (min < head->data)
min = head->data;
}
return min;
}
недопустимы, поскольку по крайней мере переменные max и min не были инициализированы. Более того, они имеют бесконечное значение l oop, и, например, функция max не находит максимальное значение в списке .:)
Было бы лучше объявить их, например, так:
int max ( node* head, int *value );
В этом случае определение функции max может выглядеть как
int max( node* head, int *value )
{
int success = head != NULL );
if ( success )
{
*value = head->data;
while ( ( head = head->next ) != NULL )
{
if ( *value < head->data ) *value = head->data;
}
}
return success;
}
, а функция может вызываться как
int max_value;
if ( max( head, &max_value ) )
{
printf( "The maximum value is %d\n", max_value );
}
Функция min может быть объявлена и определена так же way.
Если оставить объявления функций как есть, то вы должны хотя бы инициализировать переменные равными 0. Например,
int max (node* head)
{
int max = head == NULL ? 0 : head->data;
for ( ; head != NULL; head = head->next )
{
if ( max < head->data ) max = head->data;
}
return max;
}
Аналогичным образом можно определить функцию min. Хотя, как я уже говорил, лучше, когда функции определены так, как я показал выше.
И не забудьте написать функцию, которая освободит всю выделенную память.