我想在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 < 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;
}
}
這些都是編譯錯誤,我在此刻得到:
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
什麼是編譯錯誤? –
看起來您已經編寫了一個完整的程序,然後進行編譯並且不知所措。儘量養成寫一點代碼的習慣,並編譯它。將它與閱讀編譯器錯誤消息說的內容結合起來。您應該始終以* first *錯誤消息開頭,因爲這可能會導致其他錯誤消息的混淆。 – paddy
它有點混亂!你將在你的合併中流血內存,你的temp不需要分配內存,你只是用它來指向現有的內存。您沒有顯示「節點」的定義 –