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
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
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
Huh? You're delusional calling the Steam Deck dead. It is so successful that it has sold out multiple times. Even after the price hike this year it sold out again with 24 hours of being back in stock. The demand is real and has not died down even after four years.
Question
mackol
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
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
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
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 :)
Link to comment
https://www.neowin.net/forum/topic/52712-c-heap-question/Share on other sites
7 answers to this question
Recommended Posts