莱州刘德华 发表于 2023-10-4 18:52:08

链表问题

int main() {
        node head = {NULL,NULL};
        node* list = &head;

        add_behind(list, 2);
        add_behind(list, 3);
        add_behind(list, 1);
        add_behind(list, 4);
        list = list->next;         为什么这样就不对了呀,其他的地方是函数,这是一个链表
        printf("%d", middleElement(list));
        bool a = iscycle(list);
        node* ls2 = reverse(list);

        return 0;
}

isdkz 发表于 2023-10-4 18:52:18

这段代码中,list指向的是head节点,通过add_behind函数添加了4个节点,即链表中有4个节点。然后通过list = list->next; 将list指向了第二个节点,即值为2的节点。所以在调用middleElement函数时,返回的是链表中间节点的值,即3。

但是在调用iscycle和reverse函数时,传入的参数list已经不是指向head节点的指针了,而是指向值为2的节点的指针。所以这两个函数的结果是不正确的。

如果想要在调用完middleElement函数后,继续使用原链表,可以在调用middleElement函数前,先将list指向head节点,即list = &head;

莱州刘德华 发表于 2023-10-4 18:54:20

isdkz 发表于 2023-10-4 18:52
这段代码中,list指向的是head节点,通过add_behind函数添加了4个节点,即链表中有4个节点。然后通过list = ...

可是,运行完了以后,不是答案错误,是会报错的
但是不加那一会就是对的

Mike_python小 发表于 2023-10-4 19:02:56

莱州刘德华 发表于 2023-10-4 15:54
可是,运行完了以后,不是答案错误,是会报错的
但是不加那一会就是对的

这段代码中的问题在于链表节点的指针传递和修改。在调用`add_behind`函数时,我们并没有将新节点正确连接到链表中。导致在调用`middleElement`、`iscycle`和`reverse`函数时,参数list已经不是指向head节点的指针了。

修复方法如下:


int main() {
    node head = {NULL, NULL};
    node* list = &head;

    add_behind(list, 2);
    add_behind(list, 3);
    add_behind(list, 1);
    add_behind(list, 4);
    list = head.next;// 将list指向头节点的下一个节点
    printf("%d\n", middleElement(list));
    bool a = iscycle(&head);// 需要传入头节点的指针
    node* ls2 = reverse(&head);// 需要传入头节点的指针

    return 0;
}


在调用`middleElement`、`iscycle`和`reverse`函数时,传入的参数应该是头节点的指针`&head`,而不是链表中的某个节点的指针。

希望这次能够解决您的问题,如果还有其他疑问,请随时告诉我。
页: [1]
查看完整版本: 链表问题