Код удаляет неправильный элемент из связанного списка:
См .:
if ( ( last->x ) == key )
{
printf( "value to be deleted is found" );
node *temp = last->next; // last->next? No, just last.
last->next = last->next->next;
free( temp );
length--;
}
last
указывает на удаляемый элемент.Но затем код назначает temp
для указания на last->next
(НЕ last
), а затем вырезает это из списка.
Итак, глядя на node->next
, а не на текущий узел, можнообрезать его, так как вы начинаете с указателя, прежде чем удалить.В основном ваш код уже был почти там.
void deletenode( u8 key )
{
node *ptr = head;
if ( ( ptr->x == key ) )
{
// Delete the first/head element
node *temp = ptr;
head = head->next;
free( temp );
length--;
}
else
{
while ( ptr->next != NULL )
{
if ( ( ptr->next->x ) == key )
{
printf( "value to be deleted is found" );
node *temp = ptr->next;
ptr->next = ptr->next->next;
free( temp );
length--;
}
ptr = ptr->next;
}
}
}
Кроме того, я позволил себе переименовать last
в ptr
, потому что это меня смущало.
РЕДАКТИРОВАТЬ: Обновлено, чтобы удалить головучисто тоже.