对于我的程序,我需要创建一个接受链表作为参数的函数,然后从列表中删除第一个节点。还有其他步骤,但我想首先完成这个子部分。
这是我到目前为止所做的:
struct node *del_the_first(struct node *head) {
struct node *temp = head;
head = head->next;
temp->next = NULL;
return NULL;
}
我相信我的解决方案是正确的,但此时我无法对其进行测试。我更感兴趣的是我为什么或者没有错。
答案 0 :(得分:0)
你应该测试的是:
temp
的值,head
在函数开头的内容head
的值,你会注意到在你的函数之外,指向列表头部的指针仍然指向第一个元素的位置。
你不想那样,是吗?指向列表头部的变量应该指向列表的第二个元素,不是吗?
如果满足以上条件,您可能希望在从函数返回之前对列表的前第一个元素使用free()
。
阅读本文以获取有关如何解决第一个问题的更多信息:
Parameter Passing in C - Pointers, Addresses, Aliases
基本上,您需要将指针的新值返回到列表的头部:
struct node *del_the_first(struct node *head)
{
struct node *temp = head;
head = head->next;
temp->next = NULL; /* not really needed */
free(temp);
return head;
}
然后称之为:
global_head = del_the_first(global_head);
请注意,此代码假定列表不为空,
请参阅ccpan关于如何消除此假设的答案。
答案 1 :(得分:0)
您需要检查边界条件。假设您的linkedList为空,那么在运行时,您将收到分段错误。因此,在尝试访问下一个节点之前,您需要检查头指针是否为NULL。
另外,我不知道你为什么要返回NULL。您很可能想要返回新的头节点指针。
struct node *del_the_first(struct node *head) {
if (head != NULL) {
struct node *temp = head;
head = head->next;
free(temp);
temp = NULL;
}
return head;
}