Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2012, 00:39   #1
lowercase
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 88
По умолчанию Правильное изменение указателей связного списка внутри функции(Си)

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


то есть. если я я напишу
Код:
boolnf b = create_boolnf("0000111100001111); // есть у меня такая функция она создает 
// связной список заполня его елементами. она работает коректно это 100%
delete_duplicated_terms(&b);
хотя и в delete_duplicated_terms память освободится, и много раз поменяются указатели, в b значения указателей, а значит и струтура связного списка остантутся прежними

собсно вопрос: как правильно изменть значения указателей списка внутри функции, так, чтобы значения указателей передаваемого списка(снаружи) тоже изменились?
заранее спасибо.

Последний раз редактировалось lowercase; 10.10.2012 в 00:44.
lowercase вне форума Ответить с цитированием
Старый 10.10.2012, 12:12   #2
lowercase
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 88
По умолчанию

нашел решение своей пробемы вот тут.
теперь функция удаления одинаковых елементов выглядит так:
Код:
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;
}
lowercase вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание связного списка на Си zx11 Общие вопросы C/C++ 9 17.03.2014 00:54
Заполнение связного однонаправленного списка с++ Chelovekpredel Помощь студентам 1 07.10.2012 16:39
Удаление связного списка из памяти Mahin Общие вопросы C/C++ 3 13.07.2012 10:10
обращениe к члену связного списка soad33 Помощь студентам 0 03.11.2011 22:04
сортировка узлов связного списка pavelstraut Общие вопросы C/C++ 5 28.07.2009 23:27