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

this goes to the delete heap function that isCode: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 later goes to the reheapDown function which isCode: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; }

any form of help is appreciated. i just need someone to spot the error. i can fix the rest myselfCode: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; }

thanks