使用和不使用下一个字段的链接列表遍历

时间:2016-02-10 08:36:26

标签: c linked-list nodes traversal

我在学习链接列表的同时编写了两个函数。首先计算并返回列表中的节点数。第二,在列表末尾添加新节点。你能帮我理解为什么我需要使用" 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;
}

2 个答案:

答案 0 :(得分:2)

在第二个功能中,您在将current->MEMBER更改为current->next后访问NULL,而在第一个功能中则不是。也就是说,在第一个中你只是运行结束,并以func doSomething(todo: (Void -> Void)) -> Void { todo() } var i: Int doSomething( { i = 3} ) print(i) 指针结束,但你没有使用它,所以没关系。在第二个中,你确实使用它。

答案 1 :(得分:0)

为了不弄乱您的原始链接列表,您将头部复制到当前,然后您可以使用当前节点执行所需操作。 链接列表生成如下:

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

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

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

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

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