1

我不确定我是否正确理解了链表的概念。我想做的是创建一个链表,它接收整数 6 作为它的第一个“数据”。相反,当我尝试将整数写入第一个节点的数据时,我得到了这个访问冲突错误。我在这里错过了什么具体的东西吗?

    ///////////////////////////////

typedef struct List_Node
{
    int data;
    struct List_Node* next;
}List_Node;

typedef struct List
{
    List_Node* head;
}List;

////////////////////////////////


List* create_list();
void print_list(List_Node *x);
void add_to_node(List_Node *a,int val);

////////////////////////////////

void main()
{
    List *a = create_list();
    List_Node *ind = a->head;
    printf("List:\n");
    add_to_node(ind,6);
}

void print_list(List_Node *a)
{
    while(a != NULL)
    {
        printf("%d \n",a->data);
        a = a->next;
    }
    return;
}

void add_to_node(List_Node *a,int val)
{
    a->data = val;
}

struct List* create_list()
{
struct List* list = (List*) malloc(sizeof(List));
list->head = NULL;
return list;
}
4

3 回答 3

2

代码按原样取消引用NULL指针:a->headNULL

list->head = NULL; /* inside create_list()` and 'list' returned to ...*/

List_Node *ind = a->head; /* ... inside main(), and then passed to */
add_to_node(ind,6);       /* add_to_node() ... */

a->data = val;            /* and dereferenced inside add_to_node(). */

取消引用NULL指针是未定义的行为。要更正,malloc()请记住 aList_Node并分配给a->head。建议创建一个add_node()分配内存并将新int值分配给新malloc()d 节点的函数。


我要转换 malloc 的结果吗?

于 2013-04-02T08:48:30.533 回答
1

正如所有人都指出的那样,您将NULL指针取消引用为您的list->headcontains NULL

我应该指出的另一件事是,您正在创建一个列表。但不是任何节点。列表中没有节点。您必须为节点分配内存然后使用它。

add_to_node()因此,您可以使用add_nodelist或和 值作为参数的函数来代替head,创建一个节点(即为节点分配内存),设置值并将其添加到列表中。

此外,在您的情况下,该结构List是多余的,因为它仅包含一个成员。相反,您可以简单地使用List_node* head.

于 2013-04-02T09:02:40.810 回答
1

你在做什么:

create_list

  • List指针分配内存。
  • 将列表的头部设置为 NULL。

add_to_node

  • 将指定节点指针的data元素设置为指定的val.

main

  • 通过调用创建List指针。这个列表有一个 NULL 头。acreate_list
  • 初始化List_Node指针 ,ind以指向已创建列表的头部(为 NULL)。
  • 试图ind通过调用将 的数据元素设置为 6 add_to_node
    • 这是您的程序导致访问冲突异常的地方。
    • ind=空。因此NULL->data=未定义的行为。

你应该做什么:

create_list

  • List指针分配内存,比如linked_list.
  • linked_list为' 的head指针分配内存。
  • 对于linked_list's head,分别初始化datanext指向 0 和 NULL 的指针。

add_to_node

  • 做你现在正在做的同样的事情。

main

  • 通过调用创建一个List指针。现在,这个列表将有一个有效的、已初始化的 NULL 头,但没有有意义的数据。acreate_list
  • data通过调用设置列表的头部add_to_node(a->head, 6);

注意:这只会确保您的列表中有一个头节点。您没有在任何地方创建其他节点。

于 2013-04-02T09:16:20.640 回答