我已经在C中编写了一个添加到单链表末尾的函数。但我不明白为什么如果head元素为NULL,为什么在连续添加后它仍然保持为NULL。
结构体定义如下:
typedef struct node* node;
struct node {
int data;
node next;
}
总的来说,我有这个:
node test = NULL;
add(test,1);
add(test,2);
add(test,3);
函数add的定义如下:
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;
}
我感到困惑的是,如果我首先初始化head(node-test=createNode(1((,然后继续添加其余的值,那么add函数就可以正常工作。但是如果我让测试节点为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;