54
Simple LinkedList from C 창창창 창창창창창창창 창창창

단순 Linked list

Embed Size (px)

Citation preview

Page 1: 단순 Linked list

Simple LinkedList from C

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

Page 2: 단순 Linked list

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

Page 3: 단순 Linked list

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

Page 4: 단순 Linked list

기본 타입

Page 5: 단순 Linked list

기본 타입

Node

data next

Page 6: 단순 Linked list

기본 타입Node

data next

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

Page 7: 단순 Linked list

기본 타입node

(NULL)

data(0)

next(NULL)

Page 8: 단순 Linked list

HEAD, TAIL

head(NULL)

data(0)

next(NULL)

tail(NULL)

data(0)

next(NULL)

Page 9: 단순 Linked list

메모리 할당 malloc

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

Page 10: 단순 Linked list

메모리 할당 malloc

Page 11: 단순 Linked list

newNode()

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

Page 12: 단순 Linked list

newNode()

node1(NULL)

data(0)

next(NULL)

Page 13: 단순 Linked list

newNode()

node1(NULL)

data(10)

next(NULL)

Page 14: 단순 Linked list

newNode()

node1(NULL)

data(10)

next(NULL)

Page 15: 단순 Linked list

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

Page 16: 단순 Linked list

맨 앞에 노드추가

Page 17: 단순 Linked list

addNodeFirst()

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

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

Page 18: 단순 Linked list

addNodeFirst()

Page 19: 단순 Linked list

addNodeFirst()

head(NULL)

data(0)

next(NULL)

Page 20: 단순 Linked list

addNodeFirst()

head(NULL)

data(0)

next(NULL)

tail(NULL)

data(0)

next(NULL)

Page 21: 단순 Linked list

addNodeFirst()

head(NULL)

data(0)

next(NULL)

tail(NULL)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

Page 22: 단순 Linked list

addNodeFirst()

addNodeFirst 호출

Page 23: 단순 Linked list

addNodeFirst()

head(NULL)

data(0)

next(NULL)

tail(NULL)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

Page 24: 단순 Linked list

addNodeFirst()

*head(NULL)

data(0)

next(NULL)

*tail(NULL)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

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

Page 25: 단순 Linked list

addNodeFirst()

*head(NULL)

data(0)

next(NULL)

*tail(NULL)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

Page 26: 단순 Linked list

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 의 주소 값을 가르킨다

Page 27: 단순 Linked list

addNodeFirst()*head

(node1)

data(0)

next(NULL)

node(NULL)

data(0)

next(NULL)

*tail(node1)

data(0)

next(NULL)

Page 28: 단순 Linked list

addNodeFirst()*head

(node1)

data(0)

next(NULL)

*tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

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

Page 29: 단순 Linked list

addNodeFirst()*head

(node1)

data(0)

next(NULL)

*tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

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

Page 30: 단순 Linked list

addNodeFirst()

addNodeFirst 호출

Page 31: 단순 Linked list

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node2(NULL)

data(20)

next(NULL)

Page 32: 단순 Linked list

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node2(NULL)

data(20)

next(NULL)

Page 33: 단순 Linked list

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node2(NULL)

data(20)

next(NULL)

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

Page 34: 단순 Linked list

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

Page 35: 단순 Linked list

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)

+

Page 36: 단순 Linked list

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)

+

Page 37: 단순 Linked list

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)다 !!

Page 38: 단순 Linked list

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 의 주소 값을 가르킨다

Page 39: 단순 Linked list

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)

Page 40: 단순 Linked list

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)

Page 41: 단순 Linked list

addNodeLast()

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

Page 42: 단순 Linked list

addNodeLast()

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

Page 43: 단순 Linked list

addNodeLast()

현재 구조

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

Page 44: 단순 Linked list

addNodeLast()

addNodeLast 호출

Page 45: 단순 Linked list

addNodeLast()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node2(NULL)

data(20)

next(NULL)

Page 46: 단순 Linked list

addNodeLast()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node2(NULL)

data(20)

next(NULL)

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

Page 47: 단순 Linked list

addNodeFirst()

head(node1)

data(0)

next(NULL)

tail(node1)

data(0)

next(NULL)

node1(NULL)

data(10)

next(NULL)

Page 48: 단순 Linked list

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)

+

Page 49: 단순 Linked list

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)

+

Page 50: 단순 Linked list

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 를 가르킨다

Page 51: 단순 Linked list

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 의 주소 값을 가르킨다

Page 52: 단순 Linked list

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)

Page 53: 단순 Linked list

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)

Page 54: 단순 Linked list

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