연결리스트-자료구조<2>

hans·2022년 4월 4일
1

연결리스트 조회

기존에는 어떻게 하면 연결리스트를 만들수있는지에 대해 공부에 봤다
이번글에서는 연결리스트이 데이터를 조히하는 방법을 글로 정리해보겠다
(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은 자연스럽게 다음 노드를 가리킴으로써 아까 배운 조회와 똑같이 움직이게 된다
그러면서 모든 리스트의 데이터를 삭제하게 된다

profile
방구석여포

0개의 댓글