Одна вещь, которую я сразу заметил, состояла в том, что вы никогда не выделяете место для new_node.Поскольку автоматические переменные не гарантируются для инициализации, new_node будет установлен на любое значение, которое было в этой памяти раньше.Возможно, вам следует начать с чего-то вроде:
struct node *new_node = (new_node *) malloc(sizeof(struct node));
в C или, если вы используете C ++:
node* new_node = new node;
Копирование списка достаточно просто сделать.Тем не менее, требование, чтобы указатели ссылки указывали на те же узлы в новом списке относительно списка источников, будет трудно выполнить каким-либо эффективным способом.Во-первых, вам нужно каким-то образом определить, на какой узел относительно списка источников они указывают.Вы можете поместить какой-то идентификатор в каждый узел, например, int, для которого в первом узле установлено значение 0, во втором - 1 и т. Д. Затем, после того как вы скопировали список, вы можете сделать еще один проход по списку, чтобы настроитьссылки на ссылки.Проблема этого подхода (кроме добавления другой переменной к каждому узлу) заключается в том, что временная сложность алгоритма переместится с O (n) на O (n ^ 2).