2010-01-30 3 views
0

Я пытаюсь создать стек, используя структуру связанных списков.Проблема с реализациями связанных списков

Возможно, я ошибаюсь, но у меня возникают проблемы с функцией remove().

int Stack::remove(){ 
    node* victim = new node; 
    int popped; 
    popped = top->element; 
    victim = top; 
    top = victim->next; 
    delete victim; 
    return popped; 
} 

Я получаю Glibc dectecting

двойной бесплатно или коррупции (из);

Поскольку я выделяю новую память жертве, разве я не должен удалять жертву, или это то, о чем мне не нужно беспокоиться?

+0

Нет смысла выделять память или использовать новую для узла-жертвы. Помните, что указатель - это просто ссылка, поэтому просто указывайте на заголовок списка. Сохраните значение данных, переместите головку списка в следующий элемент (возможно, захотите проверить NULL), а затем удалите указатель темпа, который вы изначально указывали на голову. Это означает, что вы выскочили. – JonH

ответ

2

Стек очень похожа на кучу блюд, которые мыть и накладывать друг на друга. Это первый из них - последний (тип данных FILO). То есть, если ваш стек чтения в 2, 7, 8, то она будет выглядеть следующим образом:

То есть сначала 2 помещается в стек, а затем 7, а затем 8. Если вы хотите удалить или поместить стопку, вам нужно переместить указатель. Ваш код выглядит немного странно для меня ...

int Stack::remove() 
{ 
    int datum;  //to store the popped value 
    node* temp=head; //assign pointer to head of list 
    datum = temp->data; //grab the data value stored at the head (or temp since they carry same reference) 
    head = temp->next; //move the head pointer (in our example now it points to 7) 
    delete temp; 
    return datum; 
} 
+0

Возможно, вы захотите выполнить некоторую проверку ошибок, чтобы проверить наличие нулей. – JonH

+0

shouldnt temp-> next должен быть установлен в null, потому что некоторые люди создают пользовательские деструкторы, так что если узел удален, он рекурсивно удаляет узел, на который указывает – randomThought

+0

@Jaelebi no, поскольку temp удален, внимательно посмотрите на реализацию как временную становится главой списка. Голова перемещается, а затем temp освобождается, используя delete. Вы можете сказать 'temp-> next = NULL;' right before 'delete temp; 'но считая, что вы его удаляете, а функция заканчивается, это нецелесообразно. – JonH

1

Нет причин выделять кучную память в методе remove(), как вы это делаете, с victim. Чего вы хотите:

int Stack::remove(){ 
    node* new_top = top->next; 
    int popped = top->element; 

    delete top; 
    top = new_top; 

    return popped; 
} 
1

Вам не нужно выделить узел для victim. Просто назначьте ему верхнюю часть стека и, если это не null, установите top в свой указатель next, найдите значение от victim, а затем освободите .

На самом деле это не коррупция, а утечка памяти - вы назначаете узел, а затем переопределяете этот указатель с victim = top;, тем самым теряя след только что выделенной памяти.