DataType PQ_FindMin(PriorityQueue p_queue) { if(!PQ_IsEmpty(p_queue)) return p_queue->m_Array[1]; printf("ERRoR!! Queue is Empty!!"); return p_queue->m_Array[0]; }
int main() { PriorityQueue* PQ = PQ_Create(3); PQNode Popped; PQNode Nodes[7] = { {34, (void*)"코딩"}, {12, (void*)"고객미팅"}, {87, (void*)"커피타기"}, {45, (void*)"문서작성"}, {35, (void*)"디버깅"}, {66, (void*)"이닦기"} }; PQ_Enqueue(PQ, Nodes[0]); PQ_Enqueue(PQ, Nodes[1]); PQ_Enqueue(PQ, Nodes[2]); PQ_Enqueue(PQ, Nodes[3]); PQ_Enqueue(PQ, Nodes[4]); PQ_Enqueue(PQ, Nodes[5]); printf("큐에 남아 있는 작업의 수 : %d\n", PQ->UsedSize); while (!PQ_IsEmpty(PQ)) { PQ_Dequeue(PQ, &Popped); PrintNode(&Popped); } return 0; }
DataType PQ_DeleteMin(PriorityQueue p_queue) { int i, child; DataType minEle, lastEle; if(PQ_IsEmpty(p_queue)) { printf("ERROR!! Queue is Empty"); return p_queue->m_Array[0]; } minEle = p_queue->m_Array[1]; lastEle = p_queue->m_Array[p_queue->m_Size--]; for(i=1; i*2 < p_queue->m_Size; i = child) { child = i*2; // get the smaller child; if (child != p_queue->m_Size && p_queue->m_Array[child+1] < p_queue->m_Array[child]) child++; //percolate one level if(lastEle > p_queue->m_Array[child]) p_queue->m_Array[i] = p_queue->m_Array[child]; else break; } p_queue->m_Array[i] = lastEle; return minEle; }
void Dijkstra(Graph* G, Vertex* StartVertex, Graph* ShortestPath ) { int i = 0; PQNode StartNode = { 0, StartVertex }; PriorityQueue* PQ = PQ_Create(10); Vertex* CurrentVertex = NULL; Edge* CurrentEdge = NULL; int* Weights = (int*) malloc( sizeof(int) * G->VertexCount ); Vertex** ShortestPathVertices = (Vertex**) malloc( sizeof(Vertex*) * G->VertexCount ); Vertex** Fringes = (Vertex**) malloc( sizeof(Vertex*) * G->VertexCount ); Vertex** Precedences = (Vertex**) malloc( sizeof(Vertex*) * G->VertexCount ); CurrentVertex = G->Vertices; while ( CurrentVertex != NULL ) { Vertex* NewVertex = CreateVertex( CurrentVertex->Data ); AddVertex( ShortestPath, NewVertex); Fringes[i] = NULL; Precedences[i] = NULL; ShortestPathVertices[i] = NewVertex; Weights[i] = MAX_WEIGHT; CurrentVertex = CurrentVertex->Next; i++; } PQ_Enqueue ( PQ, StartNode ); Weights[StartVertex->Index] = 0; while( ! PQ_IsEmpty( PQ ) ) { PQNode Popped; PQ_Dequeue(PQ, &Popped); CurrentVertex = (Vertex*)Popped.Data; Fringes[CurrentVertex->Index] = CurrentVertex; CurrentEdge = CurrentVertex->AdjacencyList; while ( CurrentEdge != NULL ) { Vertex* TargetVertex = CurrentEdge->Target; if ( Fringes[TargetVertex->Index] == NULL && Weights[CurrentVertex->Index] + CurrentEdge->Weight < Weights[TargetVertex->Index] ) { PQNode NewNode = { CurrentEdge->Weight, TargetVertex }; PQ_Enqueue ( PQ, NewNode ); Precedences[TargetVertex->Index] = CurrentEdge->From; Weights[TargetVertex->Index] = Weights[CurrentVertex->Index] + CurrentEdge->Weight; } CurrentEdge = CurrentEdge->Next; } } for ( i=0; i<G->VertexCount; i++ ) { int FromIndex, ToIndex; if ( Precedences[i] == NULL ) continue; FromIndex = Precedences[i]->Index; ToIndex = i; AddEdge( ShortestPathVertices[FromIndex], CreateEdge( ShortestPathVertices[FromIndex], ShortestPathVertices[ToIndex], Weights[i] ) ); } free( Fringes ); free( Precedences ); free( ShortestPathVertices ); free( Weights ); PQ_Destroy( PQ ); }