-------------------------------------------
-------------------------------------------
-------------------------------------------
-------------------------------------------
-------------------------------------------
앞 노드의 주소를 가지는 front 노드 포인터
뒷 노드의 주소를 가지는 rear 노드 포인터
출력을 위한 print 노드 포인터
삭제를 위한 del 노드 포인터
탐색을 위한 search 노드 포인터
-------------------------------------------
함수 프로토타입은
노드를 추가하는 인큐 함수
노드를 제거하는 디큐 함수
노드를 탐색하는 서치 노드 함수
노드를 출력하는 프린트 노드 함수
-------------------------------------------
노드 추가, 삭제
출력
탐색 하는
선택문을 만듭니다.
-------------------------------------------
역시 이어지는 선택문 코드 입니다.
-------------------------------------------
-------------------------------------------
처음에
프론트와 리얼은
NULL 포인터를 가지다가
첫번째 인큐하면
두 노드 모두다
첫번째 노드를 가리킵니다.
-------------------------------------------
두번째 인큐하면
뒤에 노드를 추가한다음
-------------------------------------------
Rear 노드가 새로운 노드로 옮겨갑니다.
-------------------------------------------
마찬가지로 뒤에 추가하고
-------------------------------------------
Rear이 옮겨갑니다.
-------------------------------------------
-------------------------------------------
처음에 노드를 동적 할당하고
-------------------------------------------
다음에
노드에 데이터와
Next에는 null 포인터를 넣습니다.
-------------------------------------------
다음 66번째 줄부터는
Front가 널이라면?
이것은 첫번째 추가를 의미합니다.
첫번째 추가에는
프론트, 리얼 둘다 그 첫번째 노드를 가리키기만 하면 끝이납니다.
-------------------------------------------
다음으로 else 부분은
Front가 널이 아닌것은
이미 이전에 노드를 추가했다는 소리고
그것은 두번째 이후 추가를 말합니다.
두번째 이후 추가부터는
현재 rear이 가리키는 곳의 next에 새로운 노드의 주소인 n을 넣어 뒤에 연결시킨다음
Rear은 rear이 가리키는 곳의 next해서
Rear이 다음 노드로 옮겨갑니다.
-------------------------------------------
-------------------------------------------
디큐는
Front 가 가리키는 데이터를 뽑아내고
메모리를 해제한다음 이동하면 됩니다.
-------------------------------------------
Front가 가리키는 노드를 바로 제거해버리면
Front가 다음 노드로 이동하지 못합니다.
그래서
보조 노드인 del을 사용해서
Del도 front가 가리키는 노드를 가리키도록 합니다.
-------------------------------------------
그 다음 front를 한칸 이동시킵니다.
Front 피신 시킨다고 볼 수 있습니다.
-------------------------------------------
그다음 del 가리키는 노드를 제거합니다.
동적 메모리 해제인 free를 사용합니다.
-------------------------------------------
계속 이런식으로
Front가 가리키는 노드를
Del 도 가리키고
-------------------------------------------
Front를 옮긴 다음
-------------------------------------------
Del 이 가리키는 노드를 제거합니다.
-------------------------------------------
계속 이런식으로
Front가 가리키는 노드를
Del도 가리키고
-------------------------------------------
Del 이 가리키는 노드를 제거합니다.
마지막 노드를 제거하면
모두 null을 가리키게 합니다.
-------------------------------------------
-------------------------------------------
노드를 제거하는 디큐는
위와 같습니다.
프론트가 널이면?
제거할 노드가 없습니다
그래서 캔트 디큐라는
출력문을 찍어줍니다.
-------------------------------------------
아니면 else 일 경우
프론트가 널이 아니면 제거할 노드가 있습니다.
그래서
Del에 front 값을 넣어
Del도 front가 가리키는 노드를 가리키게 합니다.
그 다음
Front 는 front가 가리키는 곳의 next해서
Front를 이동시켜 줍니다.
그리고
다음에 printf로 del 가리키는 노드의 데이터를 출력해
실제로 노드를 제거하기전에
어떤 노드를 제거할건지 출력해줍니다.
그 다음 free(del)을 해서
Del이 가리키는 곳의 노드를 제거합니다.
-------------------------------------------
-------------------------------------------
연결된 노드를
Print 노드가 front가 가리키는 곳의 노드를 가리킨 다음
출력하면서 차례로 옮겨 가면 됩니다.
-------------------------------------------
데이터를 출력하고
-------------------------------------------
옮겨가고
-------------------------------------------
출력하고
이렇게 옮겨가면 됩니다.
-------------------------------------------
전체 노드를 출력하는 코드는
Print가 front가 가리키는 곳의 노드를 가리킨 다음
Print 가 null 아닐때 까지
데이터를 출력하며 한칸씩 옮겨가면 됩니다.
-------------------------------------------
-------------------------------------------
Print 처럼 비슷하게 하는데
Print 노드 대신에
Search 노드로
제일 앞의 노드를 가리킨 다음
-------------------------------------------
옮겨가면서
데이터를 찾게되면 출력하면 됩니다.
-------------------------------------------
원하는 노드를 찾으면
출력하고 탐색을 종료합니다.
-------------------------------------------
큐에서 노드를 탐색하는 코드는 다음과 같습니다.
처음에
서치 노드에 front를 대입하여
서치 노드가 front가 가리키는 노드를 가리키게 하고
노드를 탐색하다가 찾는 데이터가 나오면
찾은 데이터를 출력하고 return 하여 종료합니다.
-------------------------------------------
-------------------------------------------
-------------------------------------------
실행하면 이런식으로 됩니다.
인큐 10 20 30 하면
차례로 연결되어
프린트 노드 했을때
차례로 10 20 30 이 나오고
디큐 했을때
제일 앞의 노드인 10만 제거되어
결과는 20 30 이 나옵니다.
탐색을 하여
서치 30하면
결과를 찾고
파인드 30이 나옵니다.
-------------------------------------------
-------------------------------------------
-------------------------------------------
노드 구조체를 정의하고
노드 포인터를 전역변수 형태로 선언하고
함수 원형
인큐, 디큐, 서치 노드, 프린트 노드 만듭니다.
-------------------------------------------
그 다음
기능 선택 부분입니다.
-------------------------------------------
기능 선택부분
-------------------------------------------
다음은 인큐 함수입니다.
동적할당해서 노드를 생성한 다음 데이터 주고
다음 주소 null로 주고
연결 부분은
Front가 널일때
Front와 rear 둘다 첫번째 노드를 가리키고
널이 아닐때는
뒤에 연결한 다음
Rear이 옮겨갑니다.
-------------------------------------------
다음은 디큐 함수입니다.
프론트가 널일때
가리키는 노드가 없으므로
디큐 불가능
널이 아닐땐
보조노드인 del노드가 front가 가리키는 노드를 가리키고
Front는 옮겨갑니다.
그리고 del 이 가리키는 노드의 데이터를 출력한다음
Free del 해서
Del이 가리키는 노드를 제거합니다.
-------------------------------------------
다음은 프린트 노드 함수입니다.
Print 보조노드를 이용하여
Front가 가리키는 노드를 가리킨 다음
Print가 널이 아닌 동안
데이터를 출력합니다.
-------------------------------------------
다음은 서치 노드 함수입니다.
Search 보조노드를 이용하여
Front가 가리키는 노드를 가리킨 다음
Search t가 널이 아닌 동안
탐색하다가
찾는 데이터를 만나면 출력하고
Return 하여 종료합니다.
-------------------------------------------
'자료구조' 카테고리의 다른 글
[자료구조] 11장. 트리 (Tree) (0) | 2020.04.11 |
---|---|
[자료구조] 10장. 연결 리스트 큐 (지역변수) (Queue Linked List) (0) | 2020.04.10 |
[자료구조] 8장. 연결 리스트 스택 (지역변수) (Stack Linked List) (0) | 2020.04.10 |
[자료구조] 7장. 연결 리스트 스택 (전역변수) (Stack Linked List) (0) | 2020.04.10 |
[자료구조] 6장. 연결 리스트 설명과 구현 (Linked List) (0) | 2020.04.10 |