참조계수란게 리스트(L)의 참조계수가 0이 아닐때
L를 삭제해 버리면 L를 참조하고 있던 리스트들이 호구가 되니까
그걸 방지해 주기 위해 쓰는거라고 보면 되는거야?
그럼 이 알고리즘에서
removeList(L)
L.ref ← L.ref - 1; // 참조계수는 자신을 참조하는 리스트 개수+1이기땜에 하나 줄여서 판단
if(L.ref≠0) then return; // L의 참조계수가 0이 아니면 (L을 참조하는 리스트가 있으면) 함수 끝냄
p ← L ;
while(p.link≠null) do {
p ← p.link;
if p.tag = 1 then removeList(p.data); // p가 가리키는 노드가 다른 리스트를 참조하면 ..그 리스트도 삭제?
}
p.link ← Free;
Free ← L;
end removeList()
if(L.ref≠0) then return; 이 부분이 삭제를 방지해준다는거 같은뎅..
주석은 내가 임의로 해석을 단건데 순환되는 부분을 잘 모르겠음... L리스트가 참조하는 모든리스트가 참조하는 모든리스트를 다 삭제해버리는건가? ;;;
무슨 언어인지 모르겠으나 대충 그런듯. 일단 같은 L을 여러군데서 사용할때 쓸만한 알고리즘인것 같고, 여기저기서 removeList를 호출하면 ref를 마이너스해 가다가 ref가 0이 되면 진짜 L을 삭제하는거지 모
자료구조에서 나오는 ADL인뎅 L 자신을 참조하는 리스트는 지우면 안되지만 L이 참조하는 리스트가 있든 없든 L을 지우는데는 상관없는거 아냐? 왜 L의 원소가 참조하는 모든 리스트를 지워야 하는건지 잘 모르겠네 그냥 그렇게 만들어 놓은건가?
L이 리스트를 따로 참조하고 있으면 그 참조도 지워줘야겠지. 그래서 저렇게 해 놓은듯한데? 그런데 저런건 C++에서는 소멸자에다 세팅해 놓는게 더 좋긴 한데. 내가 ADL을 몰라서 거기까진 잘 모르겠다;
L이 A라는 리스트를 따로 가지고 있다 치자. 만약 A가 없다면 새로 로딩해서 데이타가 들어가고 ref은 1이겠지? 근데 저기서 L을 지울때 A를 안지워주면 A는 참조도 안하면서 데이타는 남아있단말야. 그래서 지워주는 거 아닐까?