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

使用倾斜堆保存C中的结构,c,struct,heap,skew,C,Struct,Heap,Skew,可能重复: 我有以下结构: typedef struct Task_t { float length; int value; } task_t; 我试图使用一个倾斜堆来保存一堆使用“value”的结构。因此,具有最低“值”的结构将是根。我的倾斜堆实现如下所示: typedef struct node { int value; struct node * root; struct node * leftchild; struct node * rightchild; } Node;

可能重复:

我有以下结构:

typedef struct Task_t {
   float length;
   int value;
} task_t;
我试图使用一个倾斜堆来保存一堆使用“value”的结构。因此,具有最低“值”的结构将是根。我的倾斜堆实现如下所示:

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;
    }
}
typedef结构节点
{
int值;
结构节点*根;
结构节点*leftchild;
结构节点*rightchild;
}节点;
typedef节点*skewHeap;
结构倾斜堆
{
结构节点*根;
};
void skewHeapInit(结构skewHeap*sk)
{
sk->root=0;
}
void skewHeapAdd(结构skewHeap*sk)
{
结构节点*n=(结构节点*)malloc(sizeof(结构节点));
结构节点*s;
断言(n!=0);
n->value=0;
n->leftchild=0;
n->rightchild=0;
s->root=skewHeapMerge(s->root,n);
}
void skewHeapRemoveFirst(结构skewHeap*sk)
{
结构节点*n=sk->root;
sk->root=skewHeapMerge(n->leftchild,n->righchild);
自由(n);
}
结构节点*skewHeapMerge(结构节点*左,结构节点*右)
{
结构节点*temp;
if(left==NULL)
返还权;
if(right==NULL)
左转;
如果(左->值<右->值)
{
temp=左->左子对象;
left->leftchild=skewHeapMerge(left->righchild,right);
左->右子女=临时;
左转;
}
其他的
{
temp=右->右子对象;
right->rightchild=skewHeapMerge(right->leftchild,left);
右->左子女=临时;
返还权;
}
}

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

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

例如


老实说,您可以只存储
Task\u t Task
而不是使用指针,因为它只包含int和float,所以复制它不是很昂贵,但更一般地说,您应该使用指向任务的指针。在您的情况下,由于每个节点中都有显式的根指针,因此存储实际的结构而不是指向结构的指针也会浪费更多的内存。我强烈建议不管怎样都不要这样做(这是不雅观的,也是完全不必要的),但这需要重写相当多的代码。

与其直接在堆中的每个节点中存储
值,不如存储一个指向任务的指针。插入方法应采用指向要添加的任务的指针。它将需要为节点中的任务分配内存,然后在中复制相关数据。您将需要在删除方法中释放此项

例如


老实说,您可以只存储
Task\u t Task
而不是使用指针,因为它只包含int和float,所以复制它不是很昂贵,但更一般地说,您应该使用指向任务的指针。在您的情况下,由于每个节点中都有显式的根指针,因此存储实际的结构而不是指向结构的指针也会浪费更多的内存。无论如何,我强烈建议您不要这样做(这是不雅的,也是完全不必要的),但这需要重新编写您的代码。

感谢您的快速响应和清晰解释。感谢您的快速响应和清晰解释。
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);