2. circularly linked list 줄여서 circular
list
마지막 노드가 ㅅ가 아니라 처음 노드로 연결.
마지막이 마지막이 아니고 처음이 처음이 아니다.
어디서 시작하든 다 훑을 수 있다.
3. 기본연산
a) 왼쪽 끝에 Y를 삽입: P <= AVAIL, INFO(P) <- Y,LINK(P)<-
LINK(PTR),LINK(PTR)<-p
b) 오른쪽 끝에 Y를 삽입: 왼쪽 끝에 Y를 삽인한 후 PTR<-P로 설
정
c) Y를 왼쪽 끝노드로 설정하고 삭제: P<-LINK(PTR), Y<-
INFO(P),LINK(PTR)<-LINK(P),AVAIL<=P
빈 목록일 떄 처리를 위한 명령어 추가 (빌때 PTR = ㅅ)
(a) INFO(P)<-y다음에 PTR=ㅅ이면 PTR<-LINK(P)<-P 아니면
(c) 처음에 만일 PTR=ㅅ이면 UNDERFLOW 끝에PTR=P이면
PTR<-ㅅ
4. (a)와(c) 결합은 스택 (b)와(c)결합은 대기열(큐)
전체 삭제가 쉬움
만일 PTR!=ㅅ이면 AVAIL<->LINK(PTR)
[<-> 는 교환 P<-AVAIL,AVAIL<-LINK(PTR),LINK(PTR)<-P]
서로 다른 순환 목록을 합치는 것도 쉬움
- 문자열 연결(concatenation)
만일 PTR2 != ㅅ이면
(만일 PTR1!=ㅅ이면 LINK(PTR1) <->LINK(PTR2);
PTR1<-PTR2,PTR2<-ㅅ로 설정)
하나를 두개로 나누는 것도 쉬움 - 분리(deconcatenation)
5. 포인터를 하나 더가지면 선형,순환으로 다 사용가능
아니면 그냥 대가리 노드를 두던가.
->
(목록이 비어있을 일이 없음, 끝을 가리키는 포인터가 없으므로
연산(b)포기 )
6. 순환 목록의 이용
- 변수 x,y,z의 정수 계수 다항식 산술
x4+2x3y+3x2y2+4xy3 곱하기 x2-2xy+y2해서
을 x^6-6xy5+5y6 얻는거
다항식이 얼마나 길어질지 모르므로 linked list사용
노드는 2워드에 이런 모양 ->
그러니까 x6-6xy5+5y6표현하면
10. 알고리즘M 다항식 곱하기
다항식(Q) + 다항식(M) X 다항식(P)
M1. [다음 승수] M <-LINK(M) 만일 ABC(M)<0이면 알고리즘 끝
M2. 알고리즘 A 약간 변형해서 수행
ABC(P)대신 ABC(P)+ABC(M)
COEF(P) 대신 COEF(P)XCOEF(M)
단계 M1으로 돌아간다.
13. 8. 알고리즘 A에서 Q1이 Q보다 한걸음
뒤에서 따르도록 하는게 유용한 이유
링크 노드 간직할라고.
14. 9.P=Q이면 알고리즘 A가 제대로 작동할까?
네. 그러나 abc>=0이면서 coef=0인 예외적인 케이스 발생하면 오류
그리고 각각 P=M,P=Q,M=Q일 때 알고리즘 M이 제대로 작동할까?
p=m 넵
p=q 넵 M=t1+t2+...t3이면
p<-px(1+t1)(1+t2)...(1+tk)
m=q넵 q<-q+qxp 단 p의 상수항이 -1일때는 잘못계산