슬라이드 1

Similar documents
슬라이드 1

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

1장. 리스트

슬라이드 1

슬라이드 1

슬라이드 1

슬라이드 1

4장

Microsoft PowerPoint - 06-List.ppt

06장.리스트

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

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

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

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

슬라이드 1

Microsoft PowerPoint - chap4_list

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

C 언어 강의노트

11장 포인터

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

Chapter 4. LISTS

슬라이드 1

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

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

chap 5: Trees

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

<4D F736F F F696E74202D FBFACB0E120C0DAB7E1B1B8C1B6205BC8A3C8AF20B8F0B5E55D>

중간고사 (자료 구조)

<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

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

Algorithms

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

Microsoft PowerPoint - 08-chap06-Queue.ppt

Chapter 4. LISTS

Microsoft PowerPoint - 08-Queue.ppt

Chapter 4. LISTS

슬라이드 1

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

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

03_queue

Microsoft PowerPoint - 자료구조2008Chap06

02장.배열과 클래스

Microsoft PowerPoint - ch07 - 포인터 pm0415

슬라이드 1

11장 포인터

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

03장.스택.key

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - 05-chap03-ArrayAndPointer.ppt

PowerPoint 프레젠테이션

Chap 6: Graphs

슬라이드 1

01_List

설계란 무엇인가?

PowerPoint 프레젠테이션

슬라이드 1

chap 5: Trees

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

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

슬라이드 1

03장.스택

Microsoft PowerPoint - 07-chap05-Stack.ppt

Microsoft PowerPoint - chap-11.pptx

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

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - chap06-2pointer.ppt

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

Microsoft PowerPoint - Chapter14_17.pptx

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

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

설계란 무엇인가?

PowerPoint 프레젠테이션

untitled

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

C 언어 프로그래밊 과제 풀이

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

untitled

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

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

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

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

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

슬라이드 1

PowerPoint Template

슬라이드 1

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

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

KNK_C_05_Pointers_Arrays_structures_summary_v02

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

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

OCW_C언어 기초

Microsoft Word - FunctionCall

Microsoft PowerPoint - 제3장-배열.pptx

PowerPoint 프레젠테이션

Chap 6: Graphs

중간고사

7장

Transcription:

자료구조 (Data Structures), 4 장. 리스트 담당교수 : 조미경

이번장에서학습할내용 * 리스트란? * 배열로리스트구현 * 연결리스트로리스트구현 * 연결리스트종류 * 연결리스트응용 : 다항식구현 2/63

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

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

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

리스트 ADT 사용예 #1 a a b a b c add_last(list1,a) add_last(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) 6/63

리스트 ADT 사용예 #2 main() { int i, n; // list2 를생성한다 : 구현방법에따라약간씩다름 ListType list2; add_last (&list2," 마요네즈 ); // 리스트의포인트를전달 add_last (&list2," 빵 ); add_last (&list2," 치즈 ); add_last (&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)); 7/63

리스트구현방법 리스트 ADT 배열을이용한구현 a b c a b c 연결리스트를이용한구현 a b c NULL 8/63

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

배열로구현된리스트 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 10/63

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

ArrayListType 의구현 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; 12/63

ArrayListType 의삽입연산 1. add 함수는먼저배열이포화상태인지를검사하고삽입위치가적합한범위에있는지를검사한다. 2. 삽입위치다음에있는자료들을한칸씩뒤로이동한다.. N 0 1 2 3 4 5 A B C D E A B C D E position length-1 A B C D E A B C D E A B N C D E 13/63

ArrayListType 의삽입연산 // 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++; N 0 1 2 3 4 5 A B C D E A B C D E A B C D E A B C D E position length-1 A B N C D E 14/63

ArrayListType 의삭제연산 1. 삭제위치를검사한다. 2. 삭제위치부터맨끝까지의자료를한칸씩앞으로옮긴다. 0 1 2 3 4 5 A B C D E C position length-1 A B D E A B D E A B D E 15/63

ArrayListType 의삭제연산 // position: 삭제하고자하는위치 // 반환값 : 삭제되는자료 element delete(arraylisttype *L, int position) { int i; element item; 0 1 2 3 4 5 A B C D E C 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 A B D E 16/63

리스트표현의 2 가지방법 연결리스트 순차표현 : 배열을이용한리스트표현 연결된표현 : 연결리스트를사용한리스트표현, 하나의노드가데이터와링크로구성되어있고링크가노드들을연결한다. 리스트 ADT 배열을이용한구현 a b c a b c 연결리스트를이용한구현 a b c NULL 17/63

연결된표현 리스트의항목들을노드 (node) 라고하는곳에분산하여저장 다음항목을가리키는주소도같이저장 노드 (node) : < 항목, 주소 > 쌍 노드는데이타필드와링크필드로구성 데이타필드 리스트의원소, 즉데이터값을저장하는곳 링크필드 다른노드의주소값을저장하는장소 ( 포인터 ) 메모리안에서의노드의물리적순서가리스트의논리적순서와일치할필요없음 A C D E B 메인메모리 18/63

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

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

연결리스트의종류 헤드포인터 NULL 단순연결리스트 헤드포인터 원형연결리스트 헤드포인터 이중연결리스트 21/63

단순연결리스트 하나의링크필드를이용하여연결 마지막노드의링크값은 NULL 헤드포인터 L 10 20 NULL 30 NULL 40 NULL 50 NULL 22/63

단순연결리스트 ( 삽입연산 ) before before 10 30 10 30 20 new 20 new 23/63

단순연결리스트 ( 삭제연산 ) before removed 10 20 30 before removed 10 20 30 24/63

단순연결리스트의구현 데이터필드 : 구조체로정의 링크필드 : 포인터사용 노드의생성 : 동적메모리생성라이브러리 malloc 함수이용 p1 25/63

단순연결리스트의구현 데이터필드와링크필드설정 p1 10 NULL 두번째노드생성과첫번째노드와의연결 p1 10 20 NULL 26/63

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

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

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

삽입연산의코드 // 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 ){ // p 가 NULL 이면첫번째노드로삽입 new_node->link = *phead; *phead = new_node; else { // p 다음에삽입 new_node->link = p->link; p->link = new_node; 30/63

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

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

삭제연산코드 // 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); 33/63

방문연산코드 방문연산 : 리스트상의노드를순차적으로방문 반복과순환기법을모두사용가능 반복버전 void display(listnode *head) { ListNode *p=head; while( p!= NULL ){ printf("%d->", p->data); p = p->link; printf("\n"); 34/63

방문연산코드 순환버전 void display_recur( ListNode *head ) { ListNode *p=head; if( p!= NULL ){ printf("%d->", p->data); display_recur(p->link); 35/63

탐색연산코드 탐색연산 : 특정한데이터값을갖는노드를찾는연산 head NULL NULL NULL p 탐색성공 탐색실패일경우 반환 36/63

합병연산코드 합병연산 : 2 개의리스트를합하는연산 head1 NULL NULL NULL head2 NULL NULL NULL 37/63

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

리스트의처음에삽입 (2) E A B C D (1) head new_node 리스트의헤드포인터의포인터삽입될노드 39/63

리스트의끝에삽입 (2) E A B C D (1) new_node (3) head 리스트의헤드포인터의포인터삽입될노드 40/63

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

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

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

삭제연산 // 노드 removed 를삭제한다. void dremove_node(dlistnode *phead_node, DlistNode *removed) { if( removed == phead_node ) return; removed->llink->rlink = removed->rlink; //(1) removed->rlink->llink = removed->llink; //(2) free(removed); 44/63

연결리스트의응용 : 다항식 다항식을컴퓨터로처리하기위한자료구조 다항식의덧셈, 뺄셈 하나의다항식을하나의연결리스트로표현 A=3x 12 +2x 8 +1 A 3 12 2 8 1 0 NULL typedef struct ListNode { int coef; int expon; struct ListNode *link; ListNode; ListNode *A, *B; 45/63

다항식의덧셈구현 2 개의다항식을더하는덧셈연산을구현 A=3x 12 +2x 8 +1, B=8x 12-3x 10 +10x 6 이면 A+B=11x 12-3x 10 +2x 8 +10x 6 +1 다항식 A 와 B 의항들을따라순회하면서각항들을더한다. 1 p.expon == q.expon : 두계수를더해서 0 이아니면새로운항을만들어결과다항식 C 에추가한다. 그리고 p 와 q 는모두다음항으로이동한다. 2 p.expon < q.expon : q 가지시하는항을새로운항으로복사하여결과다항식 C 에추가한다. 그리고 q 만다음항으로이동한다. 3 p.expon > q.expon : p 가지시하는항을새로운항으로복사하여결과다항식 C 에추가한다. 그리고 p 만다음항으로이동한다. 46/63

다항식의덧셈 A 3 12 2 8 1 0 NULL p B 8 12-3 10 10 6 NULL q C 11 12 r A 3 12 2 8 1 0 NULL B p 8 12-3 10 10 6 NULL C 11 12 q -3 10 r 47/63

다항식의덧셈 A 3 12 2 8 1 0 NULL p B 8 12-3 10 10 6 NULL q C 11 12-3 10 2 8 r A 3 12 2 8 1 0 p NULL p 나 q 중에서어느하나가 NULL 이되면아직남아있는항들을전부 C 로가져온다. B 8 12-3 10 10 6 NULL C 11 12-3 10 2 8 10 6 q 1 0 NULL 48/63 r

다항식프로그램 #include <stdio.h> #include <stdlib.h> // 연결리스트의노드의구조 typedef struct ListNode { int coef; int expon; struct ListNode *link; ListNode; // 연결리스트헤더 typedef struct ListHeader { int length; ListNode *head; ListNode *tail; ListHeader; 49/63

다항식프로그램 // 초기화함수 void init(listheader *plist){ plist->length = 0; plist->head = plist->tail = NULL; // plist는연결리스트의헤더를가리키는포인터, coef는계수, expon는지수 void insert_node_last(listheader *plist, int coef, int expon) { ListNode *temp = (ListNode *)malloc(sizeof(listnode)); if( temp == NULL ) error(" 메모리할당에러 "); temp->coef=coef; temp->expon=expon; temp->link=null; if( plist->tail == NULL ){ plist->head = plist->tail = temp; else { plist->tail->link = temp; plist->tail = temp; plist->length++; 50/63

다항식프로그램 // list3 = list1 + list2 void poly_add(listheader *plist1, ListHeader *plist2, ListHeader *plist3 ) { ListNode *a = plist1->head; ListNode *b = plist2->head; int sum; while(a && b){ if( a->expon == b->expon ){ // a 의차수 > b 의차수 sum = a->coef + b-> coef; if( sum!= 0 ) insert_node_last(plist3, sum, a->expon); a=a->link; b=b->link; else if( a->expon > b->expon ){ // a 의차수 == b 의차수 insert_node_last(plist3, a->coef, a->expon); a=a->link; else { // a 의차수 < b 의차수 insert_node_last(plist3, b->coef, b->expon); b=b->link; 51/63

다항식프로그램 // a 나 b 중의하나가먼저끝나게되면남아있는항들을모두 // 결과다항식으로복사 for( ; a!= NULL; a=a->link) insert_node_last(plist3, a->coef, a->expon); for( ; b!= NULL; b=b->link) insert_node_last(plist3, b->coef, b->expon); void poly_print(listheader *plist) { ListNode *p=plist->head; for(;p;p=p->link){ printf("%d %d\n", p->coef, p->expon); 52/63

다항식프로그램 void main() { ListHeader list1, list2, list3; // 연결리스트의초기화 init(&list1); init(&list2); init(&list3); // 다항식 1 을생성 insert_node_last(&list1, 3,12); insert_node_last(&list1, 2,8); insert_node_last(&list1, 1,0); // 다항식 2 를생성 insert_node_last(&list2, 8,12); insert_node_last(&list2, -3,10); insert_node_last(&list2, 10,6); // 다항식 3 = 다항식 1 + 다항식 2 poly_add(&list1, &list2, &list3); poly_print(&list3); 53/63

연결리스트를이용한리스트 ADT 의구현 리스트 ADT의연산 ( delete,add) 을연결리스트를이용하여구현 리스트 ADT의 add, delete 연산의파라미터는위치 예를들어, 위치가 2이면두번째노드에서 add, delete가이루어짐 연결리스트의 insert_node, remove_node 의파리미터는노드포인터 예를들면, 포인터가가리키는노드에서 insert, remove작업이이루어짐 상황에따라연산을적절하게선택하여야함 사용자 add( 항목의위치 ) delete( 항목의위치 ) 리스트 ADT insert_node( 노드포인터 ) remove_node( 노드포인터 ) 연결리스트 54/63

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

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

add() 연산의구현 새로운데이터를임의의위치에삽입 항목의위치를노드포인터로변환해주는함수 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; 57/63

add 연산의구현 새로운데이터를임의의위치에삽입 항목의위치를노드포인터로변환해주는함수 get_node_at 필요 // 주어진위치에데이터를삽입한다. 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)); 58/63

delete() 연산의구현 임의의위치의데이터를삭제 항목의위치를노드포인터로변환해주는함수 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--; 59/63

get_entry() 연산의구현 element get_entry(listtype *list, int pos) { ListNode *p; if( pos >= list->length ) error(" 위치오류 "); p = get_node_at(list, pos); return p->data; 60/63

display() 연산의구현 // 버퍼의내용을출력한다. void display(listtype *list) { int i; ListNode *node=list->head; printf("( "); for(i=0;i<list->length;i++){ printf("%d ",node->data); node = node->link; printf(" )\n"); 61/63

Is_in_list() 연산의구현 // 데이터값이 s인노드를찾는다. int is_in_list(listtype *list, element item) { ListNode *p; p = list->head; // 헤드포인터에서부터시작한다. while( (p!= NULL) ){ // 노드의데이터가 item이면 if( p->data == item ) break; p = p->link; if( p == NULL) return FALSE; else return TRUE; 62/63

전체프로그램 int main() { ListType list1; init(&list1); add(&list1, 0, 20); add_last(&list1, 30); add_first(&list1, 10); add_last(&list1, 40); display(&list1); 63/63

연습문제 1 A 라는공백상태의리스트가있다고가정하자. 이리스트에대하여다음과같은연산들이적용된후의리스트의내용을그려라. add_first(a, first ); add(a, 1, second ); add_last(a, third ); add( A,2, fourth ); add(a, 4, fifth ); delete(a,2); delete(a,2); Replace(A, 1, sixth );

도전문제 - 라인에디터 라인단위로텍스트를입력하거나삭제할수있는단순한에디터 라인단위로이루어지므로커서를사용하지않는다. 입력되는라인의개수가정해지지않았으므로연결리스트사용 삽입 라인의번호와라인내용을입력받아삽입 삭제 삭제하고자하는라인번호를입력받아삭제 자료구조목차 Basic Linked List Stack buffer 자료구조목차 Basic Linked List Stack NULL

도전문제 - 정렬리스트 배열을이용하여숫자들을입력받아항상정렬된상태로유지하는리스트 SortedList 를구현하여보라. 다음의연산들을구현하면된다. 객체 : n 개의 element 형으로구성된순서있는모임연산 : add(list, item) ::= 정렬된리스트에 item 을추가한다. delete(list, item) ::= 정렬된리스트에서 item 을제거한다. clear(list) ::= 리스트의모든요소를제거한다. is_in_length(list, item) ::= item 이리스트안에있는지를검사한다. get_length(list) ::= 리스트의길이를구한다. is_empty(list) ::= 리스트가비었는지검사한다. is_fully(list) ::= 리스트가꽉찼는지를검사한다. display(list) ::= 리스트의모든요소를표시한다.