Вам не нужно указать B на C, или поддерживать указатель на предыдущий элемент. Один метод:
Шаг к узлу D
malloc()
новый узел
Скопируйте данные и next
члена от узла D к новому узлу
копировать данные для узла C в существующий узел D (который теперь становится узлом C)
Направьте элемент next
старого узла D на новый узел.
Например, исключая возможность введения во главе списка:
void insert(struct node * head, const int data, const size_t before)
{
assert(before > 0);
struct node * node = head;
while (before-- && node) {
node = node->next;
}
if (!node) {
fprintf(stderr, "index out of range\n");
exit(EXIT_FAILURE);
}
struct node * new_node = malloc(sizeof *new_node);
if (!new_node) {
perror("couldn't allocate memory for node");
exit(EXIT_FAILURE);
}
new_node->data = node->data;
new_node->next = node->next;
node->next = new_node;
node->data = data;
}
Это предполагает, что копирование содержимого узла (полезной нагрузки) является тривиальной и допустимой операцией. –
@DwayneTowell: Создает и новый узел. –
Это важно в средах, где вставленный узел поставляется «заранее». –