2016-03-14 2 views
0

У меня возникла проблема с реализацией функции, которая удаляет первый элемент из стека. (Я знаю, что стек имеет минимум два элемента)Элемент pop head в стеке C

typedef struct Node { 
    T value; 
    struct Node *next; 
} Node; 

typedef struct Stack { 
    Node *head; 

} Stack; 

void Pop(Stack **st) { 
    if (!IsEmptyStack(*st)) { 
     Node* aux = (*st)->head; 
     (*st)->head = (*st)->head->next; 

    } 
} 

но то же самое происходит ... Segmentation fault.

Как я могу исправить функцию поп?

Вот другие функции, которые я использую:

void InitStack(Stack **st) 
{ 
    (*st) = (Stack *) malloc(sizeof(Stack *)); 
    (*st)->head = NULL; 

} 

int IsEmptyStack (Stack *st) 
{ 
    if (!st) 
     return 1; 
    else 
     return 0; 
} 
+0

Почему вы проходите ** st вместо просто * st? – JoulinRouge

+0

Код выглядит нормально (как и не должен вызывать ошибку seg). Проблема, вероятно, в коде, который создает стек. –

+0

@JoulinRouge Это школьное задание, и я не могу изменить определение функции –

ответ

0

Первый подход представляется правильным, но почему вы передаете двойной указатель на Stack функционировать Pop? Кажется Pop можно упростить следующим образом:

typedef struct Node { 
    T value; 
    struct Node *next; 
} Node; 

typedef struct Stack { 
    Node *head; 
} Stack; 

void Pop(Stack *st) { 
    if (!IsEmptyStack(st)) { 
     Node *aux = st->head; 
     st->head = aux->next; 
     ... // dispose of aux appropriately 
    } 
} 
+0

Я знаю .. Это школьное задание и я не могу изменить его определение ... –

+0

@PetruGurita: если прототип исправлен, ваш первый фрагмент кода выглядит корректно, проблема в другом месте, возможно, в создании или нажатии кода «Stack». – chqrlie

+0

другие детали работа совершенно хорошо. –

0

IsEmptyStack был неправ .. вместо

int IsEmptyStack (Stack *st) 
{ 
    if (!st) 
     return 1; 
    else 
     return 0; 
} 

Я должен использовать

int IsEmptyStack (Stack *st) 
{ 
    if (!st->head) 
     return 1; 
    else 
     return 0; 
} 

Это потому, что я уже выделенной памяти для st .. поэтому проверка st не имеет значения.

Смежные вопросы