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
There is a long thread (128pgs and counting) that I've been following over at ElevenForums that has a method for updating Secure Boot even if there is no BIOS upgrade.
I've used this method and had zero issues.
NOTE: I do not take any responsibility if this or any other Secure Boot method bricks your system -- YMMV! Read carefully before using!
There was nothing whatsoever wrong with Vista as an OS after the SP1 update. People who claim it wasn't were using ancient machines for some silly reason. Not kidding, no hyperbole/exaggeration. Vista was good.
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