为什么我可以在c中多次遍历链表
我有一个链表,最后一个节点指向NULL,还有一个函数通过while循环遍历链表来打印元素。我会上传我的源代码,但它相当长,所以我会简化它为什么我可以在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
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
。如果您谈论的是列表
,则在函数中为“是”,但在函数外为“否”。它不会对外部世界应用任何效果(如果代码的其余部分没有)。