为什么我可以在c中多次遍历我的链表

时间:2015-08-10 19:44:35

标签: c struct linked-list

我有一个链接列表,其中最后一个节点指向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?因此,我再也无法打印出这些元素,对吧?但是,每当我调用该函数时,情况并非如此;它总是回到第一个节点。这是为什么?我非常确定在调用函数后我从未将列表重定向回第一个节点。

2 个答案:

答案 0 :(得分:4)

函数的参数是其局部变量。那就是他们(他们的价值观)是争论的副本。所以在这个宣言中

void listEmployee(EMPLOYEE * list);

list是函数的本地varaibel。函数内参数的任何更改都不会影响函数调用的参数(及其值)。

你可以想象函数调用方式如下

EMPLOYEE * head;

//...

listEmployee( head );

//...

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

因此,在函数中,它的局部变量list将被更改。 head将保持不变,因为它未在函数中使用。

答案 1 :(得分:2)

list变量是指向节点的指针;并在遍历列表时更改此指针。所以,当你走到尽头时,list已不复存在了。

但是你改变的变量不是你作为函数参数传入的变量。当您调用该函数时,您传递的指针将被复制到新变量list中;它的副本会被更改,而不是原始副本。原文保持不变。

可能值得查看按值传递按引用传递之间的区别。这里,指针正在按值传递。它有点令人困惑,因为指针实际上是一个引用......但它是一个值正在传递的引用。