본문 바로가기
Archive

[6] Queue 함수 구현하기 - deQueue

by livemehere 2020. 10. 6.


deQueue의 경우에는 맨 앞 데이터를 빼내는 빼내는 것입니다.

이번 함수에서는 제거만을 구현했고, 이후에 다룰 Generic Queue에서는 데이터를 반환하는 것 까지 구현을 해보겠습니다.


우선 이번 코드를 설명하자면,

우리가 큐에 데이터를 어떤 형식으로 저장하고있죠? 바로 NODE입니다.

그렇다면 우리가 할 작업은 데이터를 제거하는 것인데 그러기 위해서는 NODE포인터를 하나 선언해주어야합니다.

데이터 형식이 NODE 포인터 이기 때문이죠

 

Tip) 여기서 enqueue와 다르게 NODE 포인터를 생성하고 동적할당을 해주지 않는 이유는?

      → dequeue에서는 데이터를 쓸 필요가 없어요! 그냥 읽어서 지워주기만 하면 되니까!


그렇다면 선언한 노드 포인터에 queue가 가리키는 front 를 넣음으로서 우리가 제거하기 위한 NODE를 

deletenode라는 포인터에 담아두었습니다.

그럼 제거작업은 뒤에하도록하고, queue를 정리해줄까요?

 

우선 경우의 수가 3개입니다.

1. queue가 비었을때

2. queue에 데이터가 1개 있을때

3. queue에 데이터가 2개 이상 있을때

 

1. 비었을때는 당연히 아무작업 없이, 함수를 종료해주면됩니다.

2. 데이터가 1개라면, front와 rear 가 하나의 값을 가리키고 있기 때문에 둘다 NULL로 바꿔 주어야 합니다.

3. 데이터가 2개이상이라면, rear는 가만히 있으면 되겠죠? front 만 front의 next 로 바꾸어줍니다.

(front가 가리키는 node는 deletenode에 담아두었기 때문에, 이제 front는 없다고 치고, 2번째 노드가 front로 와야합니다.

 


queue의 갯수가 0개인지 1개인지 그이상인지는 queue->count 를 통해서 조건을 확인하면되고

queue정리 작업이 끝났다면, count 를 -1 해주고,

아까 우리가 node를 담아뒀죠? 지금 queue에는 front에 있던 node를 제거했다고 생각하고, 재정렬을 해놓았기 때문에

이제는 진짜 데이터를 제거할 차례입니다.

방법은 단순히, malloc을 통해서 생성되어 저장되있던 node를 제거하려면 free를 해주면 끝입니다.

 

다음포스팅에선 마지막으로 queue를 제거하는 destroyQueue를 설명하겠습니다.

반응형