链接列表在开头打印额外的0

rur*_*tle 2 c malloc pointers linked-list singly-linked-list

我有一个非常基本的单链表实现.然而,我的实现的问题是它在列表的开头打印了额外的零,而我没有为这个额外的节点显式分配任何存储.代码如下 -

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define LEN 7

/* List node data structure */
typedef struct _ll_node_ {
    int data;
    struct _ll_node_ *next;
} node;

/*
 * @brief   Utility to print the state of the list
 */
void print_list(node *head)
{
    int i = 0;
    node *tmp = head;
    while (tmp)
    {
        printf("Node:\t%d,\tValue:\t%d\n", ++i, tmp->data);
        tmp = tmp->next;
    }
    printf("\n");
}

/*
 * @brief   Utility to add nodes to the list
 */
node *add_node(node *head, int data)
{
    node *tmp;
    if (head == NULL)
    {
        head = malloc(sizeof(node));
        assert(head != NULL);
        head->data = data;
        head->next = NULL;
    }
    else
    {
        tmp = head;
        while (tmp->next)
            tmp = tmp->next;
        tmp->next = malloc(sizeof(node));
        assert(tmp->next != NULL);
        tmp = tmp->next;
        tmp->data = data;
        tmp->next = NULL;
    }
    return head;
}

/*
 * @brief   Driver function
 */
int main(int argc, char *argv[])
{
    node *head = NULL;
    int i = 0;
    /* Allocate memory */
    head = malloc(LEN * sizeof(node));
    assert(head != NULL);
    /* Populate the list */
    for (; i < LEN; i++)
        head = add_node(head, rand() % 1000);
    /* Print its state */
    print_list(head);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮我弄清楚我做错了吗?

System information:
    Distributor ID: Ubuntu
    Description:    Ubuntu 14.04.3 LTS
    Release:        14.04
    Codename:       trusty
Run Code Online (Sandbox Code Playgroud)

Pri*_*oel 6

您已经在main中分配内存,因此第一个节点永远不会分配数据,因此默认情况下它将为0.尝试这样:

int main(int argc, char *argv[])
{
    node *head = NULL;
    int i = 0;

    /* Populate the list */
    for (; i < LEN; i++)
        head = add_node(head, rand() % 1000);
    /* Print its state */
    print_list(head);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @rurtle:谢谢你接受Vlad的回答.我很开心至少你做到了. (2认同)