通过链接列表对自身进行迭代未按预期工作

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);
    }
}