指针 C 链表总是添加 NULL

Pointers C Linkedlist Adding Always NULL

我在 C 中编写了一个用于添加到单链表末尾的函数。但是我不明白的是为什么如果头元素为 NULL,为什么它在连续添加后继续保持为 NULL .

结构定义如下:

typedef struct node* node;

struct node {
    int data;
    node next;
}

我主要有这个:

node test = NULL;
add(test,1);
add(test,2);
add(test,3);

函数添加定义如下:

void add(node head, int newData) {
    node n = createNode(newData);
    if (head==NULL) {
        head = n;
        return;
    }
    else {
        node tmp = head;
        while (tmp->next != NULL) {
           tmp = tmp->next;
        }
        tmp = n;
    }
}

createNode 定义如下:

node createNode(int data) {
    node n = (node) malloc(sizeof(struct node));
    n->next = NULL;
    n->data = data;
    return n;
}

令我感到困惑的是,如果我首先初始化头部 (node test = createNode(1)),然后继续添加其余值,则添加函数可以正常工作。但是,如果我将测试节点保留为 NULL,它不会添加任何值吗?这里发生了什么?

按如下方式编写函数add

void add( node *head, int newData ) 
{
    node n = createNode( newData );

    while ( *head ) head = &( *head )->next;

    *head = n;
}

或者你甚至可以这样写

void add( node *head, int newData ) 
{
    while ( *head ) head = &( *head )->next;

    *head = createNode( newData );
}

并称其为

node test = NULL;

add( &test, 1 );
add( &test, 2 );
add( &test, 3 );

考虑到函数 createNode 必须在函数 add 之前声明,并且您在结构定义中漏掉了一个分号

struct node {
    int data;
    node next;
}
^^^

此外,对结构标记和指向相同结构的指针使用相同的标识符也不是一个好主意

typedef struct node* node;

至少写成这样会更好

typedef struct node* node_ptr;