Здесь довольно много проблем.
Вы выделяете новые узлы, когда вас почти наверняка не должно быть, в insertHead, insertTail, findNode и deleteNode.Ни одна из этих функций не должна выделять что-либо (кроме случаев, когда вы действительно хотите скопировать узлы вызывающей стороны, что, я сомневаюсь, в этом случае вы должны размещать в insertHead и insertTail, но не в двух других, и вы должны использовать свою собственную функцию createNode для этого).Обычно я ожидал бы, например, что функция insertHead просто возьмет переданный узел и вставит его в начало списка;обычно он не выделяет новый узел и не копирует содержимое переданного узла.
Функция insertTail требует некоторой работы.Он пропускает узел каждый раз, и, я думаю, он падает, если вы добавляете в пустой список (случай, когда новый хвост - это также новая голова).Попробуйте что-то вроде:
void insertTail(struct node **head, struct node *n)
{
struct node **tmp = head;
while (*tmp != NULL)
{
tmp = &((*tmp)->next);
}
*tmp = n;
n->next = NULL;
}
В countNodes у вас есть if (headRef = NULL), но это должно быть ==, а не =.
Тестирование ошибок отказов не проводится (хотя это маловероятнобыть причиной вашего segfault).
Лично я бы использовал calloc, а не malloc, чтобы ваши новые узлы имели нулевое содержимое.
Ваша функция deleteNode будет seqfault, если ее вызов findNode вернетNULL.
Я бы рекомендовал добавить некоторые утверждения, например:
void insertHead(struct node **head, struct node *n)
{
assert(head != NULL);
assert(n != NULL);
assert(n->next == NULL);
n->next = *head;
*head = n;
}
Я бы порекомендовал добавить некоторые средства отладки, например:
void printNodes(struct node *head)
{
int count = 0;
while (head != NULL)
{
printf("Item[%d] at %p = %d\n", ++count, head, head->item);
head = head->next;
}
}