c中带有链接列表和指针的简单堆栈

时间:2019-02-28 14:46:37

标签: c pointers linked-list stack

我必须在C中实现一个简单的堆栈,但是距离我用C语言写东西已经过去了几年,所以有点生疏。

我在.h文件中定义了这样的结构,typedef struct _my_stack my_stack_t; 以及初始化堆栈my_stack_t* my_stack_new();的函数和推送函数void my_stack_push(my_stack_t *s, void *data);

在.c文件中,我这样定义了堆栈和初始化函数

struct _my_stack{
    void* data;
    struct _my_stack* next;
};
my_stack_t* my_stack_new(){
    my_stack_t* mystack = NULL;
    return mystack;
};

然后我定义了如下的push函数:

void my_stack_push(my_stack_t *s, void *data){
    my_stack_t* mystack = (my_stack_t*)malloc(sizeof(my_stack_t));
    mystack->data = data;
    mystack->next = s;
    s=mystack;
};

但是,推送似乎不起作用,尝试访问所推送元素的数据时出现分段错误。 那么为什么它不起作用。 在推送中,它为堆栈项分配了空间,并将指向数据的指针放在data变量中。然后将指针指向堆栈的当前头,并将其放在下一个var中,然后使堆栈头指向当前元素。

注意:.h文件已给定,因此我必须接受在此处声明的函数。

2 个答案:

答案 0 :(得分:2)

问题是在s内对my_stack_push进行的更改不会更改调用my_stack_push时用作参数的变量的值。

如果您的代码是:

int main()
{
    ...
    my_stack_t* s = my_stack_new();
    my_stack_push(s, some_data_pointer);
    ...
}

然后,s中的main是与s内部的my_stack_push不同的变量。他们唯一的关系是s中的my_stack_push初始化为smain值的副本

因此-更改smy_stack_push的值不会更改smain的值。

要在函数外部更改变量,您需要向函数传递指向该变量的指针。

所以您想要的是:

void my_stack_push(my_stack_t **s, void *data){   // Notice the extra *
    my_stack_t* mystack = malloc(sizeof(my_stack_t));
    mystack->data = data;
    mystack->next = *s;   // Notice the extra *
    *s=mystack;           // Notice the extra *
};

并像这样使用它:

my_stack_t* s = my_stack_new();
my_stack_push(&s, some_data_pointer);  // Notice the &

答案 1 :(得分:1)

  

但是,推送似乎不起作用,尝试访问所推送元素的数据时出现分段错误。那为什么不起作用

您可能会做类似的事情:

my_stack_t* mystack;

my_stack_push(mystack, ..adata..);

假设 mystack my_stack_push修改,情况并非如此,因为在my_stack_push中,s=mystack;形式只需修改 local 变量

您可以通过两种方式进行更改

1)在参数中给出var的地址,而不是其值

my_stack_t* mystack = NULL;

my_stack_push(&mystack, ..adata..);

当然

void my_stack_push(my_stack_t **s, void *data){
    my_stack_t* mystack = (my_stack_t*)malloc(sizeof(my_stack_t));
    mystack->data = data;
    mystack->next = *s;
    *s=mystack;
};

2)返回新单元格

my_stack_t* mystack = NULL;

mystack = my_stack_push(mystack, ..adata..);

当然

my_stack_t * my_stack_push(my_stack_t *s, void *data){
    my_stack_t* mystack = (my_stack_t*)malloc(sizeof(my_stack_t));
    mystack->data = data;
    mystack->next = s;
    return mystack;
};