1장. 리스트

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

슬라이드 1

Microsoft PowerPoint - 06-List.ppt

4장

슬라이드 1

슬라이드 1

슬라이드 1

슬라이드 1

슬라이드 1

06장.리스트

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

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

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

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

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

슬라이드 1

C 언어 강의노트

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

chap 5: Trees

11장 포인터

슬라이드 1

<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

Chapter 4. LISTS

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

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

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

Microsoft PowerPoint - chap4_list

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

03_queue

Algorithms

Chapter 4. LISTS

Microsoft PowerPoint - 08-chap06-Queue.ppt

<4D F736F F F696E74202D FBFACB0E120C0DAB7E1B1B8C1B6205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 08-Queue.ppt

중간고사 (자료 구조)

슬라이드 1

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

Microsoft PowerPoint - 자료구조2008Chap06

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

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

Chapter 4. LISTS

슬라이드 1

슬라이드 1

01_List

Microsoft PowerPoint - 07-chap05-Stack.ppt

chap 5: Trees

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

03장.스택

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

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch07 - 포인터 pm0415

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

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

PowerPoint 프레젠테이션

슬라이드 1

03장.스택.key

Microsoft PowerPoint - chap06-2pointer.ppt

Chap 6: Graphs

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

02장.배열과 클래스

슬라이드 1

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

11장 포인터

7장

설계란 무엇인가?

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

4장

08장.트리

Microsoft PowerPoint - 제3장-배열.pptx

untitled

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

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

Microsoft PowerPoint - 05-chap03-ArrayAndPointer.ppt

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

adfasdfasfdasfasfadf

슬라이드 1

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

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

Microsoft PowerPoint - chap-11.pptx

슬라이드 1

PowerPoint 프레젠테이션

Frama-C/JESSIS 사용법 소개

슬라이드 1

Chap 6: Graphs

chap x: G입력

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

untitled

금오공대 컴퓨터공학전공 강의자료

슬라이드 1

Chap 6: Graphs

슬라이드 1

04장.큐

Microsoft PowerPoint - ch08_큐 [호환 모드]

Microsoft PowerPoint - Chap5 [호환 모드]

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

PowerPoint 프레젠테이션

PowerPoint Template

Transcription:

01. 링크드리스트 02. 더블링크드리스트 03. 환형링크드리스트

배열과는달리유연하게크기를바꿀수있는자료구조 각노드는다음노드를가리키는포인터를가짐. 각노드를다음노드를가리키는포인터로연결하여만든리스트. Single Linked List 라고도함.

링크드리스트의첫번째노드를헤드 (Head), 마지막노드를테일 (Tail) 이라고한다.

C 언어로표현하는링크드리스트의노드 typedef struct tagnode int Data; /* 데이터필드 */ struct tagnode* NextNode; /* 다음노드를가리키는포인터 */ Node; 노드추가

노드삭제

노드삽입

각노드가앞노드 / 뒷노드양쪽에대한포인터를모두갖고있어각노드들을이중으로연결하는리스트.

노드추가... 12 테일 노드추가... 12 87 테일 새로추가된테일은 PrevNode 에 12 노드의주소를저장한다.

노드삭제

노드삭제 삽입 12 98 87... 12 98 87...

우로보로스처럼머리 ( 헤드 ) 가꼬리 ( 테일 ) 를물고있는형태의링크드리스트

노드추가 최초의노드를추가하는경우 ( 즉, 노드가한개뿐 ) 리스트에노드가이미한개이상존재하는경우에는 테일노드뒤에새노드를붙인다 보다는 테일과헤드사이에새노드를삽입한다.

노드추가코드 void CDLL_AppendNode(Node** Head, Node* NewNode) /* 헤드노드가 NULL 이라면새로운노드가 Head */ if ( (*Head) == NULL ) *Head = NewNode; (*Head)->NextNode = *Head; (*Head)->PrevNode = *Head; else /* 테일과헤드사이에 NewNode 를삽입한다. */ Node* Tail = (*Head)->PrevNode; Tail->NextNode->PrevNode = NewNode; Tail->NextNode = NewNode; NewNode->NextNode = (*Head); NewNode->PrevNode = Tail; /* 기존의테일을새로운 */ /* 테일의 PrevNode 가가리킨다. */

노드삭제코드 void CDLL_RemoveNode(Node** Head, Node* Remove) if ( *Head == Remove ) (*Head)->PrevNode->NextNode = Remove->NextNode; (*Head)->NextNode->PrevNode = Remove->PrevNode; *Head = Remove->NextNode; Remove->PrevNode = NULL; Remove->NextNode = NULL; else Node* Temp = Remove; Remove->PrevNode->NextNode = Temp->NextNode; Remove->NextNode->PrevNode = Temp->PrevNode; Remove->PrevNode = NULL; Remove->NextNode = NULL;

리스트 (list), 선형리스트 (linear list): 순서를가진항목들의모임 집합 : 항목간의순서의개념이없음 L = n ( item 0, item 1,..., item 1 ) 리스트의예 요일 : ( 일요일, 월요일,, 토요일 ) 한글자음의모임 : ( ㄱ, ㄴ,, ㅎ ) 카드 : (Ace, 2,3,,King) 핸드폰의문자메시지리스트

새로운항목을리스트의끝, 처음, 중간에추가한다. 기존의항목을리스트의임의의위치에서삭제한다. 모든항목을삭제한다. 기존의항목을대치한다. 리스트가특정한항목을가지고있는지를살핀다. 리스트의특정위치의항목을반환한다. 리스트안의항목의개수를센다. 리스트가비었는지, 꽉찼는지를체크한다. 리스트안의모든항목을표시한다.

객체 : 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) ::= 리스트의모든요소를표시한다.

a a b a b c addtail(list1,a) addtail(list1,b) add(list1,2,c) a d b c a d c a e c add(list1,1,d) delete(list1,2) replace(list1,1,e)

void main() int i, n; // list2를생성한다 : 구현방법에따라약간씩다름 ListType list2; add_tail(&list2," 마요네즈 ); // 리스트의포인트를전달 add_tail(&list2," 빵 ); add_tail(&list2," 치즈 ); add_tail(&list2," 우유 ); display(&list2); n = get_length(&list2); printf(" 쇼핑해야할항목수는 %d입니다.\n", n); for(i=0;i<n;i++) printf("%d항목은 %s입니다.,i,get_entry(&list2,i));

배열을이용하는방법 구현이간단 삽입, 삭제시오버헤드 항목의개수제한 연결리스트를이용하는방법 구현이복잡 삽입, 삭제가효율적 크기가제한되지않음 리스트 ADT 배열을이용한구현 a b c a b c 연결리스트를이용한구현 a b c NULL

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

항목들의타입은 element 로정의 list 라는 1 차원배열에항목들을차례대로저장 length 에항목의개수저장 typedef int element; typedef struct int list[max_list_size]; int length; ArrayListType; // 배열정의 // 현재배열에저장된항목들의개수 // 리스트초기화 void init(arraylisttype *L) L->length = 0;

is_empty 연산과 is_full 연산의구현 // 리스트가비어있으면 1 을반환 // 그렇지않으면 0 을반환 int is_empty(arraylisttype *L) return L->length == 0; // 리스트가가득차있으면 1 을반환 // 그렇지많으면 1 을반환 int is_full(arraylisttype *L) return L->length == MAX_LIST_SIZE;

1. add 함수는먼저배열이포화상태인지를검사하고삽입위치가적합한범위에있는지를검사한다. 2. 삽입위치다음에있는자료들을한칸씩뒤로이동한다.. N 0 1 2 3 4 5 A B C D E position length-1 // position: 삽입하고자하는위치 // item: 삽입하고자하는자료 void add(arraylisttype *L, int position, element item) if(!is_full(l) && (position >= 0) && (position <= L->length) ) int i; for(i=(l->length-1); i>=position;i--) L->list[i+1] = L->list[i]; L->list[position] = item; L->length++; A B C D E A B C D E A B C D E A B N C D E

1. 삭제위치를검사한다. 2. 삭제위치부터맨끝까지의자료를한칸씩앞으로옮긴다. // position: 삭제하고자하는위치 // 반환값 : 삭제되는자료 element delete(arraylisttype *L, int position) int i; element item; 0 1 2 3 4 5 A B C D E C A B D E position length-1 if( position < 0 position >= L->length ) error(" 위치오류 "); item = L->list[position]; for(i=position; i<(l->length-1);i++) L->list[i] = L->list[i+1]; L->length--; return item; A B D E A B D E

리스트 ADT의연산을연결리스트를이용하여구현리스트 ADT의 add, delete 연산의파라미터는위치연결리스트의 insert_node, remove_node의파리미터는노드포인터상황에따라연산을적절하게선택하여야함 사용자 add( 항목의위치 ) delete( 항목의위치 ) 리스트 ADT insert_node( 노드포인터 ) remove_node( 노드포인터 ) 연결리스트

첫번째노드를가리키는헤드포인터 typedef struct ListNode *head; int length; ListType; // 헤드포인터 // 노드의개수 ListType list1; 연결리스트내의존재하는노드의개수 리스트 ADT 의생성

int is_empty(listtype *list) if( list->head == NULL ) return 1; else return 0; // 리스트의항목의개수를반환한다. int get_length(listtype *list) return list->length;

새로운데이터를임의의위치에삽입항목의위치를노드포인터로변환해주는함수 get_node_at 필요 // 리스트안에서 pos 위치의노드를반환한다. ListNode *get_node_at(listtype *list, int pos) int i; ListNode *tmp_node = list->head; if( pos < 0 ) return NULL; for (i=0; i<pos; i++) tmp_node = tmp_node->link; return tmp_node; // 주어진위치에데이터를삽입한다. void add(listtype *list, int position, element data) ListNode *p; if ((position >= 0) && (position <= list->length)) ListNode*node= if( node == NULL ) error(" 메모리할당에러 "); node->data = data; p = get_node_at(list, position-1); insert_node(&(list->head), p, node); list->length++; (ListNode *)malloc(sizeof(listnode));

임의의위치의데이터를삭제항목의위치를노드포인터로변환해주는함수 get_node_at 필요 // 주어진위치의데이터를삭제한다. void delete(listtype *list, int pos) if (!is_empty(list) && (pos >= 0) && (pos < list->length)) ListNode *p = get_node_at(list, pos-1); remove_node(&(list->head),p,(p!=null)?p->link:null); list->length--;