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

Posted

技术标签:

【中文标题】如何删除链表中的头节点? C【英文标题】:How to delete head node in linked list? C 【发布时间】:2015-07-04 07:02:25 【问题描述】:

所以我有一个链表堆栈作为 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 的节点的公共版本。我不知道您对不透明对象有多熟悉,但为此需要这样做。我不能只是把所有东西放在一起,我知道如何用它来进行头部删除,但在这里它不起作用

这是 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

我有一个有效的插入功能。它改变了头部。但由于某种原因,pop 函数没有这样做

【问题讨论】:

我将头转向 Node_ptr,因为 stack 是 Node 结构的公共版本,无法访问数据等内容。 请说明MY_STACK是如何定义的。 这是为什么不 typedef 结构的一个典型例子。在这种情况下,“MY_STACK”实际上是一个指针,但是代码的阅读器/维护者必须深入挖掘代码以找到该细节。代码应该写得非常清楚,而不是模糊不清。此外,一般来说,名称的所有大写+下划线通常用于#define 和 const 名称。建议将来使用驼峰式命名 typedef 名称 【参考方案1】:

函数的返回类型为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;
    

其中 SUCCESS 和 FAILURE 是一些整数常量。

【讨论】:

是的。这崩溃了。头部没有切换 @jobobdsfos 什么会崩溃? 我尝试通过在添加一个元素并删除它后查看 head 是否为 NULL 来查看列表是否为空。如果我使用免费()。它崩溃了。如果我不这样做。头是老头。它没有改变。 @jobobdsfos 你是说我帖子里的第二个函数实现吗? @jobobdsfos 第二个函数?【参考方案2】:

建议使用指针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;
    

【讨论】:

'head' 被定义为指针的指针,这有利于改变变量'head'指向的内容。但是,head 不是指向 MY_STACK 结构实例的指针。所以这一行:'head=head->next' 不会按预期工作。 @user3629249 我犯了一个错误,认为MY_STACK 不是指针。答案已更新。

以上是关于如何删除链表中的头节点? C的主要内容,如果未能解决你的问题,请参考以下文章

237. 删除链表中的节点

题目地址(237. 删除链表中的节点)

从链表中删除总和值为0的连续节点

删除链表元素相关的练习

算法系列——删除链表中的节点

算法系列——删除链表中的节点