Стек реализован через связанный список в C - PullRequest
1 голос
/ 25 апреля 2011

Следующий код является частью реализации стека, реализованной с помощью связанного списка, в C. Есть ли проблемы с кодом? В частности, в методе pop() вызывающая сторона передает аргумент void**, поэтому pop() может назначить ему указатель на данные верхнего узла. pop() впоследствии вызывает delete, чтобы освободить верхний узел стека, на который указывает *data. Не приведет ли это к удалению данных в указателе, которые должны быть возвращены вызывающей стороне, или я что-то упустил?

typedef struct Element 
{
    struct Element *next;
    void *data;
} Element;


bool pop( Element **stack, void **data )
{
    Element *elem;
    if (!(elem = *stack)) return false;

    *data = elem->data;
    *stack = elem->next;
    delete elem;
    return true;
}


bool push( Element **stack, void *data )
{
    Element *elem = new Element;
    if(!elem) return false;

    elem->data = data;
    elem->next = *stack;
    *stack = elem;
    return true;
} 

Ответы [ 2 ]

3 голосов
/ 25 апреля 2011

Несколько мыслей:

  • Если вы хотите скомпилировать это с помощью компилятора C, используйте malloc () и free () вместо new и delete. Это ключевые слова C ++.
  • Если вам нужен быстрый способ определения размера стека, я предлагаю создать структуру данных стека, которая содержит указатели head и tail и длину стека, а затем передать это в функции push () и pop (). Кроме того, вам не понадобятся двойные указатели.
  • Верните указатель данных из вашей функции pop () и не забудьте освободить () его (при необходимости).
1 голос
/ 25 апреля 2011

Реализация pop в порядке, как есть.Структура Element и указатель данных являются двумя отдельными частями памяти.Удаление элемента списка не удаляет данные, на которые указывает его член.Вы можете увидеть это, возможно, более четко в функции pushОн создает новый Element и устанавливает указатель данных на заданную память.

...