Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我可以在c中多次遍历链表_C_Struct_Linked List - Fatal编程技术网

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

为什么我可以在c中多次遍历链表,c,struct,linked-list,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 != NUL

我有一个链表,最后一个节点指向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
将被更改<代码>头将保持不变,因为它未在函数中使用。

列表变量是指向节点的指针;在遍历列表时更改此指针。因此,当你走到最后时,
list
不再是最重要的

但是您正在更改的变量不是作为参数传递给函数的变量。调用函数时,传递的指针被复制到新变量
列表中
;是这本书变了,不是原件。原版保持不变


可能值得查找“按值传递”和“按引用传递”之间的差异。这里,指针是按值传递的。这有点混乱,因为指针实际上是一个引用。。。但是它是一个正在传递其值的引用。

是的,应该是这样,因为您一直运行到列表的末尾。如果要再次遍历列表,则必须跟踪列表的标题位置,例如
head=list
,然后每次都从
head
开始。我不知道您所指的是
head
。如果您谈论的是
列表
,则在函数中为“是”,但在函数外为“否”。它不会对外部世界应用任何效果(如果代码的其余部分没有)。