如何在C中的while上下文中多次阅读链表



我尝试编写一段代码,在不调用void print(t_list *list)等特定函数的情况下读取链表几次,请参阅下面的代码。我可以理解为什么我的代码不能在while上下文中的链表中第二次读取,因为在我的第一个循环结束时,我的结构体t_listNULL,当我在结构体仍然是NULL的情况下开始第二个循环时,显然什么都不能用。

所以我有两个问题,

第一:为什么当我经过函数void print(t_list *list)时,我可以读取两次链表,这很好,因为这很有效,但我不明白为什么在第二次读取时,我的t_list不是NULL

第二:如何在whilefor上下文中,将我的指针t_list倒回到开头,再次读取链表。

#include <stdlib.h>
#include <stdio.h>
typedef struct s_list t_list;
struct s_list {
int arg;
t_list *next;
};

int add(t_list **ref, int arg) {
t_list *temp;
temp = NULL;
if(!(temp = (t_list*)malloc(sizeof(t_list))))
return (0);
temp->arg = arg;
temp->next = (*ref);
(*ref) = temp;
return(1);
}
void change(t_list *list) {
printf("change arg:n");
while(list) {
list->arg = 42;
list = list->next;
}
}
void print(t_list *list) {
printf("list:n");
while(list) {
printf("arg: %in",list->arg);
list = list->next;
}
}
int main() {
t_list *list;
list = NULL;
add(&list, 0);
add(&list, 1);
add(&list, 2);
print(list); // work fine
change(list);
print(list); // work fine it's possible te read a second time but why ?

// that's way don't work a second time
while(list) {
printf("arg: %in",list->arg);
list = list->next;
}
while(list) {
printf("arg: %in",list->arg);
list = list->next;
}
return (0);
}

控制台

➜  LINKED_LIST git:(master) ✗ clang linked_list.c && ./a.out
print list:
arg: 2
arg: 1
arg: 0
change arg:
print list:
arg: 42
arg: 42
arg: 42
while arg: 42
while arg: 42
while arg: 42

正如评论中所指出的,我认为您应该阅读有关C变量作用域的内容。

当您将list传递到print()方法中时,指针变量t_list* list的值将复制到print()方法的参数中。所以无论你做什么print方法的t_list* list都不会影响主方法的t_list* list。您可以通过在调用print()方法之前和之后检查list的值来确认这一点:

printf("%pn", list);
print(list); 
printf("%pn", list);
print(list); 
printf("%pn", list);

它们都应该打印相同的值,因为list在主函数的范围内没有改变:

0x17222e0
list:
arg: 2
arg: 1
arg: 0
0x17222e0
list:
arg: 2
arg: 1
arg: 0
0x17222e0
arg: 2
arg: 1
arg: 0

最新更新