2013-12-19 4 views
0

Моя функция remove_duplicates должна избавиться от повторяющихся значений данных в связанном списке. Однако, когда он достигает точки в связанном списке, например, если связанный список равен L = {10,10,20,30,30,30,40,50}, то вывод L = {10,20,30,(some random int value like 23687328),50}, когда он должен быть L = {10,20,30,40,50}. Кроме того, я проверяю утечку, и Валгринд говорит мне, что я где-то пропадаю, но я не могу ее найти.Освобождение и удаление дубликатов из связанного списка?

typedef struct node_t 
{ 
    int data; 
    struct node_t *next; 
} node; 



void remove_duplicates(node * head) 
{ 
    node* temp; 
    while (head != NULL && head->next != NULL) 
    { 
     while (head->data == head->next->data) 
     { 
      temp = head->next->next; 
      free(head->next); 
      head->next = temp; 
     } 
     head = head->next; 
    } 
    free(temp); 
} 

Я использую VALGRIND --leak-чек = да ./llistprac и выход

==24802== 80 (16 direct, 64 indirect) bytes in 1 blocks are definitely lost in loss record 5 of 5 
==24802== at 0x4A069EE: malloc (vg_replace_malloc.c:270) 
==24802== by 0x400575: append (in /home/llistprac) 
==24802== by 0x4006D9: main (in /home/llistprac) 
==24802== 
==24802== LEAK SUMMARY: 
==24802== definitely lost: 16 bytes in 1 blocks 
==24802== indirectly lost: 64 bytes in 4 blocks 
==24802== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 6 from 6) 
+0

Достаточно интересно (по крайней мере, для меня), когда я не освобождаю температуру в конце, это работает! Но тогда я все еще просачиваюсь ... – Bourezg

+0

Когда вы говорите, что Valgrind говорит вам, что вы просачиваетесь, но вы не можете найти его, какие аргументы вы используете и что такое выход Valgrind? – kbshimmyo

+1

Вам не нужно освобождать темп. – Duck

ответ

0
void remove_duplicates(node * head) 
{ 
    node* temp; 
    while (head != NULL && head->next != NULL) 
    { 
     if (head->data == head->next->data) 
     { 
      temp = head->next; 
      head->next = head->next->next; 
      free(temp); 
     } 
     else 
      head = head->next; 
    } 
} 

Каждый раз, когда вы удаляете узел или переместить головку к следующему узлу, вы должны всегда проверяйте, имеет ли head-next значение NULL.

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