C实现倾斜堆
我正在尝试在C中实现一个倾斜堆,但我的代码不能编译。 我不是那种经验丰富的C而且从来没有在C中创建任何类型的堆。这就是为什么我不知道如何修复它,我希望有人可以指出我正确的方向。 我一直在读关于倾斜堆的文章,这是我到目前为止使用我在网上找到的算法得到的。 提前致谢。
typedef struct node { int value; struct node * root; struct node * leftchild; struct node * rightchild; } Node; 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)); assert(n != 0); n->value = 0; n->leftchild = 0; n->rightchild = 0; line 185. s->root = skewHeapMerge(s->root, n); } void skewHeapRemoveFirst (struct skewHeap *sk) { struct node * n = sk->root; free(n); sk->root = skewHeapMerge(n->leftchild, n->rightchild); } line 196. struct node * skewHeapMerge(struct node *left, struct node *right) { struct node *temp = (struct node *) malloc(sizeof(struct node)); if (left == NULL) return *right; if (right == NULL) return *left; if (left->value 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; } }
这些是我目前得到的编辑错误:
program.c: In function 'skewHeapAdd': program.c:185: warning: implicit declaration of function 'skewHeapMerge' program.c:185: warning: assignment makes pointer from integer without a cast program.c: In function 'skewHeapRemoveFirst': program.c:191: warning: assignment makes pointer from integer without a cast program.c: At top level: program.c:196: error: conflicting types for 'skewHeapMerge' program.c:185: note: previous implicit declaration of 'skewHeapMerge' was here program.c: In function 'skewHeapMerge': program.c:202: error: incompatible types when returning type 'struct node' but 'struct node *' was expected program.c:205: error: incompatible types when returning type 'struct node' but 'struct node *' was expected
关于编译器错误,
program.c: In function 'skewHeapAdd': program.c:185: warning: implicit declaration of function 'skewHeapMerge' program.c:185: warning: assignment makes pointer from integer without a cast
告诉你没有skewHeapMerge
原型在范围内定义了skewHeapAdd
,因此(编译器显然在C89模式下运行,但幸运的是警告它),编译器假设一个隐式声明,返回类型为skewHeapMerge
。
添加包含所有函数原型的头文件,并在所有使用或定义这些函数的*.c
文件中添加#include
,以便编译器知道函数的类型。
program.c: In function 'skewHeapRemoveFirst': program.c:191: warning: assignment makes pointer from integer without a cast
应该是这条线
sk->root = skewHeapMerge(n->leftchild, n->rightchild);
其中sk->root
是一个struct node*
,但是由于skewHeapMerge
的隐式声明,假设返回一个int
。
program.c: At top level: program.c:196: error: conflicting types for 'skewHeapMerge' program.c:185: note: previous implicit declaration of 'skewHeapMerge' was here
在这里,编译器发现skewHeapMerge
的定义给出了与隐式声明中的类型冲突的类型。
program.c: In function 'skewHeapMerge': program.c:202: error: incompatible types when returning type 'struct node' but 'struct node *' was expected program.c:205: error: incompatible types when returning type 'struct node' but 'struct node *' was expected
这是为了线
if (left == NULL) return *right; if (right == NULL) return *left;
你应该在哪里返回 left
而不是*right
分别。 *left
(我先忽略了)。
你在skewHeapRemoveFirst
犯了一个错误
void skewHeapRemoveFirst (struct skewHeap *sk) { struct node * n = sk->root; free(n); sk->root = skewHeapMerge(n->leftchild, n->rightchild); }
你free
后使用n
地方。 你必须在该函数中交换最后两行。
并且在skewHeapMerge
struct node * skewHeapMerge(struct node *left, struct node *right) { struct node *temp = (struct node *) malloc(sizeof(struct node)); if (left == NULL) return *right; if (right == NULL) return *left;
你在泄露记忆。 删除分配,因为如果完全使用temp
则为其分配left->leftchild
或left->leftchild
。