슬라이드 1

Similar documents
4장

슬라이드 1

Microsoft PowerPoint - 06-List.ppt

슬라이드 1

슬라이드 1

슬라이드 1

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

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

슬라이드 1

Microsoft PowerPoint - chap4_list

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

1장. 리스트

슬라이드 1

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

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

06장.리스트

C 언어 강의노트

11장 포인터

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

chap 5: Trees

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

<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

<4D F736F F F696E74202D FBFACB0E120C0DAB7E1B1B8C1B6205BC8A3C8AF20B8F0B5E55D>

슬라이드 1

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

Chapter 4. LISTS

중간고사 (자료 구조)

Chapter 4. LISTS

Algorithms

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

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

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

Microsoft PowerPoint - 08-chap06-Queue.ppt

슬라이드 1

Microsoft PowerPoint - 08-Queue.ppt

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

Chapter 4. LISTS

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

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

슬라이드 1

Microsoft PowerPoint - 자료구조2008Chap06

Microsoft PowerPoint - ch07 - 포인터 pm0415

03_queue

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

chap 5: Trees

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

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

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

PowerPoint 프레젠테이션

11장 포인터

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - 제11장 포인터

01_List

PowerPoint 프레젠테이션

7장

Microsoft PowerPoint - 07-chap05-Stack.ppt

08장.트리

PowerPoint Template

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

슬라이드 1

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

Chap 6: Graphs

Microsoft PowerPoint - chap-11.pptx

Microsoft Word - FunctionCall

슬라이드 1

설계란 무엇인가?

슬라이드 1

Chap 6: Graphs

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

Microsoft PowerPoint - Chapter14_17.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

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

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

Microsoft PowerPoint - 05-chap03-ArrayAndPointer.ppt

슬라이드 1

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

05_tree

Chap 6: Graphs

Frama-C/JESSIS 사용법 소개

02장.배열과 클래스

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

PowerPoint 프레젠테이션

Microsoft PowerPoint - 제8장-트리.pptx

Microsoft PowerPoint - ch08_큐 [호환 모드]

슬라이드 1

Algorithms

03장.스택

Microsoft PowerPoint - 제3장-배열.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

설계란 무엇인가?

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

슬라이드 1

Data structure: Assignment 1 Seung-Hoon Na October 1, Assignment 1 Binary search 주어진 정렬된 입력 파일이 있다고 가정하자. 단, 파일내의 숫자는 공백으로 구 분, file내에 숫자들은

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

PowerPoint 프레젠테이션

e-비즈니스 전략 수립

4장

제 1 장 기본 개념

Transcription:

6-1

리스트 (list) 란순서를가진항목들을표현하는자료구조 리스트를구현하는두가지방법 배열 (array) 을이용하는방법 구현간단 삽입, 삭제시오버헤드 항목의개수제한 연결리스트 (linked list) 를이용하는방법 구현복잡 삽입, 삭제가효율적 크기가제한되지않음 6-2

객체 : n 개의 element 형으로구성된순서있는모임 연산 : add_last(list, item) ::= 맨끝에요소를추가한다. add_first(list, item) ::= 맨앞에요소를추가한다. add(list, pos, item) ::= pos 위치에요소를추가한다. delete(list, pos) ::= pos 위치의요소를제거한다. clear(list) ::= 리스트의모든요소를제거한다. replace(list, pos, item) ::= pos 위치의요소를 item 로바꾼다. is_in_list(list, item) ::= item 이리스트안에있는지를검사한다. get_entry(list, pos) ::= pos 위치의요소를반환한다. get_length(list) ::= 리스트의길이를구한다. is_empty(list) ::= 리스트가비었는지를검사한다. is_full(list) ::= 리스트가꽉찼는지를검사한다. display(list) ::= 리스트의모든요소를표시한다. 6-3

1 차원배열에항목들을순서대로저장 L=(A, B, C, D, E) 0 1 2 3 4 5 6 7 8 9 A B C D E 삽입연산 : 삽입위치다음의항목들을이동하여야함. N 0 1 2 3 4 5 6 7 8 9 A B C D E 삭제연산 : 삭제위치다음의항목들을이동하여야함 C 0 1 2 3 4 5 6 7 8 9 A B D E 6-4

연결리스트의항목들을노드 (node) 라고하는곳에저장 각노드는데이타필드와링크필드로구성 데이타필드 리스트의원소, 즉데이타값을저장 링크필드 다른노드의주소를저장 ( 포인터 ) 메모리안에서노드의물리적순서가리스트의논리적순서와일치할필요는없음 A C D E B 메모리 6-5

노드 = 데이터필드 + 링크필드 data link 헤드포인터 (head pointer): 리스트의첫번째노드를 가리키는변수 헤드포인터 NULL 노드의생성 : 필요할때마다동적메모리생성 (malloc) 이용하여노드를생성 요구 운영체제 동적생성 헤드포인터 NULL 6-6

삽입연산 장점 삽입, 삭제가보다용이하다. N 연속된메모리공간이필요없다. 크기제한이없다 A C D E 단점 B 구현이어렵다. 오류가발생하기쉽다. 메인메모리 삭제연산 A C D E B 메인메모리 6-7

단순 (simple) 연결리스트 헤드포인터 NULL 원형 (circular) 연결리스트 헤드포인터 이중 (doubly) 연결리스트 헤드포인터 6-8

하나의링크필드를이용하여연결 마지막노드의링크값은 NULL 헤드포인터 10 20 NULL 30 NULL 40 NULL 50 NULL 6-9

before after before after 10 30 10 30 new 20 new 20 insert_node(list, before, new) if List = NULL then List new else new.link before.link before.link new 6-10

before removed after 10 20 30 before removed after 10 20 30 remove_node(list, before, removed) if List NULL then before.link removed.link destroy(removed) 6-11

데이터필드 : 구조체로정의 링크필드 : 포인터사용 typedef int element; typedef struct ListNode { element data; struct ListNode *link; ListNode; 노드의생성 : 동적메모리생성라이브러리 malloc 함수이용 ListNode *p1; p1 = (ListNode *)malloc(sizeof(listnode)); p1 6-12

데이터필드와링크필드설정 p1->data = 10; p1->link = NULL; 두번째노드생성과첫번째노드와의연결 p1 10 NULL ListNode *p2; p2 = (ListNode *)malloc(sizeof(listnode)); p2->data = 20; p2->link = NULL; p1->link = p2; p1 10 20 NULL 헤드포인터 (head pointer): 연결리스트의맨처음노드를가리키는포인터 6-13

삽입함수의프로토타입 void insert_node(listnode **phead, ListNode *p, ListNode *new_node) phead: 헤드포인터 head 에대한포인터 p: 삽입될위치의선행노드를가리키는포인터, 이노드다음에삽입된다. new_node: 새로운노드를가리키는포인터 헤드포인터가함수안에서변경되므로헤드포인터의포인터필요 삽입의 3 가지경우 head가 NULL인경우 : 공백리스트에삽입 p가 NULL인경우 : 리스트의맨처음에삽입 일반적인경우 : 리스트의중간에삽입 6-14

(1) head 가 NULL 인경우 : head 가 NULL 이라면현재삽입하려는 노드가첫번째노드가된다. 따라서 head 의값만변경하면된다.. head new_node NULL (2) p 가 NULL 인경우 : 새로운노드를리스트의맨앞에삽입한다. head NULL NULL new_node NULL 6-15

(3) head 와 p 가 NULL 이아닌경우 : 가장일반적인경우이다. new_node 의 link 에 p->link 값을복사한다음, p->link 가 new_node 를가리키도록한다. p NULL new_node (2) (1) 6-16

// phead: 리스트의헤드포인터의포인터 // p : 선행노드 // new_node : 삽입될노드 void insert_node(listnode **phead, ListNode *p, ListNode *new_node) { if( *phead == NULL ){ new_node->link = NULL; *phead = new_node; else if( p == NULL ){ else { new_node->link = *phead; *phead = new_node; // 공백리스트인경우 // p 다음에삽입 new_node->link = p->link; p->link = new_node; // p 가 NULL 이면첫번째노드로삽입 6-17

삭제함수의프로토타입 //phead: 헤드포인터 head 의포인터 //p: 삭제될노드의선행노드를가리키는포인터 //removed: 삭제될노드를가리키는포인터 void remove_node(listnode **phead, ListNode *p, ListNode *removed) 삭제의 2 가지경우 p 가 NULL 인경우 : 맨앞의노드를삭제 p 가 NULL 이아닌경우 : 중간노드를삭제 6-18

p 가 NULL 인경우 : 연결리스트의첫번째노드를삭제한다. 헤드포인터변경 list NULL removed p가 NULL이아닌경우 : removed 앞의노드인 p의링크가 removed 다음노드를가리키도록변경 p list NULL NULL removed 6-19

// phead : 헤드포인터에대한포인터 // p: 삭제될노드의선행노드 // removed: 삭제될노드 void remove_node(listnode **phead, ListNode *p, ListNode *removed) { if( p == NULL ) *phead = (*phead)->link; else p->link = removed->link; free(removed); 6-20

방문연산 : 리스트상의노드를순차적으로방문반복과순환방법사용가능반복방법 void display(listnode *head) { ListNode *p=head; while( p!= NULL ){ printf("%d->", p->data); p = p->link; printf("\n"); 순환방법 void display_recur(listnode *head) { ListNode *p=head; if( p!= NULL ){ printf("%d->", p->data); display_recur(p->link); 6-21

탐색연산 : 특정한데이터값을갖는노드를찾는연산 head NULL NULL NULL p ListNode *search(listnode *head, int x) { ListNode *p; p = head; while( p!= NULL ){ if( p->data == x ) return p; // 탐색성공 p = p->link; return p; // 탐색실패일경우 NULL 반환 6-22

합병연산 : 2 개의리스트를합하는연산 head1 NULL NULL NULL head2 NULL NULL NULL ListNode *concat(listnode *head1, ListNode *head2) { ListNode *p; if( head1 == NULL ) return head2; else if( head2 == NULL ) return head1; else { p = head1; while( p->link!= NULL ) p = p->link; p->link = head2; return head1; 6-23

역순연산 : 리스트의노드들을역순으로만드는연산 head NULL NULL NULL NULL ListNode *reverse(listnode *head) { // 순회포인터로 p, q, r을사용 ListNode *p, *q, *r; p = head; // p는역순으로만들리스트 q = NULL; // q는역순으로만들노드 while (p!= NULL){ r = q; // r은역순으로된리스트. r은 q, q는 p를차례로따라간다. q = p; p = p->link; q->link =r; // q의링크방향을바꾼다. return q; r q p // q 는역순으로된리스트의헤드포인터 6-24

마지막노드의링크가첫번째노드를가리키는리스트 한노드에서다른모든노드로의접근이가능 head NULL NULL 보통헤드포인터가마지막노드를가리키게끔구성하면리스트의처음이나마지막에노드를삽입하는연산이단순연결리스트에비하여용이 NULL NULL head 6-25

(2) E A B C NULL (1) node // phead: 리스트의헤드포인터의포인터 // p : 선행노드 // node : 삽입될노드 void insert_first(listnode **phead, ListNode *node) { if( *phead == NULL ){ *phead = node; node->link = node; else { node->link = (*phead)->link; (*phead)->link = node; D NULL head 6-26

(2) A B C NULL D NULL E (1) (3) head node // phead: 리스트의헤드포인터의포인터 // p : 선행노드 // node : 삽입될노드 void insert_last(listnode **phead, ListNode *node) { if( *phead == NULL ){ *phead = node; node->link = node; else { node->link = (*phead)->link; (*phead)->link = node; *phead = node; 6-27

단순연결리스트의문제점 : 선행노드를찾기가힘들다 삽입이나삭제시에는반드시선행노드가필요 이중연결리스트 : 하나의노드가선행노드와후속노드에대한두개의링크를가지는리스트 링크가양방향이므로양방향으로검색이가능 단점은공간을많이차지하고코드가복잡 실제사용되는이중연결리스트의형태 : 헤드노드 + 이중연결리스트 + 원형연결리스트 헤드노드 6-28

헤드노드 (head node): 데이터를가지지않고단지삽입, 삭제코드를간단하게할목적으로만들어진노드 헤드포인터와의구별필요 공백상태에서는헤드노드만존재 헤드노드 이중연결리스트에서의노드의구조 typedef int element; typedef struct DlistNode { element data; struct DlistNode *llink; struct DlistNode *rlink; DlistNode; llink data rlink 6-29

before (4) (1) (2) (3) new_node // 노드 new_node 를노드 before 의오른쪽에삽입한다. void dinsert_node(dlistnode *before, DlistNode *new_node) { new_node->llink = before; new_node->rlink = before->rlink; before->rlink->llink = new_node; before->rlink = new_node; 6-30

// 노드 removed 를삭제한다. void dremove_node(dlistnode *phead_node, DlistNode *removed) { if( removed == phead_node ) return; removed->llink->rlink = removed->rlink; removed->rlink->llink = removed->llink; free(removed); 6-31