простой стек в c со связанным списком и указателями - PullRequest
0 голосов
/ 28 февраля 2019

Мне нужно реализовать простой стек в C, но прошло несколько лет с тех пор, как я написал что-то на C, поэтому я немного заржавел.

У меня есть структура, определенная в файле .h, как этот,typedef struct _my_stack my_stack_t;, а также функция, которая инициализирует стек my_stack_t* my_stack_new();, и функция push void my_stack_push(my_stack_t *s, void *data);

в файле .c. Я определил стек и функцию init следующим образом:

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

Однако, похоже, push не работает, если я получаю ошибки сегментации при попытке получить доступ к данным элемента, который я нажал.так почему это не работает.в толчке он выделил место для элемента стека и поместил указатель на данные в переменную данных.и он берет указатель на текущий заголовок стека и помещает его в следующую переменную, а затем делает его указателем на текущий элемент.

примечание: файл .h задан, поэтому мне нужно взять функцииони там объявлены.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

однако, похоже, что push не работает, я получаю ошибки сегментации, когда пытаюсь получить доступ к данным элемента, который я нажал.так почему же это не работает

возможно, вы делаете что-то подобное:

my_stack_t* mystack;

my_stack_push(mystack, ..adata..);

предположим, что mystack изменено my_stack_push, это недело в том, что в my_stack_push форме s=mystack; просто измените локальную переменную

У вас есть два способа изменить, что

1) даст адрес переменной впараметр, а не его значение

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;
};
0 голосов
/ 28 февраля 2019

Проблема в том, что изменение 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 инициализируется с копией значения s в main.

Следовательно - изменение значения s внутри my_stack_push делает не изменяет значение s в main.

Чтобы изменить переменную вне функции, необходимо передать функции указатель на эту переменную.

Итак, что вы хотите:

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 &
...