我已经编写了一个函数,用于添加到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,它不会添加任何值?这里发生了什么?
答案 0 :(得分:2)
以下列方式编写函数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;
}
^^^
对于struture标签和指向同一结构的指针使用相同的标识符也不是一个好主意
typedef struct node* node;
至少写一些像
这样的东西会更好typedef struct node* node_ptr;