단순 linked list

Post on 08-Jan-2017

223 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Simple LinkedList from C

창원대 정보통신공학과 김대호

목차• 정의• 기본 타입 (HEAD, TAIL, NODE)• 노드 생성 newNode()• 노드 삽입 ( 맨 앞 , 맨 뒤

단순 연결 리스트• 기본적인 Linked List 기초 중 기초• 노드 끼리 연결된 형태 이중 Pointer 를 사용함

기본 타입

기본 타입

Node

data next

기본 타입Node

data next

data : 노드 내부 저장소 (정수형 )next : 다음 노드를 가르 킬 포인터 노드 (Node 형 )

기본 타입node

(NULL)

data(0)

next(NULL)

HEAD, TAIL

head(NULL)

data(0)

next(NULL)

tail(NULL)

data(0)

next(NULL)

메모리 할당 malloc

• 데이터의 힙 (heap) 영역에서 다루기위한 함수• 할당 후 , 데이터를 없애기 위해서는 free() 를 선언해주어야함

메모리 할당 malloc

newNode()

• newNode() 는 구조체에서 구성 된 것들을 malloc을 통하여 생성해주는 함수• malloc 과 data 를 삽입시켜줌

newNode()

node1(NULL)

data(0)

next(NULL)

newNode()

node1(NULL)

data(10)

next(NULL)

newNode()

node1(NULL)

data(10)

next(NULL)

노드삽입• 노드를 연결 시키기 위해 head 와 tail 을 이용• 맨 앞에 노드추가 , 맨 뒤에 노드추가 , 원하는 위치에 노드 추가가 있음

맨 앞에 노드추가

addNodeFirst()

• addNodeFirst() 는 새롭게 생성된 노드를 head( 맨 앞 ) 으로 붙여주는 함수

• 이중 포인터 구문을 사용하여 쉽게 표현가능

addNodeFirst()

addNodeFirst()

head(NULL)

data(0)

next(NULL)

addNodeFirst()

head(NULL)

data(0)

next(NULL)

tail(NULL)

data(0)

next(NULL)

addNodeFirst()

head(NULL)

data(0)

next(NULL)

tail(NULL)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

addNodeFirst()

addNodeFirst 호출

addNodeFirst()

head(NULL)

data(0)

next(NULL)

tail(NULL)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

addNodeFirst()

*head(NULL)

data(0)

next(NULL)

*tail(NULL)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

Node 포인터 변수의 주소를 저장 하는 이중 포인터 head, tail

addNodeFirst()

*head(NULL)

data(0)

next(NULL)

*tail(NULL)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

addNodeFirst()

*head(node1)

data(0)

next(NULL)

*tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

(*head) 가 NULL 일 경우 ,(*head) 의 값은 node1 의 주소 값(*tail) 의 값은 node1 의 주소 값을 가르킨다

addNodeFirst()*head

(node1)

data(0)

next(NULL)

node(NULL)

data(0)

next(NULL)

*tail(node1)

data(0)

next(NULL)

addNodeFirst()*head

(node1)

data(0)

next(NULL)

*tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

tail 과 node1 의 위치를 바꾸고 ..

addNodeFirst()*head

(node1)

data(0)

next(NULL)

*tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

가르킨다를 방향으로 표시함

addNodeFirst()

addNodeFirst 호출

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node2(NULL)

data(20)

next(NULL)

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node2(NULL)

data(20)

next(NULL)

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node2(NULL)

data(20)

next(NULL)

head 와 tail 은 node1 을 가르키고 있다

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

node2(NULL)

data(20)

next(NULL)

+

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

node2(NULL)

data(20)

next(NULL)

+

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

node2(NULL)

data(20)

next(*head

=node1)

+

(*head) 는 node1 의 주소 값이다 ! ( 중요 )

왜 head 를 안가르키냐 헷갈려 할 수 있지만 head 가 아니다 ! (*head)다 !!

addNodeFirst()

head(node2)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

node2(NULL)

data(20)

next(*head

=node1)

+

이 구문을 통해 ,(*head) 는 node2 의 주소 값을 가르킨다

addNodeFirst()

*head(node2)

data(0)

next(NULL)

약간 위치를 정리하면…

node2(NULL)

data(20)

next(node1)

node1(NULL)

data(10)

next(NULL)

*tail(node1)

data(0)

next(NULL)

addNodeFirst()

*head(node2)

data(0)

next(NULL)

더 정리하면… 맨 마지막에 생성 된 것이 맨 앞에 연결 된다 !

node2(NULL)

data(20)

next(node1)

node1(NULL)

data(10)

next(NULL)

*tail(node1)

data(0)

next(NULL)

addNodeLast()

• addNodeLast() 는 새롭게 생성된 노드를 tail( 맨 끝 ) 으로 붙여주는 함수• addNodeFirst() 의 개념을 이해 했다면 충분히 이해 가능

addNodeLast()

우리가 addNodeFirst 를 통해 node1 은 연결 됬다고 놨다고 생각하자 !

addNodeLast()

현재 구조

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

addNodeLast()

addNodeLast 호출

addNodeLast()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node2(NULL)

data(20)

next(NULL)

addNodeLast()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node2(NULL)

data(20)

next(NULL)

head 와 tail 은 node1 을 가르키고 있다

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

addNodeLast()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

node2(NULL)

data(20)

next(NULL)

+

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

node2(NULL)

data(20)

next(NULL)

+

addNodeLast()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(node2)

node2(NULL)

data(20)

next(NULL)

+

(*tail)->next 는 그림 속의 node1->next 나 같은 의미다 즉 node2 를 가르킨다

addNodeLast()

head(node1)

data(0)

next(NULL)

tail(node2)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

node2(NULL)

data(20)

next(NULL)

+

이 구문을 통해 ,(*tail) 는 node2 의 주소 값을 가르킨다

addNodeLast()

*head(node2)

data(0)

next(NULL)

약간 위치를 정리하면…

node1(NULL)

data(10)

next(node2)

node2(NULL)

data(20)

next(NULL)

*tail(node2)

data(0)

next(NULL)

addNodeLast()

*head(node1)

data(0)

next(NULL)

더 정리하면… 맨 마지막 생성 된 것이 맨 뒤에 연결 된다 !

node1(NULL)

data(10)

next(node2)

node2(NULL)

data(20)

next(NULL)

*tail(node2)

data(0)

next(NULL)

마무리• 기본적인 Linked List 삽입 구조만 정확히 이해 했다면 index 삽입 , 삭제 , 이중 링크드리스트 , 순환 링크드리스트도 충분히 이해 할 수 있습니다 .• 다음시간에는 index 삽입 , 삭제 관련된 자료를 준비하겠습니다 .

top related