1

そのため、リンクされたリスト スタックを 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;
}

これは機能しません。ヘッド ノードは削除されません。私は実際にできます。しかし、私がそれを行ったときにヘッドノードが次に切り替わらず、ヘッドがないためにプログラムがクラッシュします笑。頭を次に切り替えるにはどうすればよいですか。機能していないためです。これはノード ポインタ ポインタです。と呼ばれるノードの公開バージョンです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 に答える