양방향 연결 리스트-자료구조<5>

hans·2022년 4월 14일
0

양방향 연결 리시트

오늘 공부해본 양방향 연결 리스트를 정리해 보자
양방향 연결 리스트는 문자 그래도 노드들이 양방향으로 연결되어있는 형태의 리스트다

양방향 연결 리스트의 최대 장점은 바로 이전 노드의 접근이 가능하다는 것이다 이것이 의미하는 바는
리시트의 삽입의 과정을 살펴보며 이해해 보자

양방향 연결 리스트의 삽입

코드


//초기화
void ListInit(List * plist)
{
	plist->head = NULL;
	plist->numOfData = 0;
}

//삽입
void LInsert(List * plist, Data data)
{
	Node * newNode = (Node*)malloc(sizeof(Node));
	newNode->data = data;

	newNode->next = plist->head;
	if(plist->head != NULL)
		plist->head->prev = newNode;

	newNode->prev = NULL;
	plist->head = newNode;

	(plist->numOfData)++;
    
    
}

이렇게 해서 양방향 리스트의 삽입에 대해 정리해보았다
조회를 정리해보자

양방 리스트 조회

양방향 연결 리스트의 조회는 단순 연결리스와 원형 리스트에서 수많이 해온 조회들과 코드가 99% 유사한데
1% 차이를 만드는 것이 바로 before 안써도 된다는 점이다 그리고 보너스로 이전 노드에 데이터를 조회할수있다
정말 놀랍다 ~~~

코드

int LFirst(List * plist, Data * pdata)
{
	if(plist->head == NULL)
		return FALSE;

	plist->cur = plist->head;
	*pdata = plist->cur->data;

	return TRUE;
}

int LNext(List * plist, Data * pdata)
{
	if(plist->cur->next == NULL)
		return FALSE;

	plist->cur = plist->cur->next;
	*pdata = plist->cur->data;

	return TRUE;
}

int LPrevious(List * plist, Data * pdata)
{
	if(plist->cur->prev == NULL)
		return FALSE;

	plist->cur = plist->cur->prev;
	*pdata = plist->cur->data;

	return TRUE;
}

여기서는 cur을 이동시켜 노드의 데이터를 가져오는 방식으로 그림으로 이해하면 쉽다

더미 양방향 연결 리스트의 삭제 구현

양방향 연결 리스트 공부에서 제일 중요한 포인트가 나왔다
바로 더미 양방향 연결 리스트 인데 일단 더미 양방향 연결 리시트의 모습부터 그림으로 봐보자

이제부터 더미 양방향 연결 리스트의 삭제과정을 그림으로 정리해 보자

말로 풀어서 정리하면
2번 노드를 삭제위해 1번 노드의 next가 3번 노드를 가리켜야 하고 3번 노드의 pre가 1번 노드를 가리키게 한다음
2번 노드를 삭제 시켜주면 된다

이 과정이 더미 양방향 연결 리스트의 삭제다

profile
방구석여포

0개의 댓글