i tried really hard to avoid posting this question but i cant seem to spot the problem
so here it is..
basically i want to print the highest number of 'search_counts' from a heap.
> there is an array of struct HEAP
> there is only 1 element in HEAP , it is DATA *dataPtr , basically it points to a struct DATA (which has been allocated memory dynamically)
> i have to delete the top most item from the heap ary and print it and then reheapDown to get it back to a heap form.
problem: it prints all but the last element correctly. for the last element it prints out garbage.
i have been through the debugger so many times but yet it failed.
here is the code
int j is the count of how many elements were inserted into the heap ary
int whatFn is basically a checker to see that if the number of elements inserted was less than the HEAP_SIZE which is 7 then use j otherwise use HEAP_SIZE for the restrictor
Code:
void printHeap1 (HEAP *ary, int j, int whatFn)
{
int i = 0;
HEAP *pWalker, *pCur, *pLast, dataOut;
pCur = ary;
printf("--- 7 Most popular searches ---\n");
if (whatFn == NOT_EQUAL)
{
pLast = &ary[j];
j--;
for (pWalker = pCur; pWalker < pLast; pWalker++)
{
if (deleteHeap (ary, &j, &dataOut) == 1)
printToScreen (&dataOut, "heap");
else
printf("Unable to delete node\n");
}
}
else
{
pLast = &ary[HEAP_SIZE -1];
j--;
for (pWalker = pCur; pWalker < pLast; pWalker++)
{
if (deleteHeap (ary, &j, &dataOut) == 1)
printToScreen (&dataOut, "heap");
else
printf("Unable to delete node\n");
}
}
return;
}
this goes to the delete heap function that is
Code:
int deleteHeap (HEAP *heap, int *last, HEAP *dataOut)
{
// int item;
if (*last < 0)
{
return 0;
}
dataOut->dataPtr = heap[0].dataPtr;
heap [0].dataPtr = heap [*last].dataPtr;
// heap[*last].dataPtr = NULL;
(*last)--;
reheapDown (heap, 0, *last);
return 1;
}
this later goes to the reheapDown function which is
Code:
void reheapDown (HEAP *heap, int root, int last)
{
DATA hold, leftKey, rightKey, largeChildKey;
int largeChildIndex = 0;
//int parent;
if ((root * 2 + 1) <= last)
{
leftKey = *(heap [root * 2 + 1].dataPtr);
if ((root * 2 + 2) <= last)
{
rightKey = *(heap [root * 2 + 2].dataPtr);
}
else
{
rightKey.search_count = -1;
}
if (leftKey.search_count > rightKey.search_count)
{
largeChildKey = leftKey;
largeChildIndex = root * 2 + 1;
}
else
{
largeChildKey = rightKey;
largeChildIndex = root * 2 + 2;
}
if (heap[root].dataPtr->search_count < heap [largeChildIndex].dataPtr->search_count)
{
hold = *(heap [root].dataPtr);
heap [root].dataPtr = heap [largeChildIndex].dataPtr;
heap [largeChildIndex].dataPtr = &hold;
reheapDown (heap, largeChildIndex, last);
}
}
return;
}
any form of help is appreciated. i just need someone to spot the error. i can fix the rest myself
thanks