1

所以我有一个链表堆栈作为 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;
}

这不起作用。它不会删除头节点。我其实可以。但是当我这样做时,头节点不会切换到下一个,并且程序崩溃了,因为没有头大声笑。我如何将头部切换到下一个。因为它不工作。这是一个节点指针指针。它是 Node 的公共版本,称为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 功能不这样做

4

2 回答 2

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;
    }
}

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

于 2015-07-04T07:23:23.117 回答
-1

建议使用指针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;
    }
}
于 2015-07-04T07:33:26.837 回答