【问题标题】:How can you swap only the data of a heap Node如何只交换堆节点的数据
【发布时间】:2018-12-21 08:46:25
【问题描述】:

我目前正试图交换我的堆的数据,我知道你可以使用递归来交换二叉树堆中的最后一个和第一个节点,但我试图只从根中获取数据并将其交换最后一个节点中的数据实际上在做同样的事情,但我尝试过的一切都不起作用。

我知道 C 是参考语言传递,所以我尝试创建一个交换函数,该函数将双指针传递给每个节点,但如果我这样做,我将无法访问数据。

这是代码:

void swap(Node * one, Node * two){
    Node *temp = *one;
    **one->data = **two->data;
    **two->data = temp->data;
}

我也试过这个:

void swap(Node * one, Node * two){

    PData * pOne = malloc(sizeof(PData*));
    PData * pTwo = malloc(sizeof(PData*));  

    *pOne = *(PData*)one->data; 
    *pTwo = *(PData*)two->data;


    one->data = pTwo;
    two->data = pOne;
}

所以我想问题是,有没有其他方法可以在堆中交换数据,然后使用递归或 while 循环?

【问题讨论】:

  • 请在您的问题中包含Node 定义的源代码。还请提供一个示例,说明如何在您的代码中使用此 swap() 函数。

标签: c recursion heap pass-by-reference


【解决方案1】:

您不应该仅仅为了交换几个数据指针而分配节点。我假设您的 data 是一个空指针。如果是这样,那么这应该工作:

void swap(Node * one, Node * two){
    void* temp = one->data;
    one->data = two->data;
    two->data = temp;
}

【讨论】:

  • 谢谢你,没想到只是创建一个空临时指针。
【解决方案2】:

所以我在发布后很快就发现了我的错误。

void swap(Node * one, Node * two){

PData * pOne = malloc(sizeof(PData));
PData * pTwo = malloc(sizeof(PData));


*pOne = *(PData*)one->data; 
*pTwo = *(PData*)two->data;

one->data = pTwo;
two->data = pOne;
}

在原始问题的第二组代码中,我为指向 PData 的指针分配了空间,实际上并没有为结构本身分配足够的内存,所以我进入了我没有分配的内存。至少这就是我认为正在发生的事情:)

【讨论】:

  • 您正在泄漏内存。您需要在函数退出之前释放pOnepTwo。虽然,实际上,您不应该仅仅为了交换几个指针而分配内存。看我的回答。
猜你喜欢
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 2020-03-28
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多