Проблема в функции insertlast.Первая проблема - когда вставка выполняется, а список пуст (вы также забыли инициализировать заголовок в основном как NULL), потому что вы просто устанавливаете указатель «следующий» для нового элемента, не делая его новым заголовкомсписок.
Затем при прокрутке списка тем способом, который вы написали в цикле while, вы выполняете цикл до тех пор, пока не найдете точку вставки, а затем выходите, фактически ничего не делая.
Здесь это исправленорабочая версия функции:
struct cir* insertlast(struct cir** head0, struct cir* new1) {
struct cir* temp;
temp = (*head0);
if(temp == NULL) {
new1->next = new1;
*head0 = new1;
return(*head0);
}
else {
while(temp->next != (*head0)) {
temp = temp->next;
}
temp->next = new1;
new1->next = (*head0);
}
return(*head0);
}
Что касается значения
(temp->next)->prev=NULL;
в двунаправленном списке, он устанавливает узел, на который указывает "temp", значение NULL, поскольку из "temp"Вы переходите к следующему элементу, затем снова к предыдущему, который совпадает с началом (при условии, что «next» и «prev» установлены правильно).
Наконец, чтобы удалить элемент изоднонаправленный список, вы должны остановиться на элементе прямо перед тем, как захотеть удалить и переставить указатели:
while(temp->next->info != target){
temp=temp->next
}
struct circ* node_to_delete = temp->next;
temp->next = node_to_delete->next;
free(node_to_delete);
Я не думаю, что есть четко определенный diffмежду извлечением и удалением, но обычно я рассматриваю извлечение, когда просто получаю элемент, не удаляя его из списка.