有链接列表的内存操作错误

时间:2017-05-11 00:27:09

标签: c pointers linked-list

最后一次printf调用(printf(“%d \ n”,current-> val);)将不会被执行。在第一个printf函数的结果出现后,我收到错误“program.exe已停止工作”。我将不胜感激。

#include <stdio.h>

typedef struct node
{
    int val;
    struct node * next;
} node_t;

void print_list(node_t * head);

void main()
{
    node_t * head = NULL;
    head = malloc(sizeof(node_t));
    if (head == NULL)
        return 1;
    head->val = 3;
    head->next = malloc(sizeof(node_t));
    head->next->val = 2;
    head->next->next = malloc(sizeof(node_t));
    head->next->next->val = 3;
    head->next->next->next = malloc(sizeof(node_t));
    head->next->next->next->val = 18;

    print_list(head);

    head->next->next->next->next = malloc(sizeof(node_t));
    head->next->next->next->next->val = 5556;
    head->next->next->next->next->next = NULL;
    node_t * current = head;
    while (current->next != NULL) 
    {
        current = current->next;
    }
    current->next = malloc(sizeof(node_t));
    current->next->val = 32;
    current->next->next = NULL;
    printf("%d", current->next->val);
    system("pause");
}

void print_list(node_t * head) {
    node_t * current = head;

    while (current != NULL) {
        printf("%d\n", current->val);
        current = current->next;
    }
}

1 个答案:

答案 0 :(得分:2)

这不太顺利:

ipfs shutdown

您从未将head->next->next->next = malloc(sizeof(node_t)); head->next->next->next->val = 18; print_list(head); 初始化为NULL。而是使用head->next->next->next->next,或者将值显式设置为NULL。更好的是,编写一个函数来创建一个新节点,这样你就不会忘记初始化。更好的是,编写一个插入节点的函数。

这样的事情:

calloc

然后你可以:

node_t * create_node( int val ) {
    node_t *node = malloc(sizeof(*node));
    if( node ) {
        node->val = val;
        node->next = NULL;
    }
    return node;
}

node_t * insert_value( node_t *list, int value ) {
    node_t *new_node = create_node( value );
    if( !new_node ) {
        return list;
    } else if( list ) {
        new_node->next = list->next;
        list->next = new_node;
    }
    return new_node;
}

列表的常用方法是使用虚拟头节点,您永远不会打印出来。它只包含一个node_t *head = insert_value( NULL, 3 ); node_t *tail = head; tail = insert_value( tail, 2 ); tail = insert_value( tail, 3 ); tail = insert_value( tail, 18 ); print_list( head ); 指针,它是列表的开头,您忽略该值。如果你这样做了,那么你也可以使用next函数在列表的第一个元素之前插入一个值。您还可以获得insert_value 始终管理整个列表的好处,您永远不必担心它会发生变化。