연결리스트-자료구조<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개의 댓글

관련 채용 정보