Для начала используйте английские sh слова для именования идентификаторов. В противном случае другим программистам будет сложно читать ваш код.
Определение вашей функции, по крайней мере, из-за последнего оператора в этом фрагменте кода
char popIfK(struct V_LISTE **kopf)
{
char *returnVal;
struct V_LISTE *kElement;
kElement = (*kopf)->nachfolger;
//...
может вызывать неопределенное поведение при вызове функции для пустого списка. Он также вызывает неопределенное поведение, когда список не содержит узла со значением 'k'
. Или он даже не будет работать, если это первый узел, содержащий значение 'k'
.
Учтите, что вы должны решить, что возвращать из функции, если в списке нет узла со значением 'k'
.
Один из подходов - вернуть например символ '\0'
.
Если я правильно понял, вам нужно следующее
char popIfK( struct V_LISTE **kopf )
{
char returnVal = '\0';
while ( *kopf != NULL && ( *kopf )->vorname != 'k' )
{
kopf = &( *kopf )->nachfolger;
}
if ( *kopf != NULL )
{
returnVal = ( *kopf )->vorname;
struct V_LISTE *kElement = *kopf;
*kopf = ( *kopf )->nachfolger;
free( kElement );
}
return returnVal;
}
На мой взгляд, функция не имеет большого смысла. Вы можете написать более общую функцию, которая удаляет из списка узел с заданным символьным значением.
Такая функция может выглядеть следующим образом:
int remove( struct V_LISTE **kopf, char vorname )
{
while ( *kopf != NULL && ( *kopf )->vorname != vorname )
{
kopf = &( *kopf )->nachfolger;
}
int success = *kopf != NULL;
if ( success )
{
struct V_LISTE *kElement = *kopf;
*kopf = ( *kopf )->nachfolger;
free( kElement );
}
return success;
}