我尝试编写一段代码,在不调用void print(t_list *list)
等特定函数的情况下读取链表几次,请参阅下面的代码。我可以理解为什么我的代码不能在while上下文中的链表中第二次读取,因为在我的第一个循环结束时,我的结构体t_list
是NULL
,当我在结构体仍然是NULL
的情况下开始第二个循环时,显然什么都不能用。
所以我有两个问题,
第一:为什么当我经过函数void print(t_list *list)
时,我可以读取两次链表,这很好,因为这很有效,但我不明白为什么在第二次读取时,我的t_list
不是NULL
第二:如何在while
或for
上下文中,将我的指针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