극복해내자 나의 슬럼프!!
21/07/19
다항식 a와 b를 덧셈하고 c를 만들었기 때문에 더 이상 a,b는 필요하지 않기에 이 둘을 시스템에 반납하기 위한 코드- 포인터가 null이 아닌 동안, temp ptr를 가리키게 하고, 그 다음 것을 또 가리키게 한 다음 free를 시킴.
\중요\
*ptr = (*ptr)->link;
를 하는 이유?
앞의 항 부분을 free 시키고 나면 링크의 주소값이 사라지기 때문에 그것을 저장해두는 것임.
avail 이라는 것을 선언
avail : 이제는 더이상 사용하지 않는 모든 다항식들을 묶어놓은(모아둔) 리스트들의 첫번째 노드를 가리키는 변수
예시로, A,B,C라는 다항식이 있고 avail은 전역변수.
A와 B를 더이상 쓰고 싶지 않은 다항식이라면 A가 B의 시작 노드를 avail이 A의 시작 노드를 가리키게 하는 것임. 두개의 리스트가 쫙 묶이게 되고 새로운 다항식을 만들 때, 다항식을 사용할 때 잘 가공 되어있기 때문에 다 지우고, 새로운 다항식들의 노드들로 활용.
맨 앞에 있는 avail이 가리키고 있는 노드에 다시 새로운 다항식을 넣어 사용하면 데이터를 사용하기 용이함.
이러한 함수 getNode 콜하면
if(avail) {
node = avail;
avail = avail->link;
}
else MALLOC(node, sizeof(*node));
return node
1) 재활용 할 수 있는 공간이 존재한다면 콜하여 재사용하기
2) 없다면 새로운 공간 할당하기
avail은 대기 상태에 있는 노드들이 묶여있는 리스트의 첫번째 주소값만 가지고 있음.
만약, 더이상 필요가 없어져서 대기상태에 있는 리스트에 새로운 항을 추가하려 할 때? 맨 뒤가 아닌 (맨 뒤면 리스트를 스캔해서 뒤로 보내야하는 수고가 필요함) avail이 가리키고 있는 위치에 저장함.
circular representation
마지막 노드가 맨 앞을 가리키는 링크필드
장점: 어떤 노드에서 시작하든 맨 시작 노드로 돌아올 수 있음.
특징 : zero polymonial
첫번째 시작 노드라는 걸 표현하기 위해서 비워둠
계수 값이 -1로 설정되어있음
Erasing a Circular List
void crease(polyPointer* ptr)
{
polyPointer temp;
if (*ptr) {
temp = (*ptr)->link;
(*ptr)->link = avail;
avail = temp;
*ptr = NULL;
}
}