void getDoneRowInfoNew(ParallelETree *tree,const int *postorder,const int *postorder_inv,const int treeInternalSize) { int i; int *priorityTable = getMempoolSet(sizeof(int)*(treeInternalSize+1)); for(i=0;i<treeInternalSize+1;i++) priorityTable[i] = treeInternalSize - postorder_inv[i]; gdsl_queue_t freeSinkList = gdsl_queue_alloc("freeSinkListTemp",alloc_int,free_int); getInitSinkList(freeSinkList,tree); // set the doneRow information while(gdsl_queue_get_size(freeSinkList)!=0) { int *indexInQueue = gdsl_queue_get_head(freeSinkList); gdsl_queue_remove(freeSinkList); updateFreeSinkList(freeSinkList,tree,*indexInQueue,treeInternalSize,priorityTable); retMempoolSet(indexInQueue,sizeof(int)); } // recover the setting of visiting the tree for(i=0;i<tree->size;i++) { if(tree->node[i] == NULL) continue; else tree->node[i]->visitLog = notvisit; } gdsl_queue_free(freeSinkList); retMempoolSet(priorityTable,sizeof(int)*(treeInternalSize+1)); }
int main (void) { int choice = 0; gdsl_queue_t q = gdsl_queue_alloc ("Q", alloc_integer, free_integer); do { printf ("\t\tMENU - QUEUE\n\n"); printf ("\t1> Put\n"); printf ("\t2> Pop\n"); printf ("\t3> Get Head\n"); printf ("\t4> Get Tail\n"); printf ("\t5> Flush\n"); printf ("\t6> Search\n"); printf ("\t7> Display\n"); printf ("\t8> Dump\n"); printf ("\t9> XML display\n"); printf ("\t0> Quit\n\n" ); printf ("\t\tYour choice: " ); scanf ("%d", &choice ); switch (choice) { case 1: { int value; printf ("Enter an integer value: "); scanf ("%d", &value); gdsl_queue_insert (q, (void*) &value); } break; case 2: if (!gdsl_queue_is_empty (q)) { int* value = (int*) gdsl_queue_remove (q); printf ("Value: %d\n", *value); free_integer (value); } else { printf ("The queue '%s' is empty\n", gdsl_queue_get_name (q)); } break; case 3: { if (!gdsl_queue_is_empty (q)) { int head = *(int*) gdsl_queue_get_head (q); printf ("Head = %d\n", head); } else { printf ("The queue '%s' is empty\n", gdsl_queue_get_name (q)); } } break; case 4: { if (!gdsl_queue_is_empty (q)) { int tail = *(int*) gdsl_queue_get_tail (q); printf ("Tail = %d\n", tail); } else { printf ("The queue '%s' is empty\n", gdsl_queue_get_name (q)); } } break; case 5: if (gdsl_queue_is_empty (q)) { printf ("The queue '%s' is empty\n", gdsl_queue_get_name (q)); } else { gdsl_queue_flush (q); } break; case 6: { int pos; int* value; printf ("Enter an integer value to search an element by its position: "); scanf ("%d", &pos); value = (int*) gdsl_queue_search_by_position (q, pos); if (value != NULL) { printf ("Value found at position %d = %d\n", pos, *value); } } break; case 7: if (gdsl_queue_is_empty (q)) { printf ("The queue '%s' is empty\n", gdsl_queue_get_name (q)); } else { printf ("%s = ", gdsl_queue_get_name (q)); gdsl_queue_map_forward (q, my_display_integer, NULL); } break; case 8: gdsl_queue_dump (q, my_write_integer, stdout, NULL); break; case 9: gdsl_queue_write_xml (q, my_write_integer, stdout, NULL); break; } } while (choice != 0); gdsl_queue_free (q); exit (EXIT_SUCCESS); }
static void updateFreeSinkList(gdsl_queue_t freeSinkList, ParallelETree *tree, const int currentNodeIndex,const int treeInternalSize,const int *priorityTable) { int rootIndex = currentNodeIndex/2; const int leftIndex = rootIndex*2; const int rightIndex = rootIndex*2 + 1; int *mark = getMempoolSet(sizeof(int)*(treeInternalSize+1)); memset(mark,0,sizeof(int)*(treeInternalSize+1)); tree->node[currentNodeIndex]->visitLog = visit; if(tree->node[rootIndex]==NULL) { retMempoolSet(mark,sizeof(int)*(treeInternalSize+1)); return; } // reorder the queue .... suck implement if( tree->node[leftIndex]->visitLog==visit && tree->node[rightIndex]->visitLog==visit ) { int i,j; int nnz = 0; while(gdsl_queue_get_size(freeSinkList)!=0) { int *indexInQueue = gdsl_queue_get_head(freeSinkList); gdsl_queue_remove(freeSinkList); mark[*indexInQueue] = 1; nnz++; retMempoolSet(indexInQueue,sizeof(int)); } mark[rootIndex] = 1; nnz++; for(i=0;i<nnz;i++) { int maxIndex = -1; int maxPri = -1; for(j=1;j<treeInternalSize+1;j++) { if( (mark[j]==1) && (priorityTable[j] > maxPri)) { maxPri = priorityTable[j]; maxIndex = j; } } mark[maxIndex] = 0; gdsl_queue_insert(freeSinkList,&maxIndex); } } if( tree->node[leftIndex]->visitLog==visit && tree->node[rightIndex]->visitLog==visit ) { int temp1,temp2; temp1 = GSL_MIN(tree->node[leftIndex]->doneRowBegin,tree->node[rightIndex]->doneRowBegin); temp2 = GSL_MIN(tree->node[leftIndex]->rowBegin,tree->node[rightIndex]->rowBegin); // tree->node[rootIndex]->doneRowBegin = GSL_MIN(temp1,temp2); temp1 = GSL_MAX(tree->node[leftIndex]->doneRowEnd,tree->node[rightIndex]->doneRowEnd); temp2 = GSL_MAX(tree->node[leftIndex]->rowEnd,tree->node[rightIndex]->rowEnd); tree->node[rootIndex]->doneRowEnd = GSL_MAX(temp1,temp2); } retMempoolSet(mark,sizeof(int)*(treeInternalSize+1)); }