<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

Similar documents
Chapter 4. LISTS

슬라이드 1

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

리스트 (list), 선형리스트 (linear list): 순서를가진항목들의모임 집합 : 항목간의순서의개념이없음 L = n ( item0, item1,..., item -1) l 리스트의예 l 요일 : ( 일요일, 월요일,, 토요일 ) l 한글자음의모임 : ( ㄱ, ㄴ

1장. 리스트

Algorithms

chap 5: Trees

<4D F736F F F696E74202D FBFACB0E120C0DAB7E1B1B8C1B6205BC8A3C8AF20B8F0B5E55D>

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

06장.리스트

Chapter 4. LISTS

11장 포인터

슬라이드 1

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

1. 리스트개념 리스트 (list) 고정된길이의자료 ( 원소 ) 들을순차적으로나열해놓은집합을가르키는자료구조의추상적인개념 순서를가진항목들의모임 집합 (set) : 항목간의순서의개념이없음 리스트의예 요일 : ( 일요일, 월요일,, 토요일 ) 한글자음의모임 : (ᄀ,ᄂ,,ᄒ

리스트구현방법 배열 (array) 을이용하는방법 구현이간단 삽입, 삭제동작에따른원소이동. 항목의개수제한, 정적기억공간할당. 메모리낭비, 오버플로우 연결리스트 (linked list) 를이용하는방법 구현이복잡 삽입, 삭제가효율적 크기가제한되지않음 Lecture 03_Li

Microsoft PowerPoint - chap4_list

Chapter 4. LISTS

q 이장에서다룰내용 1 연결자료구조방식 2 단순연결리스트 3 원형연결리스트 4 이중연결리스트 3 다항식의연결자료구조표현 2

리스트연산, 검색 + 삽입 + 삭제 새로운항목을리스트의처음, 중간, 끝에추가. 기존의항목을리스트의임의의위치에서삭제. 모든항목을삭제. 기존항목을대치 (replace). 리스트가특정항목을가지고있는지를검색 (search). 리스트의특정위치의항목을반환. 리스트안의항목의개수를센

슬라이드 1

Microsoft PowerPoint - 자료구조2008Chap06

Lab 3. 실습문제 (Single linked list)_해답.hwp

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

4장

C 언어 강의노트

슬라이드 1

슬라이드 1

중간고사 (자료 구조)

Microsoft PowerPoint - 06-List.ppt

슬라이드 1

슬라이드 1

슬라이드 1

Contents v 학습목표 자료구조큐에대한개념을스택과비교하여이해한다. 큐의특징과연산방법에대해알아본다. 순차표현방법을이용한큐와연결표현방법을이용한큐를구현해본다. 큐의응용방법을알아본다. v 내용 큐 큐의구현 큐의응용 2/74

Microsoft PowerPoint - 08-Queue.ppt

Microsoft PowerPoint - 08-chap06-Queue.ppt

슬라이드 1

Lab 5. 실습문제 (Double linked list)-1_해답.hwp

01_List

PowerPoint 프레젠테이션

03_queue

슬라이드 1

PowerPoint 프레젠테이션

o 스택 (stack) ~ 쌓아놓은더미 1. 스택의개요 - 2 -

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

슬라이드 1

Microsoft PowerPoint - 제6장-연결리스트.pptx

Chap 6: Graphs

PowerPoint 프레젠테이션

설계란 무엇인가?

chap01_time_complexity.key

Microsoft PowerPoint - 제8장-트리.pptx

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

7장

untitled

PowerPoint Template

Microsoft PowerPoint - ch07 - 포인터 pm0415

5.스택(강의자료).key

Chap 6: Graphs

Microsoft PowerPoint - ch08_큐 [호환 모드]

슬라이드 1

chap 5: Trees


Chap 6: Graphs

Microsoft PowerPoint - 07-chap05-Stack.ppt

Frama-C/JESSIS 사용법 소개

슬라이드 1

Microsoft PowerPoint - 자료구조2008Chap07

Microsoft PowerPoint - 제3장-배열.pptx

슬라이드 1

Microsoft PowerPoint - 제9장-트리의응용.pptx

ABC 10장

Microsoft PowerPoint - chap06-1Array.ppt

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

<4D F736F F F696E74202D20C0DAB7E1B1B8C1B65FC3E2BCAEBCF6BEF7>

PowerPoint 프레젠테이션

02장.배열과 클래스

슬라이드 1

Microsoft PowerPoint - chap-11.pptx

Chapter #01 Subject

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

4장

Microsoft PowerPoint - 제11장 포인터(강의)

중간고사

Microsoft PowerPoint - chap11-포인터의활용.pptx

PowerPoint 프레젠테이션

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

K&R2 Reference Manual 번역본

Microsoft PowerPoint - chap10-함수의활용.pptx

08장.트리

슬라이드 1

슬라이드 1

Microsoft PowerPoint - 제11장 포인터

11장 포인터

03장.스택.key

Microsoft PowerPoint - Chap5 [호환 모드]

e-비즈니스 전략 수립

Transcription:

제 7 강의. 고급연결리스트 1. 원형연결리스트 2. 이중연결리스트 3. 연결리스트알고리즘 1

1. 원형연결리스트 (Circularly Linked Lists) 원형연결리스트란? 연결리스트의맨끝노드를첫번째노드와연결시켜서원형으로만든리스트 단순연결리스트 (Singly Linked List) 불편한점 - 연결리스트의노드포인터를알고있을때첫번째노드는바로찾아갈수있지만마지막노드는리스트전체를따라가면서끝을찾아가야한다 ( 즉 n 번의링크를따라가야한다, O(n)). 마지막데이터를찾을때, 마지막다음에데이터를삽입할때등의경우에불편함이있다. ptr x1 x2 x3 NULL 단순연결리스트의마지막노드를끝노드와연결시키면? 단순연결리스트를끝노드와연결시키면상황은마찬가지이지만리스트의포인터를마지막노드를가리키면바로찾을수있다. 리스트의첫노드는마지막노드의다음노드이므로리스트의첫노드도바로찾을수있다.( 원형연결리스트의포인터는항상마지막노드를가리켜야한다는점을주의하라.) 2

연결리스트처음과마지막에노드삽입 / 삭제 연결리스트의맨처음과맨마지막에노드를삽입, 삭제할경우노드수 n 과관계 노드를삭제하려면앞노드의주소를알아야한다. 단순 / 원형연결리스트 삽입 삭제 맨처음 O(1) O(1) 맨마지막 O(n)/O(1) O(n) 단순연결리스트 ptr x1 x2 x3 원형연결리스트 x1 x2 x3 ptr 3

단순원형연결리스트 (singly circular linked list) 의예 리스트를원형으로만든다음리스트의포인터를마지막을가리킨다. 그런후리스트의처음과마지막에노드를삽입하는경우를살펴보자 ptr x1 x2 x3 x1 x2 x3 ptr (1) 리스트의처음에삽입 O(1) : 수행시간이상수시간이걸린다. x3 다음에삽입한다. (2) 리스트의마지막에삽입 O(1) : 수행시간이상수시간이걸린다. x3 다음에삽입한다. ptr 값을새로삽입한노드를가리킨다. 4

단순원형연결리스트 (singly circular linked list) 의여러가지모습 (1) ptr (2) ptr x1 (3) x1 x2 x3 ptr 5

수행시간표기법 수행시간이데이터개수에따라어떻게변하는가를나타내는표기로 O- 표기법을사용한다. O(1) - 상수시간 : 항상똑같을때 O(n) 데이터개수 n 의 1 차함수보다크지않을때 O(n 2 ) 데이터개수 n 의이차함수 (n 2 ) 보다크지않을때 즉 O(f(n)) 수행시간이라함은수행시간이많이걸려야 f(n) 함수보다는작거나같다는의미이다. 즉프로그램수행이얼마나오래걸릴것인지에대한척도이다. 6

/* 원형연결리스트의맨뒤에노드를삽입하는알고리즘 */ void insert_last(list_ptr *ptr, list_ptr node) { if(is_empty(*ptr)) { /* 빈리스트경우 */ *ptr = node; node->link = node; else { node->link = (*ptr)->link; /* 1 */ (*ptr)->link = node; /* 2 */ /* 노드연결 */ *ptr = node; /* 3 */ /* 리스트의맨처음에삽입할경우이문장을생략 */ X 2 x1 x2 x3 Y X 3 ptr node 1 7

Q/A ( 실험 1) circularlist.c 프로그램실행 ( 실험 2) 원형연결리스트의맨앞에노드를삭제하는알고리즘작성 void delete_first(list_ptr *ptr,list_ptr node) { if(is_empty(*ptr)) { printf( 원소없음 n ); /* 빈리스트경우 */ else { /* 여기작성 */ X x1 x2 x3 ptr 8

2. 이중연결리스트 (Doubly Linked List) 이중연결리스트란? 연결리스트의각노드에링크를 2 개를만들어하나는뒷노드를하나는앞노드를가리키는연결리스트이다. 단순연결리스트 (Singly Linked List) 는다음과같은경우불편한점이있다. 단순연결리스트의노드포인터를알고있을때노드의다음노드는찾아갈수있지만, 노드의앞노드는찾아갈수없다. 앞노드를찾아가려면리스트의처음부터따라가야한다. ( 즉노드의위치만큼링크를따라가야한다 O(n)). 즉, 임의의노드의앞노드를찾아가는데시간이걸린다. 단순연결리스트의각노드에앞노드의링크를저장하면? 단순연결리스트의각노드에두개의노드포인터를두어서하나를앞쪽노드를하나는뒤쪽노드를가리키어앞뒤어느방향으로나갈수있도록만든리스트이다. 9

단순연결리스트의문제점 - 한쪽방향으로만노드를따라간다.( 앞에서뒤로 ) - 앞노드를찾으려면처음부터링크를따라와야한다. - 임의의노드를지우기어렵다 ( 노드를지우려면앞, 뒤노드포인터를알아야한다.) 해결방법 - 원형연결리스트 - 이중연결리스트 - 이중원형연결리스트 (doubly linked circular list) 10

/* 이중연결리스트를위한노드의선언 */ struct dnode { struct dnode *llink; element item; struct dnode *rlink; ; typedef struct dnode node; typedef node *node_ptr; ptr 이이중연결리스트의임의의노드를가리킨다고가정하자이중연결리스트에서는다음의식이성립한다. ptr = ptr->llink->rlink = ptr->rlink->llink ptr 11

이중연결리스트의처음시작때는 ( 노드가하나도없는경우 ) 가상의노드에서부터시작한다. 이데이터가없는가상의노드를 dummy node 라고한다. 보통은 head node( 머리노드 ) 라고한다. - 비어있는리스트경우 head node 만있다. - 프로그램의편의를위하여만들어놓은것이다. - 노드와같은자료구조이나데이터값이없다. 비어있는이중연결리스트 노드가한개추가된후의리스트 ptr ptr 12

머리노드를가진이중원형연결리스트의모양 - 헤드노드의 llink 는앞노드 ( 리스트의마지막노드를가리킨다 ) rlink는다음노드 ( 리스트의첫노드를가리킨다 ) head llink item rlink 13

/* 이중원형연결리스트에노드를삽입하는프로그램삽입할노드의바로앞노드만알면된다.*/ void dinsert(node_ptr node,node_ptr newnode) { /* node 의오른쪽에 newnode 를삽입 */ newnode->llink = node; /* 1 */ newnode->rlink = node->rlink; /* 2 */ node->rlink->llink = newnode; /* 3 */ node->rlink = newnode; /* 4 */ head llink item rlink 4 X X 3 node 1 2 newnode 14

비어있는이중연결리스트에노드의삽입 node node newnode 15

이중연결리스트에서노드의삭제 void ddelete(node_ptr node,node_ptr deleted) { /* 이중연결리스트에서의 deleted 노드삭제 */ if(node == deleted) printf( 머리노드삭제금지... n ); else { deleted->llink->rlink = deleted->rlink; /* 1 */ deleted->rlink->llink = deleted->llink; /* 2 */ free(deleted); /* 3 */ 16

한개의노드를가진이중연결리스트에서노드의삭제 2 1 node node X X deleted 3 free() 노드를반환 17

Q/A ( 실험 1) dlinkedlist.c 프로그램실행 ( 실험 2) 이중연결리스트의노드의수를세는알고리즘작성 int countdouble(node_ptr node) { if(node->rlink==node) return 0; else { /*? */ node llink item rlink 18

3. 연결리스트알고리즘들 3-1. 연결리스트를역순으로만들기 연결리스트의역배열을위한프로그램 /* 연결리스트의링크를거꾸로만드는프로그램을작성하여본다 */ /* 리스트노드선언부분 */ struct node { char data; struct node * link; ; typedef struct node list_node; typedef list_node * list_ptr; 19

연결리스트의역배열을위한프로그램 수행시간 : O(n) list_ptr invert(list_ptr lead) { list_ptr middle, trail; middle = NULL; while(lead) { trail = middle; middle = lead; lead = lead->link; middle->link = trail; return middle; 20

middle lead NULL NULL trail middle lead NULL NULL trail middle lead 21

NULL NULL trail middle lead NULL NULL trail middle lead NULL NULL trail middle lead 22

3-2. 두개의연결리스트를한개의연결리스트로연결 ptr1 1 3 5 7 1 ptr2 2 4 6 8 23

2 개의연결리스트연결프로그램 /* 두개의리스트를연결해서새로운리스트만든다 */ /* ptr1에 ptr2를붙인다 */ list_ptr concat(list_ptr ptr1,list_ptr ptr2) { list_ptr temp; if(!ptr1 ) return ptr2; else { if( ptr2 ) { for(temp=ptr1; temp->link; temp=temp->link); temp->link = ptr2; 1 return ptr1; 24

3-3. 원형연결리스트의노드개수세기 /* 아래의연결리스트의 ptr 값을주면결과는 3을반환한다.*/ int length(list_ptr ptr) { list_ptr temp; int count = 0; if(ptr) { temp = ptr; 원형리스트의노드의개수세기 do { count++; temp = temp->link; while(temp!= ptr); return count; x1 x2 x3 ptr 25

Review 단순연결리스트의단점을극복하는리스트구조는다음과같다. (1) 연결리스트의끝에서작업하기편리한원형연결리스트연결리스트에서마지막노드가끝노드를가리키게하며리스트의포인터를맨끝노드를가리킨다. (2) 임의의노드의앞뒤작업을편리하게하기위한이중연결리스트연결리스트의각노드에앞과뒤로가는링크를만들어놓은리스트이다. (3) 원형과이중연결리스트의두가지장점을동시에갖는이중원형연결리스트가있다. 원형과이중연결리스트두가지구조를동시에갖는다. 즉각노드에두개의링크를두면서마지막노드와첫노드도연결시킨다. 또머리노드라는가상의노드를운영한다. 연결리스트프로그래밍은약간복잡하다. 링크와노드의구조를잘이해하면기계적이다. 26