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