본문 바로가기
자료구조

[자료구조] 9장. 연결 리스트 큐 (전역변수) (Queue Linked List)

by 팔공산호랑이 2020. 4. 10.

-------------------------------------------

-------------------------------------------

 

-------------------------------------------

-------------------------------------------

 

-------------------------------------------

 

노드의 주소를 가지는 front 노드 포인터

노드의 주소를 가지는 rear 노드 포인터

출력을 위한 print 노드 포인터

삭제를 위한 del 노드 포인터

탐색을 위한 search 노드 포인터

-------------------------------------------

함수 프로토타입은

노드를 추가하는 인큐 함수

노드를 제거하는 디큐 함수

노드를 탐색하는 서치 노드 함수

노드를 출력하는 프린트 노드 함수

-------------------------------------------

 

노드 추가, 삭제

출력

탐색 하는

선택문을 만듭니다.

-------------------------------------------

역시 이어지는 선택문 코드 입니다.

-------------------------------------------

-------------------------------------------

처음에

프론트와 리얼은

NULL 포인터를 가지다가

첫번째 인큐하면

노드 모두다

첫번째 노드를 가리킵니다.

-------------------------------------------

두번째 인큐하면

뒤에 노드를 추가한다음

-------------------------------------------

Rear 노드가 새로운 노드로 옮겨갑니다.

-------------------------------------------

마찬가지로 뒤에 추가하고

-------------------------------------------

Rear이 옮겨갑니다.

-------------------------------------------

-------------------------------------------

처음에 노드를 동적 할당하고

-------------------------------------------

다음에

노드에 데이터와

Next에는 null 포인터를 넣습니다.

-------------------------------------------

다음 66번째 줄부터는

Front가 널이라면?

이것은 첫번째 추가를 의미합니다.

첫번째 추가에는

프론트, 리얼 둘다첫번째 노드를 가리키기만 하면 끝이납니다.

-------------------------------------------

다음으로 else 부분은

Front가 널이 아닌것은

이미 이전에 노드를 추가했다는 소리고

그것은 두번째 이후 추가를 말합니다.

두번째 이후 추가부터는

현재 rear이 가리키는 곳의 next에 새로운 노드의 주소인 n을 넣어 뒤에 연결시킨다음

Rearrear이 가리키는 곳의 next해서

Rear이 다음 노드로 옮겨갑니다.

-------------------------------------------

-------------------------------------------

디큐는

Front 가 가리키는 데이터를 뽑아내고

메모리를 해제한다음 이동하면 됩니다.

-------------------------------------------

Front가 가리키는 노드를 바로 제거해버리면

Front가 다음 노드로 이동하지 못합니다.

그래서

보조 노드인 del을 사용해서

Delfront가 가리키는 노드를 가리키도록 합니다.

-------------------------------------------

그 다음 front한칸 이동시킵니다.

Front 피신 시킨다고 볼 수 있습니다.

-------------------------------------------

그다음 del 가리키는 노드를 제거합니다.

동적 메모리 해제인 free를 사용합니다.

-------------------------------------------

계속 이런식으로

Front가 가리키는 노드를

Del 도 가리키고

-------------------------------------------

Front옮긴 다음

-------------------------------------------

Del 이 가리키는 노드를 제거합니다.

-------------------------------------------

계속 이런식으로

Front가 가리키는 노드를

Del도 가리키고

-------------------------------------------

Del 이 가리키는 노드를 제거합니다.

마지막 노드를 제거하면

모두 null을 가리키게 합니다.

-------------------------------------------

 

-------------------------------------------

노드를 제거하는 디큐는

위와 같습니다.

프론트가 널이면?

제거할 노드가 없습니다

그래서 캔트 디큐라는

출력문을 찍어줍니다.

-------------------------------------------

아니면 else 일 경우

프론트가 널이 아니면 제거할 노드가 있습니다.

그래서

Delfront 값을 넣어

Delfront가 가리키는 노드를 가리키게 합니다.

그 다음

Front front가 가리키는 곳의 next해서

Front를 이동시켜 줍니다.

그리고

다음에 printfdel 가리키는 노드의 데이터를 출력해

실제로 노드를 제거하기전에

어떤 노드를 제거할건지 출력해줍니다.

그 다음 free(del)을 해서

Del이 가리키는 곳의 노드를 제거합니다.

-------------------------------------------

-------------------------------------------

연결된 노드를

Print 노드가 front가 가리키는 곳의 노드를 가리킨 다음

출력하면서 차례로 옮겨 가면 됩니다.

-------------------------------------------

데이터를 출력하고

-------------------------------------------

옮겨가고

-------------------------------------------

출력하고

이렇게 옮겨가면 됩니다.

-------------------------------------------

전체 노드를 출력하는 코드는

Printfront가 가리키는 곳의 노드를 가리킨 다음

Print null 아닐때 까지

데이터를 출력하며 한칸씩 옮겨가면 됩니다.

-------------------------------------------

-------------------------------------------

Print 처럼 비슷하게 하는데

Print 노드 대신에

Search 노드로

제일 앞의 노드를 가리킨 다음

-------------------------------------------

옮겨가면서

데이터를 찾게되면 출력하면 됩니다.

-------------------------------------------

원하는 노드를 찾으면

출력하고 탐색을 종료합니다.

-------------------------------------------

큐에서 노드를 탐색하는 코드는 다음과 같습니다.

처음에

서치 노드에 front를 대입하여

서치 노드가 front가 가리키는 노드를 가리키게 하고

노드를 탐색하다가 찾는 데이터가 나오면

찾은 데이터를 출력하고 return 하여 종료합니다.

-------------------------------------------

-------------------------------------------

-------------------------------------------

실행하면 이런식으로 됩니다.

인큐 10 20 30 하면

차례로 연결되어

프린트 노드 했을때

차례로 10 20 30 이 나오고

디큐 했을때

제일 앞의 노드인 10만 제거되어

결과는 20 30 이 나옵니다.

탐색을 하여

서치 30하면

결과를 찾고

파인드 30이 나옵니다.

-------------------------------------------

-------------------------------------------

-------------------------------------------

노드 구조체를 정의하고

노드 포인터를 전역변수 형태로 선언하고

함수 원형

인큐, 디큐, 서치 노드, 프린트 노드 만듭니다.

-------------------------------------------

그 다음

기능 선택 부분입니다.

-------------------------------------------

기능 선택부분

-------------------------------------------

다음은 인큐 함수입니다.

동적할당해서 노드를 생성한 다음 데이터 주고

다음 주소 null로 주고

연결 부분은

Front널일때

Frontrear 둘다 첫번째 노드를 가리키고

널이 아닐때는

뒤에 연결한 다음

Rear이 옮겨갑니다.

-------------------------------------------

다음은 디큐 함수입니다.

프론트가 널일때

가리키는 노드가 없으므로

디큐 불가능

널이 아닐땐

보조노드인 del노드가 front가 가리키는 노드를 가리키고

Front는 옮겨갑니다.

그리고 del 이 가리키는 노드의 데이터를 출력한다음

Free del 해서

Del이 가리키는 노드를 제거합니다.

-------------------------------------------

다음은 프린트 노드 함수입니다.

Print 보조노드를 이용하여

Front가 가리키는 노드를 가리킨 다음

Print가 널이 아닌 동안

데이터를 출력합니다.

-------------------------------------------

다음은 서치 노드 함수입니다.

Search 보조노드를 이용하여

Front가 가리키는 노드를 가리킨 다음

Search t가 널이 아닌 동안

탐색하다가

찾는 데이터를 만나면 출력하고

Return 하여 종료합니다.

-------------------------------------------