【问题标题】:Linked list traversing with and without the next field有和没有下一个字段的链表遍历
【发布时间】:2016-05-20 12:15:40
【问题描述】:

我在学习链表的时候写了两个函数。首先计算并返回列表中的节点数。第二个在列表末尾添加新节点。你能帮我理解为什么我需要使用“current->next”在addatend函数下面的代码中检查NULL吗?我不必将它用于第一个功能。没有它,我的 exe 会因指针错误而崩溃...

非常感谢您的时间和帮助。

int length(node * head) {
    node * current = head;
    int count = 0;

    while(current != NULL){  // This line works as expected....
        count ++;
        current = current->next;
    }
    return count;
}

void addatend (node * head, int value){
    node * newnode = (struct node *) malloc(sizeof(struct node));
    node * current = head;

    while (current != NULL){   // This line would not work?? If I use current->next != NULL it works.....
        current = current->next;
    }
    current->next = newnode;
    newnode->data = value;
    newnode->next = NULL;
}

【问题讨论】:

    标签: c linked-list nodes traversal


    【解决方案1】:

    在将current->MEMBER 更改为current->next 后,您正在访问第二个函数,而在第一个函数中您不是。也就是说,在第一个中,您只是运行到结束,并以 NULL 指针结束,但您不使用它,所以没关系。在第二个中,您确实使用它。

    【讨论】:

    • 您好,感谢您的及时回复。对不起,我没有关注。当您说访问成员时,您指的是 3 个赋值语句吗?即使在第二个函数中,我也没有访问成员,直到我到达末尾并退出 while 循环。我想知道为什么我不能以相同的方式到达最后一个元素,然后分配所需的任何值...请原谅我的缓慢学习!
    • 当你“走到尽头”时,你不能再使用current,因为现在它是NULL。在第一个函数中是可以的,因为你不使用它。在第二个您需要使用它时,您必须将更改更改为测试current->next 而不是current
    • 啊!明白了!非常感谢。
    【解决方案2】:

    为了不弄乱您的原始链表,您将头复制到当前节点,然后您可以对当前节点执行您想要的操作。 链表的生成方式如下:

    typedef struct e
    {
       int data;
       struct e *next;
    } node;
    

    这意味着每个节点(在我的示例中)都有一个整数类型的数据和一个指向下一个节点的指针。假设我们的列表有 4 个对象:

     1->2->3->4->NULL
    

    第一个节点 (data=1) 指向它的下一个节点 (data=2) 依此类推,直到最后一个节点 (data=4) 下一个节点不存在,因此将指向 NULL。

    在函数“addatend”中,为了将新节点添加到链接列表的末尾,您应该遍历列表的最后一个元素(在我的示例中为 data=4),它旁边的节点将指向该元素为NULL,所以你应该遍历列表直到最后,当你到达那里时,你可以添加“newnode”。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 2020-06-09
      • 2014-08-08
      • 2020-11-27
      • 1970-01-01
      • 2015-09-24
      相关资源
      最近更新 更多