C 插入到偏序树中

C 插入到偏序树中,c,arrays,tree,C,Arrays,Tree,我试图在偏序树中插入一个元素,但当我试图显示作为数组实现的树时,它不会显示元素 这里是堆结构。我只是把它简单化了 typedef struct{ int Elem[SIZE]; int last; }Heap; 这是我为我的插入所做的 void insertHeap(Heap *HH, int given) { int parent, child, temp; if(HH->last < SIZE){ HH->Elem[HH-

我试图在偏序树中插入一个元素,但当我试图显示作为数组实现的树时,它不会显示元素

这里是堆结构。我只是把它简单化了

typedef struct{
    int Elem[SIZE];
    int last;
}Heap;
这是我为我的插入所做的

void insertHeap(Heap *HH, int given)
{
    int parent, child, temp;

    if(HH->last < SIZE){
        HH->Elem[HH->last] = given;
        parent = (HH->last - 1) / 2;
        for(child = HH->last ; child >= 0 && HH->Elem[child] <= HH->Elem[parent] ;  child = parent, parent = parent - 1 / 2 ){
            temp = HH->Elem[parent];
            HH->Elem[parent] = HH->Elem[child];
            HH->Elem[child] = temp;
        }
        HH->last++;
    }
}
void insertHeap(堆*HH,给定int)
{
int父、子、临时;
如果(HH->last<大小){
HH->Elem[HH->last]=给定值;
父项=(HH->last-1)/2;
对于(child=HH->last;child>=0&&HH->Elem[child]Elem[parent];child=parent,parent=parent-1/2){
temp=HH->Elem[parent];
HH->Elem[parent]=HH->Elem[child];
HH->Elem[child]=临时;
}
HH->last++;
}
}

我刚刚更改了for循环的第一个条件语句
child>0
您的代码进入无限循环。你应该解决两件事:

  • 在循环控制的
    更新部分中计算新父对象时,应在
    (父对象-1)
    周围加括号
  • 您的条件
    parent>=0
    将始终为真,因为即使对于
    parent==0
    (parent-1)/2
    也将产生0,因为根据C的整数除法规则
    -1/2
    为零
因此:


要不要上传你的
结构定义?我不知道你还有什么问题,但是C中的整数除法并不像你想象的那样有效<整数算术中的code>1/2
是零。@MichałSzydłowski刚刚上传了结构。
parent-1/2
应该是
(parent-1)/2
。你需要一个更好的条件来停止循环,可能是
child>0
,因为项0没有父项。@Oehm谢谢,但我没有听到你的第一句话。我没有那种说法。
void insertHeap(Heap *HH, int given)
{
    int parent, child, temp;

    if(HH->last < SIZE){
        HH->Elem[HH->last] = given;
        parent = (HH->last - 1) / 2;
        for (child = HH->last; 
             child > 0 && HH->Elem[child] <= HH->Elem[parent];
             child = parent, parent = (parent - 1) / 2)
        {
            temp = HH->Elem[parent];
            HH->Elem[parent] = HH->Elem[child];
            HH->Elem[child] = temp;
        }
        HH->last++;
    }
}
void insertHeap(Heap *HH, int given)
{    
    if(HH->last < SIZE){        
        int parent = (HH->last - 1) / 2;
        int child = HH->last;

        HH->Elem[HH->last] = given;

        while (child > 0 && HH->Elem[child] <= HH->Elem[parent]) {
            int temp = HH->Elem[parent];

            HH->Elem[parent] = HH->Elem[child];
            HH->Elem[child] = temp;

            child = parent;
            parent = (parent - 1) / 2;
        }

        HH->last++;
    }
}