のような特定の関数を呼び出さずに、リンクされたリストを数回読み取るコードを作成しようとしましたvoid print(t_list *list)
。以下のコードを参照してください。while コンテキストでリンクされたリストを 2 回目にコードを読み取れない理由を理解できます。これは、最初のループの最後で構造体t_list
がNULL
であり、構造体が静止している間に 2 番目のループを開始するNULL
と明らかに何も使用できないためです。
そこで、質問が2つあるのですが、
void print(t_list *list)
最初 : 関数を渡すと、リンクされたリストを 2 回読み取ることができるのt_list
はなぜですか。NULL
second : while
orfor
コンテキストで、ポインター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: %i\n",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: %i\n",list->arg);
list = list->next;
}
while(list) {
printf("arg: %i\n",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