我有一个链表,最后一个节点指向 NULL,还有一个函数通过在 while 循环中遍历列表来打印元素。我会上传我的源代码,但它很长,所以我会简化它。

struct xrec{
    *some elements*
    struct xrec *next;
};
typedef struct xrec EMPLOYEE;

void listEmployee(EMPLOYEE * list){ // list is head node
int i = 0;

    while (list != NULL){
        printf(*%d. print elements..*, i+1);
        list = list->next; // point to next structure
        i++;
    }
}

我可以根据需要多次调用该函数,因为我将它设置在 do-while 循环中的 switch 语句中。但是在第一次调用之后,我的头节点不会指向 NULL 吗?因此,我永远无法再次打印出这些元素,对吗?但每当我调用该函数时,情况并非如此;它总是回到第一个节点。这是为什么?我非常确定在调用该函数后我永远不会将列表重定向回第一个节点。

最佳答案

函数的参数是它的局部变量。也就是说,它们(它们的值)是参数的副本。所以在这个声明中

void listEmployee(EMPLOYEE * list);

list 是函数的局部变量。函数内参数的任何更改都不会影响函数调用的参数(及其值)。

你可以想象函数调用如下
EMPLOYEE * head;

//...

listEmployee( head );

//...

void listEmployee( /* EMPLOYEE * list */ )
{
   EMPLOYEE * list = head;
   //...

所以在函数内,它的局部变量 list 将被改变。 head 将保持不变,因为它没有在函数中使用。

关于c - 为什么我可以在c中多次遍历我的链表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31927853/

10-11 19:01