Удаление одинаковых элементов связного списка - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здраствуйте. Пробую удалить одинаковые елементы списка но не получается и память якобы освобождаю, но при выводе ошибок никаих нету, и выводится мусор который остался от удаленных елементов, а может и вобще из другого блока памяти
#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;
}
когда вывожу на экран елементы связного списка, то такое чувство, что в списке который передается в delete_duplicated_terms ссылки не изменились. может оно и дествительно так. подскажите как правильно реализировать удаление одинаковых елементов? заранее спасибо.
походу вопрос сосотит в другом: как правильно изменть ссылки списка внутри функции, так, чтобы ссылки передаваемого списка тоже изменились(снаружи)?
нашел решение своей пробемы вот тут теперь функция удаления одинаковых елементов выглядит так:
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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5
Похожие ответы