Здесь происходит беспорядочный клубок, который я постараюсь помочь и разгадать.
if (head->next==NULL){
head->next=new;
head->prev=NULL;
new->prev=head;
new->next=NULL;
}
new->next = head->next;
head->next = new;
new->next->prev = new;
new->prev = head;
head->prev = NULL;
В первый раз у вас есть head
и new
. head->next
равно NULL
, поэтому вы делаете бит в блоке if
и в итоге список выглядит следующим образом:
head <-> new
Затем вы указываете new->next
на head->next
... что означает, что вы указываете new->next
на new
.
head <-> new -> new
new->next->prev = new
, поэтому new->prev
теперь также равно new
head -> new <-> new
, но затем вы исправляете его, чтобы указать его вернитесь к head
и установите head->prev
на NULL
, что, вероятно, уже было, поскольку вы никогда не меняете его.
head <-> new -> new
И у вас все еще есть цикл l oop из new
, указывающий на себя в качестве следующего узла.
Полностью очистите этот код. pNode
- это предыдущий узел в вашем списке, и изначально он совпадает с head
- это переменная, с которой вы должны ссылаться.
new->prev = pNode;
pNode->next = new;
предыдущее и следующее значения, которые не указаны, уже должны установить NULL
(потому что вы используете calloc
) или указывать на допустимое место в памяти, чтобы вам не приходилось с ними связываться.
И тогда вы правильно сделаете следующее в конец l oop
pNode = new;
, чтобы указать конец списка на последний созданный узел.
Вам также следует избавиться от следующей строки, поскольку new
является fre sh новый узел - в pNode
не должно быть ничего для копирования и при этом, поэтому вы устанавливаете следующие и предыдущие значения, которые вам не нужны, поскольку они уже правильно установлены на NULL
.
*new =*pNode;