Продолжайте получать ошибки сегмента в этом коде

Я пытаюсь реализовать связанный список в C. Есть структурный список, который имеет пустые указатели на первую и последнюю позицию списка. Узел структуры, имеющий пустой указатель на данные и указатель на следующий узел. По какой-то причине, когда я пытаюсь получить доступ к переднему указателю структуры списков, происходит сбой. Вот код Любая помощь будет оценена.

(Основной метод инициализирует список, который передается в функцию как нулевой)

int main()
{
   struct list *linked_list;
   linked_list = NULL;

   int *ptr;
   int x = 5;
   ptr = &x;

    linked_list = list_add(linked_list,ptr);

 }

struct list {
    void *front;
    void *back;
};

struct node{
    void *data;
    struct node *next;
    struct node *prev;
};

struct list *list_add(struct list *li, void *d){
    struct node *new_node;

    new_node = (struct node *)malloc(sizeof(struct node));
    if(new_node == NULL){
        printf("Malloc failed");
        exit(1);
    }


    new_node->data = d;
    new_node->next = NULL;
    struct node *cur;
    for(cur = li->front; cur != NULL; cur = cur->next){
        if(cur->next == NULL){
            new_node->prev = cur;
        }

    }
    li->front = new_node;
    return li;
}

2 ответа

Решение
struct list *linked_list;
linked_list = NULL;

...

linked_list = list_add(linked_list,ptr);

Вы передаете нулевой указатель (linked_list) в list_add(), Затем в list_add() вы разыменовываете этот указатель, что приводит к падению.

внутри list_add()рассмотрим что-то вроде этого наверху:

struct list *list_add(struct list *li, void *d){
struct node *new_node;

if (!li) {
    li = malloc(sizeof(*li));
    li->front = li->back = NULL;
}

new_node = malloc(sizeof(struct node));
...

Может быть, вам нужно сделать больше, но это поможет вам преодолеть первое препятствие. Обратите внимание, что вы можете сделать аналогичную инициализацию в main() прежде чем звонить list_add(),

Ну, во-первых, я не думаю, что это правильный способ создания связанных списков, нет необходимости в структуре списка

int main()
{
   struct list *linked_list;
   linked_list = NULL;

   int *ptr;
   int x = 5;
   ptr = &x;

    linked_list = list_add(linked_list,ptr);

 }

struct list {
    void *front;
    void *back;
};

struct node{
    void *data;
    struct node *next;
    struct node *prev;
};

struct list *list_add(struct list *li, void *d){
    //you need to check if li is null if so initialize it
    if(li ==null){
      li = (struct list*) malloc(sizeof(struct list));
    }
    struct node *new_node;

    new_node = (struct node *)malloc(sizeof(struct node));
    if(new_node == NULL){
        printf("Malloc failed");
        exit(1);
    }


    new_node->data = d;
    new_node->next = NULL;
    struct node *cur;
    for(cur = li->front; cur != NULL; cur = cur->next){
        if(cur->next == NULL){
            new_node->prev = cur;
        }

    }
    li->front = new_node;
    return li;
}

но вместо проверки на нулевое значение в функции просто сделайте list_add пустым и передайте инициализированный список

Другие вопросы по тегам