-
문제 09 -1 우선순위 큐의 활용Data Structure/윤성우의 열혈 자료구조 2019. 7. 29. 03:50
// UsefulHeap.h
#pragma once
#define TRUE 1
#define FALSE 0
#define HEAP_LEN 100
// typedef char HData;
typedef char * HData;
typedef int PriorityComp(HData d1, HData d2);
typedef struct _heap
{
PriorityComp * comp;
int numOfData;
HData heapArr[HEAP_LEN];
} Heap;
void HeapInit(Heap * ph, PriorityComp pc);
int HIsEmpty(Heap * ph);
void HInsert(Heap * ph, HData data);
HData HDelete(Heap * ph);
//UsefulHeap.c
#include "UsefulHeap.h"
void HeapInit(Heap * ph, PriorityComp pc)
{
ph->numOfData = 0;
ph->comp = pc;
}
int HIsEmpty(Heap * ph)
{
if (ph->numOfData == 0)
return TRUE;
else
return FALSE;
}
int GetParentIDX(int idx)
{
return idx / 2;
}
int GetLChildIDX(int idx)
{
return idx * 2;
}
int GetRChildIDX(int idx)
{
return GetLChildIDX(idx) + 1;
}
int GetHiPriChildIDX(Heap * ph, int idx)
{
if (GetLChildIDX(idx) > ph->numOfData)
return 0;
else if (GetLChildIDX(idx) == ph->numOfData)
return GetLChildIDX(idx);
else
{
// if(ph->heapArr[GetLChildIDX(idx)].pr
// > ph->heapArr[GetRChildIDX(idx)].pr)
if (ph->comp(ph->heapArr[GetLChildIDX(idx)],
ph->heapArr[GetRChildIDX(idx)]) < 0)
return GetRChildIDX(idx);
else
return GetLChildIDX(idx);
}
}
void HInsert(Heap * ph, HData data)
{
int idx = ph->numOfData + 1;
while (idx != 1)
{
// if(pr < (ph->heapArr[GetParentIDX(idx)].pr))
if (ph->comp(data, ph->heapArr[GetParentIDX(idx)]) > 0)
{
ph->heapArr[idx] = ph->heapArr[GetParentIDX(idx)];
idx = GetParentIDX(idx);
}
else
{
break;
}
}
ph->heapArr[idx] = data;
ph->numOfData += 1;
}
HData HDelete(Heap * ph)
{
HData retData = ph->heapArr[1];
HData lastElem = ph->heapArr[ph->numOfData];
int parentIdx = 1;
int childIdx;
while (childIdx = GetHiPriChildIDX(ph, parentIdx))
{
// if(lastElem.pr <= ph->heapArr[childIdx].pr)
if (ph->comp(lastElem, ph->heapArr[childIdx]) >= 0)
break;
ph->heapArr[parentIdx] = ph->heapArr[childIdx];
parentIdx = childIdx;
}
ph->heapArr[parentIdx] = lastElem;
ph->numOfData -= 1;
return retData;
}
//PriorityQueue.h
#pragma once
#include "UsefulHeap.h"
typedef Heap PQueue;
typedef HData PQData;
void PQueueInit(PQueue * ppq, PriorityComp pc);
int PQIsEmpty(PQueue * ppq);
void PEnqueue(PQueue * ppq, PQData data);
PQData PDequeue(PQueue * ppq);
//PriorityQueue.c
#include "PriorityQueue.h"
#include "UsefulHeap.h"
void PQueueInit(PQueue * ppq, PriorityComp pc)
{
HeapInit(ppq, pc);
}
int PQIsEmpty(PQueue * ppq)
{
return HIsEmpty(ppq);
}
void PEnqueue(PQueue * ppq, PQData data)
{
HInsert(ppq, data);
}
PQData PDequeue(PQueue * ppq)
{
return HDelete(ppq);
}
// Main. c
#include <stdio.h>
#include <string.h>
#include "PriorityQueue.h"
int DatapriorityComp(char * str1, char * str2)
{
return strlen(str2) - strlen(str1);
}
int main()
{
PQueue pq;
PQueueInit(&pq, DatapriorityComp);
PEnqueue(&pq, "Good morning");
PEnqueue(&pq, "I am a boy");
PEnqueue(&pq, "Priority Queue");
PEnqueue(&pq, "Do you like coffee");
PEnqueue(&pq, "I am so happy");
while (!PQIsEmpty(&pq))
printf("%s \n", PDequeue(&pq));
return 0;
}
'Data Structure > 윤성우의 열혈 자료구조' 카테고리의 다른 글
문제 03 -1 리스트 라이브러리의 활용 (0) 2019.09.04 문제 11-1 이진 탐색 트리의 조건 (0) 2019.08.16 문제 08-1 이진 트리의 소멸 (0) 2019.07.15 문제 06-1 연결 리스트를 이용한 스택의 또 다른 구현 (0) 2019.07.07 문제05-2 더미 노드 기반의 양방향 연결 리스트 구현 (0) 2019.07.02