まず、stack
とstack_l
に異なる識別子を必要としません。さて、あなたの質問に:
Push
の機能は、copy
フィールドのタイプと互換性がありません。stack_l
です。 struct
に(member-)関数へのポインタを含めてC++のようにしたい場合は、オブジェクトをこれらの関数に渡す必要があります。
はい、どこかで機能を実装する必要があります。その定義はstruct stack
の範囲内にはできません。これは、何らかの種類のコンストラクタ関数が必要であることを意味します(あなたが好きな場合はnewStack
と呼ぶことができます)。あなたのコンストラクタは少なくともあなたの関数ポインタを初期化しなければなりません(もしあなたがそれらを保持したいなら)。あなたが明示的に空のスタックが何であるかを述べる必要はあり
stack_l* stackPush(stack_l* head, void* content) {
// head might be NULL, meaning the stack is "empty" or it might be an actual pointer
// we don't care
stack_l* const front = malloc(sizeof(stack_l));
*front = (stack_l){.data = content, .next = head};
return front;
}
注:これらの関数ポインタを維持しない選択した場合、あなたが示唆したように、あなたは、あなたのpush
ルーチンでも初期化コードを置くことができます。だから、わかりやすくするためにコンストラクタを実装することもできます。
stack_l* stackCreateEmpty() {
retun NULL;
}
多分デストラクタ:
void stackDestroyEmpty(stack_l* s) {
assert(s == NULL && "Tried to destroy non-empty stack.");
}
あなたの最後の質問:あなたは上記を参照として、あなたはにスペースを取得するためにmalloc
を使用する必要がありますstack_l
オブジェクトを保持している場合は、void*
メンバーに余分なスペースを割り当てる必要はありません。その一部はstack_l
の一部です。
明らかに、要素を削除するPop関数も作成しました。 – Kyrol