如果之前已經回答過這個問題,我感到非常抱歉。
運行此代碼后,我希望遍歷一個鏈表,然后為串列中的每個元素再次遍歷它。我很想知道我在這里做錯了什么。謝謝。
#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 |
uj5u.com熱心網友回復:
您需要重置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);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480148.html
