Удаление одинаковых элементов связного списка - C (СИ)
Формулировка задачи:
Здраствуйте. Пробую удалить одинаковые елементы списка но не получается и память якобы освобождаю, но при выводе ошибок никаих нету, и выводится мусор который остался от удаленных елементов, а может и вобще из другого блока памяти
когда вывожу на экран елементы связного списка, то такое чувство, что в списке который передается в delete_duplicated_terms ссылки не изменились. может оно и дествительно так. подскажите как правильно реализировать удаление одинаковых елементов? заранее спасибо.
#define TERM_MAX_SIZE 4
typedef struct _term{
int x[TERM_MAX_SIZE];
struct _term* next;
} term;
typedef struct _boolnf{
term* begin;
term* end;
} boolnf;
// проверяет одинаковые ли два елемента
int can_absorp_terms(term* t1, term* t2){
int i = TERM_MAX_SIZE;
while(i--)
if(t1->x[i] != t2->x[i])
return 0;
return 1;
}
// удаляет(по крайней мере должна) одинаковы елементы
// и возвращает количество удаленных
int delete_duplicated_terms(boolnf *b){
term* h = b->begin;
term* t;
term* d;
int c = 0;
while(h->next){
t = h->next;
while(t) {
if(can_absorp_terms(h, t)){
d = t;
t = t->next;
free(d);
c++;
} else {
t = t->next;
}
}
h = h->next;
}
return c;
}
походу вопрос сосотит в другом: как правильно изменть ссылки списка внутри функции, так, чтобы ссылки передаваемого списка тоже изменились(снаружи)?
нашел решение своей пробемы вот тут
теперь функция удаления одинаковых елементов выглядит так:
int delete_duplicated_terms(boolnf *b){
term* head = b->begin;
term* current = head;
int c = 0;
if(!current)return;
while(current->next){
if(can_absorp_terms(current, current->next)){
term* next_next = current->next->next;
free(current->next);
current->next = next_next;
c++;
} else {
current = current->next;
}
}
return c;
}Решение задачи: «Удаление одинаковых элементов связного списка»
textual
Листинг программы
#include <string.h>
int equal_terms(const term *t1, const term *t2)
{
return memcmp(t1->x, t2->x, TERM_MAX_SIZE) == 0;
}