【问题标题】:Modifying LinkedList Through A Function通过函数修改 LinkedList
【发布时间】:2018-05-26 05:13:45
【问题描述】:

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

这是我目前所拥有的:

 struct node *del_the_first(struct node *head)  {

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

 }

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

【问题讨论】:

  • 为了能够修改指针,您的函数必须接受指向指针的指针作为参数。在大多数情况下,让 head 全球化是有意义的。

标签: c linked-list


【解决方案1】:

你应该测试的是:

  • 在函数末尾打印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 关于如何消除此假设的答案。

【讨论】:

    【解决方案2】:

    您需要检查边界条件。假设您的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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      相关资源
      最近更新 更多