@pashaa

Как правильно удалять элементы из односвязного списка?

struct QUEUE
{
    NODE* info;
    QUEUE *next;
};
NODE* take_out(QUEUE *q, int *error)
{
    QUEUE *old_item = q;    // начало очереди
    NODE *old_info = 0;
    if (q)  // если очередь не пуста
    {
        old_info = old_item->info;
        q = (q)->next;
        delete old_item;    // уничтожение элемента
        *error = 0;
    }
    else *error = 1;
    return old_info;
}
void    prefix(NODE *p)
{
    int *err=new int;
    QUEUE *queue = 0;
    while (p != 0 || !isempty(queue)){
        if (!isempty(queue))
        {
            p = take_out(queue, err);
        }
    
        while (p != 0){
            printf(" %-7d ", p->info);
            if (p->right != 0) 
                queue=append(queue,p->right);
            p = p->left;
        }
    }
}

Как сделать чтобы в функции take_out освобождалась память queue? сейчас не правильно работает и поэтому функция isempty показывает что очередь не пуста хотя все элементы удалены. Они обозначаются как ???.
  • Вопрос задан
  • 1117 просмотров
Пригласить эксперта
Ответы на вопрос 1
rhaport
@rhaport
После вызова take_out (обычно называют pop), куда показывает голова очереди? Переменная queue указывает на адрес, который только что освободили.

либо возвращайте в take_out указатель на новую голову:
QUEUE* take_out(QUEUE *q, NODE *node, int *error)
{
    QUEUE *old_item = q;    // начало очереди
    NODE *old_info = 0;
    if (q)  // если очередь не пуста
    {
        old_info = old_item->info;
        q = (q)->next;
        delete old_item;    // уничтожение элемента
        *error = 0;
    }
    else *error = 1;

    node = old_info;

    return q;


....
   queue = take_out(queue, p, err)
}

либо организуйте очередь как
struct List;

struct List
{
    struct List *next;
    NODE *info;
};

typedef struct
{
    struct List *head;
} QUEUE;

int pop(QUEUE* q, NODE* info)
{
    int ret;

    if (q && q->head)
    {
        info = q->head->info;
        q->head = q->head->next;
        ret = 0;
    }
    else
    {
        ret = -1;
    }
}


по мне второй вариант лучше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы