Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очистка памяти в однозвязном списке 
:(
    Опции темы
sigwey
Дата 28.12.2010, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.12.2010

Репутация: нет
Всего: нет



Очень нужна помощь с программой на Си. Завтра сдача проги, не сдам не допустя к сессии)))
Программа для работы со списком. суть в том что елементы, которые больше своего порядкового номера надо оставить в списке. 
После выполнения работ надо очистить память. Вот тут вот и случилась загвоздка. Не как не могу очистить память элемента...
Буду оччень признателен за помощь.
Код
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

struct el
{
    int info;
    struct el *next; 
};

int main ()
{

    int i, k, n;
    struct el *first, *cur = NULL, *tmp, *t;

    first = ( struct el * ) malloc ( sizeof ( struct el ) );

    printf ( "Enter elements, finish 'symbol'\n" );
    printf("Element = ");
    scanf ( "%d", &n );
    
    first -> info = n;
    first -> next = cur; 
    
    cur = first;
    
    i = 1; 
    while ( 1 )
    {
        tmp = ( struct el * ) malloc ( sizeof ( struct el ) ); 
        if ( !tmp ) 
        {
            printf ( "Memory" );
            exit ( 0 );
        }

        cur -> next = tmp; 

        printf("Element = ");
        k = scanf ( "%d", &n );
        if ( k == 0 )
        {
            break;
        }
        

        tmp -> info = n;
        tmp -> next = NULL;

        cur = tmp; 

        i ++; 
    }

    
    cur = first;
    tmp = first;
        
    for ( k=n=0; k < i; k ++ )
    {
        if ( cur->info > k)
        {
            tmp->info = cur->info;
            cur = cur->next;
            tmp = tmp->next;
            n++;
        }
        else
        {
            //Вот тут надо сделать очистку памяти...
        }
    }
    
    cur = first;
    
    for ( k = 0; k < n; k ++ )
        {
            printf ("%d ", cur -> info);
            cur = cur -> next;
        }

    printf ("\n");
    getch();
}



Модератор: Не забываем пользоваться кнопочкой "Код".

Это сообщение отредактировал(а) bsa - 28.12.2010, 22:02
PM MAIL   Вверх
bsa
Дата 28.12.2010, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Освобождать память нужно там, где уничтожается объект находящейся в ней. Судя по коду, он у тебя удаляет первые элементы большие k
PM   Вверх
sigwey
Дата 29.12.2010, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.12.2010

Репутация: нет
Всего: нет



Цитата(bsa @ 28.12.2010,  22:12)
Освобождать память нужно там, где уничтожается объект находящейся в ней. Судя по коду, он у тебя удаляет первые элементы большие k

Да нет. Как раз надо освобождать память в тех элементах, которые не отвечают условиям отбора. То есть те, которые меньше k.
PM MAIL   Вверх
bsa
Дата 29.12.2010, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
for(k = 0; cur; cur = cur->next) {
   if (cur->info <= k) {
      struct el *tmp = cur;
      cur = cur->next;
      free(tmp);
   } else
      ++k;
}

PM   Вверх
Чoо
Дата 29.12.2010, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



может так пойдет? (не проверял, пока нет такой возможности)
Код

    struct el* pre = NULL;
    for ( k=n=0; k < i; k ++ )
    {
        if ( cur->info > k)
        {
            pre = cur;
            cur = cur->next;
            n++;
        }
        else
        {
            if(!pre)
                first = curr->next;
            else
                pre->next = curr->next;
            free(curr);
        }
    }


Добавлено через 19 секунд
пока писал - опередили :(

Добавлено через 1 минуту и 31 секунду
а мож и нет. Я понял, что автору обязательно нужно инкрементировать К, что бы он соответствовал порядковому номеру элемента в списке (до удалений)

Добавлено через 2 минуты и 28 секунд
а n, что бы считал новое количество элементов в списке (хотя не вижу смысла)


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
sigwey
Дата 29.12.2010, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.12.2010

Репутация: нет
Всего: нет



Cпасибо всем, буду пробовать...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0675 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.