Chapter 4. LISTS

Similar documents
chap 5: Trees

Chapter 4. LISTS

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

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

03_queue

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

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

11장 포인터

슬라이드 1

06장.리스트

Chapter 4. LISTS

untitled

C 언어 강의노트

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

슬라이드 1

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

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

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

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

Microsoft PowerPoint - 자료구조2008Chap06

chap x: G입력

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

chap x: G입력

1장. 리스트

Chap 6: Graphs

Chap 6: Graphs

K&R2 Reference Manual 번역본

슬라이드 1

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

chap01_time_complexity.key

Microsoft PowerPoint - 07-chap05-Stack.ppt

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

Microsoft PowerPoint - 08-Queue.ppt

슬라이드 1

슬라이드 1

슬라이드 1

중간고사 (자료 구조)

Microsoft PowerPoint - 08-chap06-Queue.ppt

슬라이드 1

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


4장

Microsoft PowerPoint - 06-List.ppt

03장.스택.key

Chap 6: Graphs

Microsoft PowerPoint - 05-chap03-ArrayAndPointer.ppt

슬라이드 1

슬라이드 1

슬라이드 1

02장.배열과 클래스

Algorithms

슬라이드 1

슬라이드 1

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

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

untitled

PowerPoint 프레젠테이션

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

슬라이드 1

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

4장

슬라이드 1

슬라이드 1

Algorithms

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Microsoft PowerPoint - chap4_list

ABC 10장

슬라이드 1

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

Microsoft PowerPoint - 제4장-스택과큐.pptx

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

슬라이드 1

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - ch08_큐 [호환 모드]

PowerPoint 프레젠테이션

슬라이드 제목 없음

<4D F736F F F696E74202D FBFACB0E120C0DAB7E1B1B8C1B6205BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

2. QUEUE OPERATIONS Initialize the queue Insert to the rear of the queue (also called as Enqueue) Remove (Delete) from the front of the queue (also ca

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

Frama-C/JESSIS 사용법 소개

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

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

PowerPoint 프레젠테이션

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

<BCBCB9CCB3AA20C0DAB7E1202D20BDBAC5C3C5A52E687770>

04장.큐

슬라이드 1

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

슬라이드 1

슬라이드 1

歯MW-1000AP_Manual_Kor_HJS.PDF

chap 5: Trees

chap x: G입력

03장.스택

Chapter #01 Subject

chap7.key

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

Transcription:

C 언어에서리스트구현 리스트의생성 struct node { int data; struct node *link; ; struct node *ptr = NULL; ptr = (struct node *) malloc(sizeof(struct node)); Self-referential structure NULL: defined in stdio.h(k&r C) or stddef.h(ansi C) 노드의각필드에값할당 ptr data = 10; // (*ptr).data = 10; ptr link = NULL; 4 장. 리스트 (Page 8)

리스트에새로운노드를삽입 (1) 두개의노드로구성된리스트 ptr 10 20 NULL (2) A 다음에 temp 라는새로운노드를삽입 : insert(&ptr, A) - Program 4.3 ptr 10 20 NULL A 50 temp 4 장. 리스트 (Page 9)

Program 4.3: 리스트에삽입 void insert(struct node **ptr, struct node *before) { /* data = 50 인새로운노드를 ptr 이가리키는리스트의 before 노드다음에삽입 */ struct node *temp; temp = (struct node *) malloc(sizeof(struct node)); if (temp == NULL) { fprintf(stderr, "The memory is full\ n"); exit(1); temp data = 50; if (*ptr!= NULL) { temp link = before link; before link = temp; else { temp link = NULL; *ptr = temp; 4 장. 리스트 (Page 10)

리스트에서노드삭제 delete(&ptr, before, A) ptr 이가리키는리스트에서노드 A 를삭제 before 는 A 노드의이전노드를가리키고있음 void delete(struct node **ptr, struct node *before, struct node *A) { // ptr: 포인터의포인터, before와 A: 포인터 if (before!= NULL) before link = A link; else *ptr = (*ptr) link; free(a); before 가없을경우, A 를삭제하는방법? 연습문제 4, 6, 7, 8( 페이지 154) 풀것! 4 장. 리스트 (Page 11)

예 : 삭제 (1) delete(&ptr, NULL, ptr) ptr A before = NULL ptr 10 50 20 NULL 50 20 NULL (a) before deletion (b) after deletion (2) delete(&ptr, ptr, ptr link) ptr before A ptr 10 50 20 NULL 10 20 NULL (a) before deletion (b) after deletion 4 장. 리스트 (Page 12)

3. 리스트를이용한스택과큐 배열을이용한스택과큐의구현방법의문제점 메모리낭비 Stack Full 의발생가능성 리스트를이용한스택과큐의구현 top element link... NULL Linked Stack front Linked Queue element link... rear NULL 4 장. 리스트 (Page 13)

리스트를이용한스택의선언 #define MAX_STACK 10 typedef struct { int key; /* other fields */ element; struct stack { element data; struct stack *link; ; (1) 스택의초기조건 : top[i] = NULL; 0 i < MAX_STACKS (2) 경계조건 : top[i] = NULL if i 번째 stack이 empty. IS_FULL(temp) if the memory is full. //MAX_STACKS 만큼의스택선언 struct stack *top[max_stacks]; 4 장. 리스트 (Page 14)

Program 4.6: 리스트스택에노드추가 void push( int i, element item ) { // 스택 top에새로운 item 추가 struct stack *temp = (struct stack *) malloc(sizeof(struct stack)); if (temp == NULL) { // memory full fprintf(stderr,"the memory is full\ n"); exit(1); temp data = item; temp link = top[i]; top[i] = temp; 4 장. 리스트 (Page 15)

Program 4.7: 리스트스택에서삭제 element pop(int i) { // 스택의 top이가리키는 element를삭제하여 return struct stack *temp = top[i]; element item; if (temp == NULL) { // top[i] == NULL fprintf(stderr, "The stack is empty\ n"); exit(1); item = temp data; top[i] = temp link; free(temp); return item; 4 장. 리스트 (Page 16)

리스트를이용한큐의선언 #define MAX_QUEUES 10 struct Que { element data; struct Que *link; ; 큐를위한초기설정 : front[i] = NULL; 0 i < MAX_QUEUES 경계조건 : front[i] = NULL if i번째큐가 empty IS_FULL(temp) if the memory is full //MAX_QUEUES 만큼의큐선언 struct Que *front[max_queues], *rear[max_queues]; 4 장. 리스트 (Page 17)

Program 4.8: 리스트큐에노드추가 void addq(int i, element item) { // 큐의 rear에새로운 element 추가 struct Que *temp = (struct Que *)malloc(sizeof(struct Que)); if (temp == NULL) { // memory full fprintf(stderr,"the memory is full\ n"); exit(1); temp data = item; temp link = NULL; if (front[i]) rear[i] link = temp; else front[i] = temp; rear[i] = temp; 4 장. 리스트 (Page 18)

Program 4.9: 리스트큐에서삭제 element deleteq(int i) { // 큐에서 front가가리키는노드삭제후 element는 return struct Que *temp = front[i]; element item; if (temp == NULL) { // *front == NULL fprintf(stderr, "The queue is empty\ n"); exit(1); item = temp data; front[i] = temp link; free(temp); return item; 4 장. 리스트 (Page 19)

4. 다항식 (Polynomials) 다항식을단일연결리스트로표현 struct poly { int coef; int expon; struct poly *link; ; struct poly *a, *b, *d; coef expon link 4 장. 리스트 (Page 20)

다항식의예 a = 3x 14 + 2x 8 + 1 b = 8x 14 3x 10 + 10x 6 a 3 14 2 8 1 0 b 8 14-3 10 10 6 다항식의합 d = a + b 의처음세단계 (Figure 4.12) Program 4.10 & Program 4.11: 두개의다항식의합 시간복잡성 : O(m + n) 4 장. 리스트 (Page 21)

그림 4.12: d = a + b 의첫번째단계 3 14 2 8 1 0 NULL a 8 14-3 10 10 6 NULL b 11 14 NULL d (a) a expon == b expon 4 장. 리스트 (Page 22)

그림 4.12: d = a + b 의두번째단계 3 14 2 8 1 0 NULL a 8 14-3 10 10 6 NULL b 11 14-3 10 NULL d (b) a expon < b expon 4 장. 리스트 (Page 23)

그림 4.12: d = a + b 의세번째단계 3 14 2 8 1 0 NULL a 8 14-3 10 10 6 NULL b 11 14-3 10 2 8 NULL d (c) a expon > b expon 4 장. 리스트 (Page 24)

Program 4.10: 두개의다항식더하기 (1) struct poly *padd(struct poly *a, struct poly *b) { // d = a + b인다항식 d를 return struct poly *front, *rear, *temp; int sum; // 사용하지않는초기노드를생성. 이유는? rear = (struct poly *)malloc(sizeof(struct poly)); if (rear == NULL) { fprintf(stderr, The memory is full\ n ); exit(1); front = rear; while (a && b) switch (COMPARE(a expon, b expon)) { case -1: // a expon < b expon attach(b coef, b expon, &rear); b = b link; break; 4 장. 리스트 (Page 25)

Program 4.10: 두개의다항식더하기 (2) case 0: // a expon == b expon sum = a coef + b coef; if (sum) attach(sum, a expon, &rear); a = a link; b = b link; break; case 1: // a expon > b expon attach(a coef, a expon, &rear); a = a link; // 리스트 a 와 b 의나머지부분을복사 for (; a; a = a link) attach(a coef, a expon, &rear); for (; b; b = b link) attach(b coef, b expon, &rear); rear link = NULL; // 초기노드를삭제 temp = front; front = front link; free(temp); return front; 4 장. 리스트 (Page 26)

Program 4.11: 리스트의끝에새로운항추가 void attach ( float coefficient, int exponent, struct poly **rear) { /* coef = coefficient 이고 expon = exponent 인새로운노드를생성한후, ptr 이가리키는노드다음에연결. ptr 은생성된노드를가리키도록변경 */ struct poly *temp; temp = (struct poly *) malloc(sizeof(struct poly)); if (temp == NULL) { fprintf ( stderr, The memory is full \ n ); exit(1); temp coef = coefficient; temp expon = exponent; (*rear) link = temp; *rear = temp; 4 장. 리스트 (Page 27)