У меня есть связанный список и два заданных слова. Мне нужно найти индекс первого слова в списке, а затем добавить второе слово сразу после первого слова
Если да, то имя функции insertAtEnd
очень сбивает с толку.
Для начала компилятор выдаст ошибку для этого оператора в функции
personNode* current = head; // Initialize current
, потому что объявленный указатель имеет тип personNode *
, а инициализатор имеет тип personNode **
и неявное преобразование отсутствует. от одного типа указателя к другому ..
void insertAtEnd(personNode** head, personNode* newNode, char friend[])
{
personNode* current = head; // Initialize current
//...
Также функция будет иметь неопределенное поведение, если она вызывается для пустого списка.
Функция может выглядеть следующим образом
int insertAtEnd( personNode **head, personNode *newNode, const char *friend )
{
while ( *head && strcmp( ( *head )->name, friend ) != 0 )
{
head = &( *head )->next;
}
int success = *head != NULL;
if ( success )
{
newNode->next = ( *head )->next;
( *head )->next = newNode;
}
return success;
}
Было бы лучше, если бы новый узел был создан внутри функции, а не передавал его в качестве аргумента, потому что, если узел с данной строкой не найден, вы должны освободить его.
Итак, вызов функции может выглядеть, например, как
if ( !insertAtEnd( &head, some_new_node, "friend" ) ) free( some_new_node );
Если узел с данной строкой не найден, возможно, вам следует добавить его в конец списка. В этом случае функция может выглядеть как
void insertAtEnd( personNode **head, personNode *newNode, const char *friend )
{
while ( *head && strcmp( ( *head )->name, friend ) != 0 )
{
head = &( *head )->next;
}
if ( *head == NULL )
{
*head = newNode;
}
else
{
newNode->next = ( *head )->next;
( *head )->next = newNode;
}
}