기존에는 어떻게 하면 연결리스트를 만들수있는지에 대해 공부에 봤다
이번글에서는 연결리스트이 데이터를 조히하는 방법을 글로 정리해보겠다
(1번글의 코드들을 이해하고 보기를 바란다)
if(head == Null)
{
printf("저장된 자연수가 존재하지 않습니다");
}
else
{
cur = head;
printf("%d",cur->data);
while(cur->next != NULL)
{
cur == cur -> next;
printf("%d",cur -> data);
}
}
위의 코드들을 하나하나 그림을 통해 이해해보자
1번글을 따라왔다면 기본적인 연결리시트의 구조가 위와 같이 구성되있다는 건 이해가 될거다
cur = head;
포인터 변수 cur이 head가 가리키는 data1을 가리켜야할거다
while(cur->next != NULL)
{
cur = cur -> next;
printf("%d",cur -> data);
}
cur = cur -> next;
포인터에 대해서는 설명을 안하지만 간단하게 말로 풀어보자면
"cur이 가리키는 것의 next가 가리키는 곳을 가리켜줘"라고 해석할수있다
그렇다면 cur이 가르키는 data1의 next는 data2를 가르키기에 cur은 data1->2->3
순으로 이동할거다
이번에는 연결리스트 데이터 삭제에 대해 정리해보자
if(head == Null)
{
return 0;
}
else
{
Node* delNode = head;
Node* delNextNode = head ->next;
printf("%d을(를)삭제합니다.\n",head ->data);
free(delNode);
while(delNextNode !=NULL)
{
delNode = delNextNode;
delNextNode = delNextNode -> next;
printf("%d를 삭제합니다\n",delNode-> data);
free(delNode);
}
}
위의 코드들을 부분별로 나눠 그림을 통해 이해해보자
Node delNode = head;
Node delNextNode = head ->next;
구조체 Node를 가리키는 포인터 변수 2개가 생성되어야한다
참조를 할때는 1개의 포인터를 생성했는데 삭제에는 2개의 포인터를 생성했다
그이유는 dn에서 노드를 삭제해 버리면 더이상 다음 노드에 접근할수 없기 때문이다
free(delNode);
data1 노드는 삭제가 된다
이순간 dn은 더이상 다음노드에 접근할수있는 방법이 없다 그래서 dnn을 사용한다
while(delNextNode !=NULL)
{
delNode = delNextNode;
delNextNode = delNextNode -> next;
printf("%d를 삭제합니다\n",delNode-> data);
free(delNode);
}
dn은 dnn이 가르키는 주소를 가리킴으로써 다음노드의 접근하고
dnn은 자연스럽게 다음 노드를 가리킴으로써 아까 배운 조회와 똑같이 움직이게 된다
그러면서 모든 리스트의 데이터를 삭제하게 된다