Возникают проблемы при вставке «двойных» переменных в двоичную кучу - PullRequest
0 голосов
/ 06 января 2019

Вот как я создал мою двоичную кучу:

int *heapArray; // pointer to array of elements in heap
int capacity = 0; // maximum possible size of min heap
int heap_size; // Current number of elements in min heap
int d = 2;

int parent(int i)
{
    return (i/d);
}

void swap(double *x, double *y)
{
    double temp = *x;
    *x = *y;
    *y = temp;
}

double returnHeapValue(int key)
{
    return heapArray[key];
}

void initialize(int cap)
{
    heap_size = 0;
    capacity = cap;
    heapArray = (double*)malloc(cap*sizeof(double));
}

void insertJob(double x)
{
    if(capacity < 10)
    {
        capacity = 10;
        heapArray = (double*)realloc(heapArray,capacity*sizeof(double));
    }
    if(heap_size == capacity/2)
    {
        capacity += 10;
        heapArray = (double*)realloc(heapArray,capacity*sizeof(double));
    }

    heap_size = heap_size + 1;
    heapArray[heap_size] = x;
    maxHeapSwim(heap_size);
}

void maxHeapSwim(int k)
{
    while(k > 1 && heapArray[parent(k)] < heapArray[k] && k!=1)
    {
        swap(&heapArray[k],&heapArray[parent(k)]);
        k = parent(k);
    }
}

Это то, что я сделал в основном методе, чтобы вставить пачку пар, а затем распечатать их:

int main()
{

  // test
  initialize(20);

  insertJob(2.0);
  insertJob(3.0);
  insertJob(1.0);
  insertJob(6.0);
  insertJob(4.0);
  insertJob(14.0);
  insertJob(7.0);
  insertJob(9.0);
  insertJob(8.0);
  insertJob(11.0);

  printf("\n");
  printf("%f", returnHeapValue(1));
  printf("\n");
  printf("%f", returnHeapValue(2));
  printf("\n");
  printf("%f", returnHeapValue(3));
  printf("\n");
  printf("%f", returnHeapValue(4));
  printf("\n");
  printf("%f", returnHeapValue(5));
  printf("\n");
  printf("%f", returnHeapValue(6));
  printf("\n");
  printf("%f", returnHeapValue(7));
  printf("\n");
  printf("%f", returnHeapValue(8));
  printf("\n");
  printf("%f", returnHeapValue(9));
  printf("\n");
  printf("%f", returnHeapValue(10));
  printf("\n");

  return 0;
}

Однако вот как выглядит результат:

0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000

Почему числа не печатаются правильно? Я что-то не так делаю? Когда я проверяю это со значениями Integer, то все работает нормально. Но это не работает, когда я пытаюсь вставить значения типа данных "double".

EDIT:

Я также попытался изменить тип heapArray с int на double, как показано ниже:

double *heapArray;

К сожалению, это привело к ошибке в другой функции, которую я создал:

double delMaxPriorityJob() //This function deletes the largest value (in the root)
{
    double max = heapArray[1];
    swap(&heapArray[1],&heapArray[heap_size]);
    heap_size = heap_size - 1;
    maxHeapSink(1);
    heapArray[heap_size + 1] = NULL; //The error is in this line
    return max;
}

Ошибка говорит:

"Несовместимые типы при назначении типу 'double' из типа 'void *'"

1 Ответ

0 голосов
/ 07 января 2019

Я исправил это. Дело в том, что я пытаюсь запустить функцию main () из другого класса. Причина, по которой это не сработало раньше, заключается в том, что я неправильно указал функции в заголовочном файле двоичной кучи. Вот как теперь выглядит заголовочный файл:

extern void initialize(int cap);
extern void resetHeap();
extern int count_heap_elements();
extern int returnHeapCapacity();
extern double returnHeapValue(int key);
extern void insertJob(double x);
extern void insertEvent(double x);
extern double delMaxPriorityJob();
extern double delMaxPriorityEvent();
extern void maxHeapSink(int k);
extern void maxHeapSwim(int k);
extern void minHeapSwim(int k);
extern void minHeapSink(int k);

Теперь, когда я запускаю эту функцию main () из другого класса, я получаю правильные выходные данные.

...