Linked Queue는 Singly Linked List와 구조가 똑같다.
주요 연산:
Enqueue(삽입)
Dequeue(삭제)
enqueue는 rear 뒤에, dequeue는 front를 반환해주면 된다.
// gcc -o Test_LinkedQueue.exe Test_LinkedQueue.c LinkedQueue.c; ./Test_LinkedQueue.exe
typedef struct tagNode
{
char* Data;
struct tagNode* NextNode;
} Node;
typedef struct tagLinkedQueue
{
Node* Front;
Node* Rear;
int Count;
} LinkedQueue;
void LQ_CreateQueue( LinkedQueue** Queue )
{
/* 큐를 자유저장소에 생성 */
(*Queue ) = ( LinkedQueue*)malloc(sizeof( LinkedQueue ) );
(*Queue )->Front = NULL;
(*Queue )->Rear = NULL;
(*Queue )->Count = 0;
}
void LQ_DestroyQueue( LinkedQueue* Queue )
{
while ( !LQ_IsEmpty( Queue ) )
{
Node* Popped = LQ_Dequeue( Queue );
LQ_DestroyNode(Popped);
}
/* 큐를 자유 저장소에서 해제 */
free( Queue );
}
Node* LQ_CreateNode( char* NewData )
{
Node* NewNode = (Node*)malloc( sizeof( Node ) );
NewNode->Data = (char*)malloc( strlen( NewData) + 1);
strcpy(NewNode->Data, NewData); /* 데이터를 저장한다. */
NewNode->NextNode = NULL; /* 다음 노드에 대한 포인터는 NULL로 초기화 한다. */
return NewNode;/* 노드의 주소를 반환한다. */
}
void LQ_DestroyNode(Node* _Node )
{
free(_Node->Data);
free(_Node );
}
void LQ_Enqueue( LinkedQueue* Queue, Node* NewNode )
{
if ( Queue->Front == NULL )
{
Queue->Front = NewNode;
Queue->Rear = NewNode;
Queue->Count++;
}
else
{
Queue->Rear->NextNode = NewNode;
Queue->Rear = NewNode;
Queue->Count++;
}
}
Node* LQ_Dequeue( LinkedQueue* Queue )
{
/* LQ_Dequeue() 함수가 반환할 최상위 노드 */
Node* Front = Queue->Front;
if ( Queue->Front->NextNode == NULL )
{
Queue->Front = NULL;
Queue->Rear = NULL;
}
else
{
Queue->Front = Queue->Front->NextNode;
}
Queue->Count--;
return Front;
}
int LQ_IsEmpty( LinkedQueue* Queue )
{
return ( Queue->Front == NULL);
}
int main( void )
{
Node* Popped;
LinkedQueue* Queue;
LQ_CreateQueue(&Queue );
LQ_Enqueue( Queue, LQ_CreateNode("abc") );
LQ_Enqueue( Queue, LQ_CreateNode("def") );
LQ_Enqueue( Queue, LQ_CreateNode("efg") );
LQ_Enqueue( Queue, LQ_CreateNode("hij") );
printf("Queue Size : %d\n", Queue->Count);
while ( LQ_IsEmpty( Queue ) == 0 )
{
Popped = LQ_Dequeue( Queue );
printf( "Dequeue: %s \n", Popped->Data );
LQ_DestroyNode( Popped );
}
LQ_DestroyQueue( Queue );
return 0;
}
'자료구조' 카테고리의 다른 글
Tree(2) - Binary Tree (0) | 2022.07.10 |
---|---|
Tree(1) - Tree 구현 (0) | 2022.07.10 |
Queue(1) - Circular Queue (0) | 2022.07.08 |
Stack(3) - 사칙 연산 계산기 (0) | 2022.07.08 |
Stack(2) - Linked List Stack (0) | 2022.07.08 |