Продолжайте получать ошибки сегмента в этом коде
Я пытаюсь реализовать связанный список в 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 пустым и передайте инициализированный список