通过函数修改LinkedList

时间:2018-05-26 05:13:45

标签: c linked-list

对于我的程序,我需要创建一个接受链表作为参数的函数,然后从列表中删除第一个节点。还有其他步骤,但我想首先完成这个子部分。

这是我到目前为止所做的:

 struct node *del_the_first(struct node *head)  {

 struct node *temp = head;
 head = head->next;
 temp->next = NULL;
 return NULL;

 }

我相信我的解决方案是正确的,但此时我无法对其进行测试。我更感兴趣的是我为什么或者没有错。

2 个答案:

答案 0 :(得分:0)

你应该测试的是:

  • 在函数末尾打印temp的值,
    这是head在函数开头的内容
  • 在函数末尾打印head的值,
    返回函数后,列表的头部应该是什么
  • 打印(来自函数外部,例如来自main)变量
    的值 这应该指向列表的头部,
    特别是删除第一个元素后

你会注意到在你的函数之外,指向列表头部的指针仍然指向第一个元素的位置。
你不想那样,是吗?指向列表头部的变量应该指向列表的第二个元素,不是吗?

如果满足以上条件,您可能希望在从函数返回之前对列表的前第一个元素使用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;
}