LinkedList:为什么需要声明一个新的结构节点当前?如果我使用参数头进行跟踪,代码工作得很好吗?

LinkedList: Why there is need to declare a new struct node current? The code works perfectly fine if I use the argument head for tracking?

int Count(struct node* head, int searchFor) {
    struct node* current = head;
    int count = 0;

    while (current != NULL) {
        if (current->data == searchFor)
            count++;

        current = current->next;
    }

    return count;
}

为什么需要声明当前结构节点?如果我们使用在参数列表中传递的 head,我们会得到相同的结果。

int Count(struct node* head, int searchFor) {
    int count = 0;

    while(head != NULL) {
        if (head->data == searchFor) {
            count ++;
        } 

        head = head->next;
    }

    return count;
}

这背后的概念是什么?这只是为了干净的代码还是其他原因?

当然是"same",他们"pointing"到开头相同的位置。

struct node* current = head;

但是在您将当前项目更改为下一个项目后,它们不再指向相同的项目。

current = current->next;

在这之后你的 current 不再和 head 一样了,如果你需要重新启动,你仍然可以在 head 指针中引用 head。

关键是你在阅读"head"时所期望的,你期望它指向head item,对吧?如果您更改它会使您的代码对最终维护它的其他程序员造成混淆。

如果您不再需要在此函数中使用 head,我建议将您的参数重命名为 current(但有一个指向 head 的指针总是好的在某个地方)。

int Count(struct node* current, int searchFor) {
    int count = 0;

    while(current != NULL) {
        if (current->data == searchFor) {
            count ++;
        } 

        current = current->next;
    }

    return count;
}

通常这样做是为了保留传递给函数的原始值 (head),因为 current 正在被修改,如果您修改 [=10],您将永久丢失原始指针=] 直接。但是在您的情况下,是否使用额外的临时 current 没有区别,因为 Count() 中不再需要 head

这真的是品味问题。我个人更喜欢使用带有 current 的版本,因为我觉得使用 "current" 比直接修改 "head" 更具可读性。

对于您展示的代码,这背后只有一个概念:使代码更具可读性。:)

当您看到头部发生变化时,您必须更加注意并确保代码正确。这比理解代码需要更多时间。:)

然而,第一个代码片段有一个缺点。变量 current 在不使用它的代码块中声明。我会按以下方式编写代码

int Count( const struct node* head, int searchFor ) 
{
    int count = 0;

    for  ( const struct node* current = head; current != NULL; current = current->next ) 
    {
        if ( current->data == searchFor ) count++;
    }

    return count;
}