【问题标题】:Double linked list, functions pointer does not return by value in C?双链表,函数指针在C中不按值返回?
【发布时间】:2023-02-10 01:00:06
【问题描述】:

下面的函数(在 c 中)用于删除双链表的部分内容 (双链表 = 来回指向的列表)。 从链接列表的中间(此函数的底部)删除按预期工作(我不必返回新列表,因为函数终止时列表会自动更新)

但是,当从列表的开头或列表的结尾(此函数的顶部和中间部分)删除时,此函数要求我返回新的...这让我感到困惑,因为通过指针传递函数是按值传递因此应该'传递的列表(在此函数中命名为 new)自动更新

(如果需要其他先前的代码来回答让我知道我只是想查明让我感到困惑的区域)

node* delete(int x, node* new)
{
    node *del = new;
    for(int i = 0; i < x; i++)
    {
        del = del -> next;
    }

    // MEANING ITS THE FIRST ELEMENT OF THE LIST
    if (del -> before == NULL)
    {
    
        // WE WANT TO MAKE DEL POINT TO DEL -> NEXT
        // THEN WE WANT TO SET A POINTER TO DEL -> BEFORE 
        // THEN WE WANT TO SET DEL -> BEFORE TO NULL 
        // THEN WE WANT TO FREE THE NEW VARIABLE

        del = del -> next;
        node *rem = del -> before;
        del -> before = NULL;
        new = del;
        free(rem);
        return new;
    
    } 

    // MEANING ITS THE LAST ELEMENT OF THE LIST
    else if (del -> next == NULL)
    {
        // WE WANT TO SET DEL TO DEL -> BEFORE 
        // THEN WE WANT TO MAKE A NODE POINRING TO DEL -> NEXT
        // THEN WE WANT TO MAKE DEL -> NEXT NULL
        // THEN WE WANT TO FREE THE CREATED NODE 

        del = del -> before;
        node* rem = del -> next;
        del -> next = NULL;
        free(rem);
        return new;
    }

    // MEANING THE MIDDLE OF THE LIST
    else
    {
        del -> before -> next = del -> before -> next -> next;
        del -> next -> before = del -> next -> before -> before;
        free(del);
        return new;
    }

}

问题未解决?

【问题讨论】:

  • 即使在函数的最开始,这段代码 for(int i = 0; i < x; i++) { del = del -> next; } 可以调用未定义的行为。
  • 该功能应该完全重写。例如这段代码 sn-p del = del -> next;节点 *rem = del -> 之前; del -> 之前 = NULL;也可以调用未定义的行为。那就是这个函数充满了错误。
  • x 是列表中需要删除的第 x 个元素……是的,新的是列表……这个函数有效,但只能通过返回新的
  • 为什么那辆 sn-p 越野车?我正在设置 del -> next 因为我想保留下一部分并且我将一个新变量 *rem 设置为之前的位因为我希望能够在我设置 new = del 之后释放它因为我在 main 中使用了 malloc
  • del->next 可以是空指针。所以下一个表达式 del->before 调用未定义的行为。

标签: c


【解决方案1】:

您需要添加一些检查 :) 并简化代码

node* delete(size_t x, node* head)
{
    node *del = head;

    for(size_t i = 0; del && i < x; i++)
    {
        del = del -> next;
    }

    if(del)
    {
        if (del -> before == NULL)
        {
            head = del -> next;
        } 

        else if (del -> next == NULL)
        {
            del -> before -> next = NULL;
        }
        else
        {
            del -> before -> next = del -> next;
            del -> next -> before = del -> before;
        }
        free(del);
    }
    return head;
}

【讨论】:

  • 任何评论无声 DV 之三?
  • 这段代码 sn-p if (del -> before == NULL) { head = del -> next; } 包含一个错误。
猜你喜欢
  • 2011-01-29
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
相关资源
最近更新 更多