使用倾斜堆来保存C中的结构

时间:2012-11-13 02:44:55

标签: c struct heap skew

  

可能重复:
  C implementation of skew heap

我有以下结构:

typedef struct Task_t {
   float length;
   int value;
} task_t;

我正在尝试使用倾斜堆来使用'value'来保存这些结构。所以具有最低“值”的结构将是根。我的skew堆实现如下:

typedef struct node
{
int value;
struct node * root;
struct node * leftchild;
struct node * rightchild;
} Node;

typedef Node * skewHeap;

struct skewHeap
{
    struct node * root;
};
void skewHeapInit (struct skewHeap *sk)
{
    sk->root = 0;
}
void skewHeapAdd (struct skewHeap *sk)
{
    struct node *n = (struct node *) malloc(sizeof(struct node));
    struct node *s;
    assert(n != 0);
    n->value = 0;
    n->leftchild = 0;
    n->rightchild = 0;
    s->root = skewHeapMerge(s->root,n);
}

void skewHeapRemoveFirst (struct skewHeap *sk)
{
    struct node * n = sk->root;
    sk->root = skewHeapMerge(n->leftchild, n->rightchild);
    free(n);

}

struct node * skewHeapMerge(struct node *left, struct node *right)
{

    struct node *temp;

    if (left == NULL)
        return right;

    if (right == NULL)
        return left;

    if (left->value < right->value)
    {
        temp = left->leftchild;
        left->leftchild = skewHeapMerge(left->rightchild, right);
        left->rightchild = temp;
        return left;
     }
     else
     {
        temp = right->rightchild;
                right->rightchild = skewHeapMerge(right->leftchild, left);
        right->leftchild = temp;
        return right;
    }
}

我的问题是我不知道如何正确插入和删除此倾斜堆中的结构。提前谢谢。

1 个答案:

答案 0 :(得分:1)

不是将value直接存储在堆中的每个节点中,而是存储指向任务的指针。您的插入方法应该指向您要添加的任务。它需要为节点中的任务分配内存,然后复制相关数据。您需要在删除方法中释放它。

E.g。

typedef struct node
{
    Task_t *task;
    struct node *root;
    struct node *left;
    struct node *right;
} Node;

// your add should have passed in a value, because the only thing your code adds to the heap is zeros
void skewHeapAdd (struct skewHeap *sk, Task_t *task);

老实说,你可以只存储Task_t task;而不是使用指针,因为它只包含一个int和一个浮点数,因此复制它并不是很昂贵,但更常见的是你应该使用一个指向任务的指针。在您的情况下,由于每个节点中都有一个显式的根指针,因此通过存储实际的结构而不是指向结构的指针,您也会浪费更多的内存。我强烈建议摆脱它(无论是不优雅还是完全没必要),但这需要重写你的代码。