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

Таким образом, у меня есть стек связанных списков в виде непрозрачного объекта в C. Я передаю указатель на головку указателя на функцию.

это код для функции удаления заголовка. я называю это поп

MY_STACK pop(MY_STACK* head) {  
    Node_ptr hHead = (Node_ptr)head;
    if (*head == NULL){

        printf("badness \n");
        return FAILURE;
    }


    hHead = hHead->next;

    return SUCCESS;
}

это не работает это не удаляет головной узел. Я действительно могу. но головной узел не переключается на следующий, когда я это делаю, и программа вылетает из-за отсутствия головы. как мне переключить голову на следующую. потому что это не работает. это указатель на указатель узла. это публичная версия узла под названием MY_STACK, Я не знаю, насколько вы знакомы с непрозрачным объектом, но для этого требуется сделать это следующим образом. Я не могу просто собрать eveythign вместе, я знаю, как сделать удаление головы с этим, но здесь это не работает

это заголовочный файл MY_STACK. Node_ptr - приватная версия, которая содержит те же самые вещи + данные и следующие поля. Я должен привести MY_sTACK к Node_ptr для доступа к этим вещам.

    #ifndef MY_STACK_H
#define MY_STACK_H

#include "my_status.h"

enum boolean {FALSE, TRUE};
typedef enum boolean Bool;

struct my_stack_public;
typedef struct my_stack_public* MY_STACK;

struct my_stack_public
{
    void (*destroy)(MY_STACK* phMy_stack);
    Status (*push)(MY_STACK* hMy_stack, char item);
    Status (*pop)(MY_STACK* hMy_stack);
    char (*top)(MY_STACK hMy_stack);
    Bool (*empty)(MY_STACK hMy_stack);
};

MY_STACK my_stack_init_default(void);

#endif

У меня есть функция вставки, которая работает. это меняет голову. но по какой-то причине поп-функция не делает этого

2 ответа

Функция имеет тип возврата MY_STACK, Я подозреваю, что это typedef для указателя на узел. Таким образом, функция должна возвращать указатель на узел.

Это может выглядеть следующим образом

MY_STACK pop( MY_STACK *head )
{
    MY_STACK node = *head;

    if ( *head != NULL ) *head = ( *head )->next;

    return node;
}

Если функция должна удалить узел, который является текущим заголовком, и вернуть, был ли успех или неудача операции, тогда функция может выглядеть следующим образом

int pop( MY_STACK *head )
{
    if ( *head != NULL ) 
    {
        MY_STACK node = *head;
        *head = ( *head )->next;
        free( node );
        return SUCCESS;
    }
    else
    {
        return FAILURE;
    }
}

где УСПЕХ и НЕУДАЧА - некоторые целочисленные константы.

Предложите использовать указатель MY_STACK как тип возврата, попробуйте это:

MY_STACK pop(MY_STACK* head) {
    MY_STACK tmpHead = *head;
    if ((*head) == NULL) {
        printf("badness\n");
        return NULL;
    } else {
        *head = (*head)->next;
        tmpHead -> next = NULL;
        return tmpHead;
    }
}
Другие вопросы по тегам