Удаление одинаковых элементов связного списка - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д