【发布时间】:2018-02-19 18:55:29
【问题描述】:
我正在尝试在 C 中实现最小堆。
// Heaps:
// node i -> 2i and 2i+1 children
// 2i//2 = i and 2i+1//2 = i same parents
#include <stdio.h>
#include <stdlib.h>
#define max 100
int heap[max];
int size = 0;
void heapifyUp(){ // last element
int i = size;
while(i){ //
int parent = i/2;
if (heap[parent]<heap[i]){
int t = heap[parent];
heap[parent] = heap[i];
heap[i]=t;
}
}
}
void heapifyDown(){ // top element
int i = 0;
while(i<=size){
int c1 = 2*i;
int c2 = 2*i + 1;
int t = 0;
if (heap[c1]>=heap[c2]){
t = c2;
}
else{
t = c1;
}
int temp = heap[i];
heap[i] = heap[t];
heap[t] = temp;
i = t;
}
}
void insert(int key){
size = size + 1;
heap[size] = key;
heapifyUp();
}
int returnMin(){
return heap[0];
}
int deleteMin(){
int t = heap[0];
heap[0] = heap[size];
size = size - 1;
heapifyDown();
return t;
}
void printHeap(){
int i = 0;
while(i<=size){
printf("%d",heap[i]);
i = i + 1;
}
}
int main(){
insert(10);
insert(20);
insert(11);
insert(7);
insert(18);
printHeap();
printf("%d",deleteMin());
insert(110);
insert(-7);
insert(15);
printf("%d",deleteMin());
}
问题是当我运行程序时,我没有得到任何输出,程序也没有终止。
我认为我已经正确地实现了逻辑。
使用 C 调试器很难,因为我在 Mac 上(不支持代码块,从来没有真正理解如何使用 gdb,我只是在文本编辑器上使用内置的 gcc 编译器),所以我被困在这个问题。
感谢您的帮助。
【问题讨论】:
-
如果你用 C 写这个,你为什么要标记 C++? Mac 也有自己的免费 IDE,称为 XCode(在其中调试应该很容易)——更不用说除了 CodeBlocks 之外还有很多其他选项
-
@UnholySheep 因为在这种情况下 c plus plus 的实现也是相同的......除了包含......和打印语法......没有 xcode 我在启动板中搜索它
-
如果您没有调试器,您可以随时在代码中使用
printf语句来告诉您发生了什么。当你进入“现实世界”时,你将不得不经常使用这种东西。 -
“从来没有真正理解过如何使用 gdb”——嗯,现在是学习的最佳时机。 SO 不能替代学习调试器。如果您在使用 gdb 时遇到问题,请随时提出相关问题。
标签: c algorithm data-structures heap