我正在编写这段代码,用于在链表末尾添加元素:
struct node{
int info;
struct node* link;
};
void append ( struct node **q, int num )
{
struct node *temp, *r ;
if ( *q == NULL ) // if the list is empty, create first node
{
temp = (struct node*) malloc ( sizeof ( struct node ) ) ;
temp -> info = num ;
temp -> link = NULL ;
*q = temp ;
}
else{
temp = *q ;
/* go to last node */
while ( temp -> link != NULL )
temp = temp -> link ;
/* add node at the end */
r = (struct node *)malloc ( sizeof ( struct node ) ) ;
r -> info = num ;
r -> link = NULL ;
temp -> link = r ;
}
}
我像这样调用附加函数: append(&list, 10);
其中list
是指向链表的指针
这段代码有效,但是如果我在追加函数中使用单个指针(使用 *q 而不是 **q)并相应地进行更改(如下所述以及我调用它时),它不起作用。下面的代码有什么问题?
void append ( struct node *q, int num )
{
struct node *temp, *r ;
if ( q == NULL ) // if the list is empty, create first node
{
temp = (struct node*) malloc ( sizeof ( struct node ) ) ;
temp -> info = num ;
temp -> link = NULL ;
q = temp ;
}
else{
temp = q ;
/* go to last node */
while ( temp -> link != NULL )
temp = temp -> link ;
/* add node at the end */
r = (struct node *)malloc ( sizeof ( struct node ) ) ;
r -> info = num ;
r -> link = NULL ;
temp -> link = r ;
}
}
因为在第二个示例中,q
是调用方传入的指针的副本。 调用方的原始指针永远不会被修改。
在你的第一个片段中(这是正确的),你做得太多了。
void append ( struct node **q, int num )
{
struct node *new ;
/* go to last node */
for ( ; *q; q = &(*q)->link ) {;}
/* add node at the end */
new = malloc ( sizeof *new );
if (!new) { barf_now(); return; }
new->info = num ;
new->link = NULL ;
*q = new; ;
}
}
基本思想是:你想要附加到列表的尾部;你需要:
- 查找第一个 NULL 指针
- 将其值设置为新指针的值
"空列表"的情况并不特殊,它只是意味着您可以在零步中找到 NULL 指针。以这种方式编码没有特殊情况,也不需要if (...) ... else ...
结构。