通过链接列表对自身进行迭代未按预期工作
Iteration through a linked list against itself not working as expected
如果之前有人回答过,我很抱歉。
根据 运行 这段代码,我希望遍历一个链表,然后为列表中的每个元素再次遍历它。我很想知道我到底做错了什么。谢谢
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} node_t;
node_t * push_end(node_t * end, int data) {
end->next = (node_t *) malloc(sizeof(node_t));
end->next->data = data;
end->next->next = NULL;
return end->next;
}
int main() {
node_t * head = (node_t *) malloc(sizeof(node_t));
head->data = 0;
head->next = NULL;
node_t * end = head;
end = push_end(end, 1);
end = push_end(end, 2);
node_t *i_obj = head;
node_t *j_obj = head;
while(i_obj != NULL) {
while(j_obj != NULL) {
printf("%d, %d | ", i_obj->data, j_obj->data);
j_obj = j_obj->next;
}
i_obj = i_obj->next;
}
}
预期输出:
0, 0 | 0, 1 | 0, 2 | 1, 0 | 1, 1 | 1, 2 | 2, 0 | 2, 1 | 2, 2 |
实际输出:
0, 0 | 0, 1 | 0, 2 |
您需要重置 j_obj
以指向 i_obj
的每次迭代的头节点。就目前而言,j_obj
在第一次通过内循环完成时变为 NULL 并保持为 NULL,因此内循环永远不会执行第二次或第三次。
将代码的后半部分更改如下:
node_t *i_obj = head;
while(i_obj != NULL) {
node_t *j_obj = head;
while(j_obj != NULL) {
printf("%d, %d | ", i_obj->data, j_obj->data);
j_obj = j_obj->next;
}
i_obj = i_obj->next;
}
另一种可以说更清晰的写法是:
for (node_t *p = head; p; p = p->next) {
for (node_t *q = head; q; q = q->next) {
printf("%d, %d | ", p->data, q->data);
}
}
如果之前有人回答过,我很抱歉。
根据 运行 这段代码,我希望遍历一个链表,然后为列表中的每个元素再次遍历它。我很想知道我到底做错了什么。谢谢
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} node_t;
node_t * push_end(node_t * end, int data) {
end->next = (node_t *) malloc(sizeof(node_t));
end->next->data = data;
end->next->next = NULL;
return end->next;
}
int main() {
node_t * head = (node_t *) malloc(sizeof(node_t));
head->data = 0;
head->next = NULL;
node_t * end = head;
end = push_end(end, 1);
end = push_end(end, 2);
node_t *i_obj = head;
node_t *j_obj = head;
while(i_obj != NULL) {
while(j_obj != NULL) {
printf("%d, %d | ", i_obj->data, j_obj->data);
j_obj = j_obj->next;
}
i_obj = i_obj->next;
}
}
预期输出:
0, 0 | 0, 1 | 0, 2 | 1, 0 | 1, 1 | 1, 2 | 2, 0 | 2, 1 | 2, 2 |
实际输出:
0, 0 | 0, 1 | 0, 2 |
您需要重置 j_obj
以指向 i_obj
的每次迭代的头节点。就目前而言,j_obj
在第一次通过内循环完成时变为 NULL 并保持为 NULL,因此内循环永远不会执行第二次或第三次。
将代码的后半部分更改如下:
node_t *i_obj = head;
while(i_obj != NULL) {
node_t *j_obj = head;
while(j_obj != NULL) {
printf("%d, %d | ", i_obj->data, j_obj->data);
j_obj = j_obj->next;
}
i_obj = i_obj->next;
}
另一种可以说更清晰的写法是:
for (node_t *p = head; p; p = p->next) {
for (node_t *q = head; q; q = q->next) {
printf("%d, %d | ", p->data, q->data);
}
}