如何删除链表中的头节点?C

如何删除链表中的头节点?C,c,linked-list,opaque-pointers,C,Linked List,Opaque Pointers,因此,我在C中有一个链表堆栈作为不透明对象。我传入一个指向函数的头指针 这是delete head函数的代码。我管它叫流行音乐 MY_STACK pop(MY_STACK* head) { Node_ptr hHead = (Node_ptr)head; if (*head == NULL){ printf("badness \n"); return FAILURE; } hHead = hHead->next;

因此,我在C中有一个链表堆栈作为不透明对象。我传入一个指向函数的头指针

这是delete head函数的代码。我管它叫流行音乐

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;
}
这不管用。它不会删除头部节点。我真的可以。但是当我这样做时,头部节点没有切换到下一个,程序崩溃,因为没有头部lol。我如何将头部切换到下一个。因为它不起作用。这是一个节点指针。它是名为
MY\u STACK
的节点的公共版本。我不知道你们对不透明物体有多熟悉,但为此我必须这样做。我不能把所有的符号放在一起,我知道如何用它来删除头部,但在这里它不起作用

这是我的_堆栈头文件。Node_ptr是私有版本,它保存相同的things+数据和next字段。我必须将我的_堆栈转换为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

我有一个insert函数,它可以工作。它改变了头部。但是由于某些原因,pop函数没有执行它

该函数具有返回类型
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;
    }
}

我正在向Node_ptr抛出头,因为stack是Node struct的公共版本,无法访问数据之类的内容。请说明MY_stack是如何定义的。这是为什么不键入定义结构的主要示例。在本例中,“MY_STACK”实际上是一个指针,但是代码的读者/维护者必须仔细阅读代码才能找到该细节。代码应该写得非常清楚,而不是模糊不清。此外,通常,名称的所有大写+下划线通常用于#define和const名称。建议以后对typedef名称使用camel case。这会崩溃。头不是switching@jobobdsfos崩溃的原因是什么?我试图通过添加一个元素并删除它后查看head是否为NULL来查看列表是否为空。如果我使用free()。它崩溃了。如果我没有。脑袋是老脑袋。它没有改变。@jobobdsfos你是指我文章中的第二个函数实现吗?@jobobdsfos第二个函数“head”被定义为指向指针的指针,这有助于改变变量“head”指向的内容。然而,head不是指向MY_堆栈结构实例的指针。所以这一行:“head=head->next”将无法按预期工作。@user3629249我犯了一个错误,认为我的\u堆栈不是指针。答案已更新。