【问题标题】:How to correctly iterate over linked list on function call如何在函数调用中正确迭代链表
【发布时间】:2016-07-11 16:09:18
【问题描述】:

考虑这个链表定义:

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 吗?

【问题讨论】:

  • 假设您出于某种原因实际上还没有尝试过,是的,您可以使用l 进行迭代。无关:Avoid hiding pointer types in type aliases。这样做实际上只有两个具体的原因(1)函数指针回调类型,以及(2)不透明的库句柄类型,都不在这里看起来很合适。如果涉及到一个指针,C 程序员想要看到星号;相信我。

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


【解决方案1】:

你不需要p;由于 C 按值传递参数,l 仅包含原始参数值的副本,因此对 l 的更改在函数外部无效。请注意,这与更改 l 指向的内容不同,后者可以在函数之外产生影响,就像更改 p 指向的内容一样。

【讨论】:

    【解决方案2】:

    一般来说,函数是无效的,因为列表可以是空的,并且函数内部有更改的局部变量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;
        }
    }
    

    【讨论】:

    • “局部变量 l 发生了变化” - where 在 OP 的发布代码中分配了 l ?据我们所知,OP 使用的是前哨(我不会,看起来也不像你会的,但也许他们是)。
    • @WhozCraig 它使用变量 p 间接尝试此操作。但无论如何,这种方法是错误的。
    • @VladfromMoscow 我在while ( *l != NULL ) l = &( *l )->prox; 遇到分段错误
    • 我的主:int i; LInt l; LInt *p = &l; for(i = 2; i < 10; i++) newInteger(p,i);
    • @JohnBauer 您需要将 LInt l 初始化为 NULL。例如 LInt l = NULL;
    【解决方案3】:

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

    回答问题:

    • 没必要。

    • 我看不出它是好的做法的理由。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-12
      • 2012-07-05
      • 2021-01-17
      • 1970-01-01
      • 2019-09-05
      • 2020-04-03
      • 2021-04-16
      相关资源
      最近更新 更多