如何在函数调用上正确迭代链表

时间:2016-07-11 16:09:19

标签: c pointers linked-list singly-linked-list

考虑此链接列表定义:

typedef struct lligada{
    int value;
    struct lligada *prox;
}*LInt;

void newInteger(LInt l, int value){
    LInt p = l;
    LInt node = (LInt)malloc(sizeof(struct lligada));
    node->value = value;
    node->prox = NULL;
    while (p->prox) p = p->prox;
    p->prox = node; 
}

p辅助指针是否必要/良好实践?或者我可以直接遍历LInt l吗?

3 个答案:

答案 0 :(得分:0)

您不需要p;由于C按值传递参数,l仅包含原始参数值的副本,因此对l的更改在函数外部没有任何影响。请注意,这与更改l指向的内容不同,可以在函数外部产生影响,与更改p指向的内容有关。

答案 1 :(得分:0)

一般来说,函数是无效的,因为列表可以为空,在函数内部有更改的局部变量l,它将在退出函数后被销毁,因为函数参数是它的局部变量。因此,不会更改空列表。

同样不清楚为什么要尝试将新节点添加到单面列表的尾部。

在任何情况下,该功能都可以查找例如

void newInteger( LInt *l, int value )
{
    LInt node = malloc( sizeof( *LInt ) );

    if ( node != NULL )
    {
        node->value = value;
        node->prox = NULL;

        while ( *l != NULL ) l = &( *l )->prox;

        *l = node;
    }
}

答案 2 :(得分:0)

您可以遍历局部变量l。它已经是发送到函数的指针的副本(很可能是在堆栈上分配的)。更改它不会影响原始指针。

回答问题:

  • 没有必要。

  • 我无法看到它成为良好做法的原因。

PS - 也许你想要对该函数的空指针进行一些错误检查。