继续在此代码上出现seg错误

时间:2013-11-18 21:07:30

标签: c pointers struct linked-list

我正在尝试在C中实现链接列表。有一个结构列表,其中包含指向列表第一个和最后一个位置的void指针。一个struct节点,它有一个指向data的void指针和一个指向next的struct节点指针。出于某种原因,当我尝试访问struct list前端指针时,它会出现故障。这是代码。任何帮助将不胜感激。

(main方法将传递给函数的列表初始化为null)

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 个答案:

答案 0 :(得分:1)

struct list *linked_list;
linked_list = NULL;

...

linked_list = list_add(linked_list,ptr);

您将NULL指针(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()中执行类似的初始化。

答案 1 :(得分:0)

首先,我不认为这是做链表的正确方法,不需要列表结构

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

但不是在函数中检查null,而是将list_add设为void并传入初始化列表