Как удалить головной узел в связанном списке? С
Таким образом, у меня есть стек связанных списков в виде непрозрачного объекта в 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;
}
}