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

标签 c linked-list opaque-pointers

所以我有一个链接列表堆栈作为 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 的节点的公共(public)版本。我不知道你对不透明物体有多熟悉,但为此我需要这样做。我不能把 eveythign 放在一起我知道如何用它删除头部但这里它不起作用

这是 MY_STACK 头文件。 Node_ptr 是私有(private)版本,它包含相同的东西+数据和下一个字段。我必须将 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 函数没有执行此操作

最佳答案

该函数的返回类型为 MY_STACK。我怀疑它是指向节点的指针的类型定义。所以该函数必须返回一个指向节点的指针。

它可以看起来像下面这样

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 是一些整数常量。

关于c - 如何删除链表中的头节点? C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31217926/

相关文章:

c - qsort 不改变我的数组顺序

c - 为三重指针 : C 分配内存

我可以假设 long int 的大小总是 4 个字节吗?

c - 在链表代码的尾部插入一个节点

c - 双向链表中的结构内部结构

java - 移动链表中的项目

ios - 来自不透明的地址簿(_ :) in Swift 3

c - 不透明的 C 结构 : various ways to declare them

swift - 初始化 AudioConverterRef Swift 3.0

C++ 字节字符串转换为字节数据类型并计算字节数