2015-05-03 2 views
0

У меня есть следующая структура для связанного списка.Удаление предыдущей записи дубликата в связанном списке

typedef struct value value; 

struct value{ 
    value* prev; 
    value* next; 
    int value; 
}; 

... 
//ent = entry 
if(entry_head == NULL) { 
entry_head = ent; 
entry_tail = ent; 
entry_tail->prev = NULL; 
} 
else { // add to top 
    ent -> next = entry_head; 
    ent -> prev = NULL; 
    entry_head -> prev = ent; 
    entry_head = ent; 
} 

Это дает мне результаты:

Input: a  Result: b 
     b    a 

Однако, когда я входной два одних и тех же переменных, я хочу, чтобы удалить предыдущую переменную и имеют только недавно входную переменную. то есть.

Input: a // old Result: a // new Actual Result: a // new 
     a // new          a // old 

Как изменить это, чтобы удалить прежнюю переменную?

+1

Вам действительно нужно удалить первый? Альтернативный подход заключается в том, чтобы не добавлять второй. Но это зависит от ваших требований. – kaylum

ответ

0

Вам необходимо изменить код узла добавления в той части функции, которая касается всех узлов, добавленных в список не NULL.

value *tmp =head ; 
while(tmp!=NULL) { 
    if(tmp->Value== newval) break; 
    tmp=tmp->next; 
} 
If(tmp!=NULL) return 0; 
// add node here 

return 1 

В качестве альтернативы после добавления узла создайте аналогичный цикл while.

Для каждого узла в списке все узлы после этого должны быть сравнимы и удалены. Это будет эффективно.

Чтобы удалить узел все, что вам сделать, это какой-то указатель twizzling, а затем освободить узел, если больше не требуется, чтобы избежать утечек памяти

// a->B->c 
// <- <- 

value *save=a->next; 

a->Next=save->next; 

// node c 

Save->Next->prev=save->prev; 


free(save); 

Этот код не был проверен, я не линукс на моем телефоне ,

Смежные вопросы