Stack and push() function

  • 本文关键字:function push and Stack c
  • 更新时间 :
  • 英文 :


我正在做一个练习,希望得到支持。问题是:我有两个结构(1个用于堆栈的节点,1个用于栈)。在节点结构中,有一个void*数据字段。

我曾尝试在堆栈上推送一个值,但由于void*数据而不是简单数据,我失败了。

这是关于结构和push()函数的代码。

struct upo_stack_node_s
{
void *data;
struct upo_stack_node_s *next; 
};
typedef struct upo_stack_node_s upo_stack_node_t;
struct upo_stack_s
{
upo_stack_node_t *top;
size_t size;
};
/*Function for create the stack*/
upo_stack_t upo_stack_create()
{
upo_stack_t stack = malloc(sizeof(struct upo_stack_s));
if (stack == NULL)
{
fprintf(stderr, "Unable to create a stack!n");
abort();
}
stack->top = NULL;
stack->size = 0;
return stack;
}
/*Push() function:*/
void upo_stack_push(upo_stack_t stack, void *data)
{
/* TO STUDENTS:
*  Remove the following two lines and put here your implementation
*/     
upo_stack_node_t *node = malloc(sizeof(struct upo_stack_node_s));
node->data = data; /*<-- Here's the problem */
node->next = stack->top;
stack->top = node;
++stack->size;
}
/*Top() function*/
void* upo_stack_top(const upo_stack_t stack)
{
/* TO STUDENTS:
*  Remove the following two lines and put here your implementation
*/
return (void *)(stack->top); //<---
}
/*Function for testing (there are other functions in the code)*/
void test_top()
{
int value1 = 1;
int value2 = 2;
upo_stack_t stack;
stack = upo_stack_create();
upo_stack_push(stack, &value1); //<----
upo_stack_push(stack, &value2); //<----
assert( upo_stack_top(stack) != NULL );
assert( *((int*) upo_stack_top(stack)) == value2 ); <-- Here's the error
upo_stack_pop(stack, 0);
assert( upo_stack_top(stack) != NULL );
assert( *((int*) upo_stack_top(stack)) == value1 );
upo_stack_pop(stack, 0);
assert( upo_stack_top(stack) == NULL );
upo_stack_destroy(stack, 0);
}

您总是需要传递一个void指针。这意味着,如果你想传递一个简单的值,比如1,你需要做的就是分配一个整数值,并将指针传递给它(作为一个空指针)。

因此类似于:

int x = 4;
upo_stack_push(upo_stack, &x);

当然,您必须确保int变量x没有超出范围,否则指针将指向释放的内存,这将导致严重的内存问题。

更新

上面假设您传递的void指针已经存储在堆栈作用域的内存中。如果您希望堆栈本身复制数据,您还必须为此对空间进行malloc操作,因此不仅要对节点进行malloc,还要对传递的数据类型进行malloc和复制。还要知道数据的大小(因为它是一个void指针,不知道它的类型),您必须向push函数添加一个int size参数。

对于要存储的整数值,请将其作为指针传递,大小为:sizeof(int)。要复制数据结构,请使用memcpy。这只适用于没有指针的简单类型和结构。如果你必须用指针复制结构(因此你需要所谓的深度复制),那么这就更棘手了。

相关内容

最新更新