Как отметил Марк, ваше free(p)
имеет неопределенное поведение.Следовательно, следующий оператор
p->next = replace(i, j, p->next);
становится недопустимым, поскольку вы пытаетесь присвоить p->next
значению указателя, но p->next
сама область памяти не определена.
Но почему вы сделали эту функцию рекурсивной?Будет достаточно простого цикла while.
IntNodePtr replace(int i, int j, IntNodePtr p) {
if(p == NULL)
return NULL;
IntNodePtr prevPtr = NULL;
while(p){
if(p->myInt == i){
IntNodePtr temp = insert(j, p->next);
if(prevPtr)
prevPtr->next = temp;
free(p);
break;
}
prevPtr = p;
p = p->next;
}
}
И вы также неправильно используете свою функцию вставки, поскольку вы не подключаете предыдущий узел к вновь созданному узлу.