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

Similar documents
11장 포인터

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

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

C 언어 강의노트

슬라이드 1

Microsoft PowerPoint - Chapter14_17.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

Chapter 4. LISTS

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

1장. 리스트

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

06장.리스트

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

chap 5: Trees

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

Chapter 4. LISTS

Microsoft PowerPoint - ch07 - 포인터 pm0415

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

Algorithms

Microsoft PowerPoint - 자료구조2008Chap06

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

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

4장

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

Chapter 4. LISTS

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

슬라이드 1

Microsoft PowerPoint - chap4_list

슬라이드 1

슬라이드 1

<4D F736F F F696E74202D FBFACB0E120C0DAB7E1B1B8C1B6205BC8A3C8AF20B8F0B5E55D>

슬라이드 1

슬라이드 1

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

Microsoft PowerPoint - 06-List.ppt

슬라이드 1

Microsoft PowerPoint - ch14 - Hash Map

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

Microsoft PowerPoint - ch08 - 구조체 (structure) am0845

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

03_queue

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

중간고사 (자료 구조)

03장.스택.key

PowerPoint 프레젠테이션

chap01_time_complexity.key

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

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

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

슬라이드 1

PowerPoint 프레젠테이션

Chap 6: Graphs

untitled

untitled

Microsoft PowerPoint - ch12 - Graph, Graph Algorithms

PowerPoint 프레젠테이션

ABC 10장

PowerPoint Template

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

Microsoft PowerPoint - 제3장-배열.pptx

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

기초컴퓨터프로그래밍

BMP 파일 처리

untitled

윤성우의 열혈 TCP/IP 소켓 프로그래밍


K&R2 Reference Manual 번역본

설계란 무엇인가?

PowerPoint 프레젠테이션

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

chap8.PDF

Microsoft PowerPoint - Chapter_09.pptx

02장.배열과 클래스


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

Microsoft PowerPoint - 제11장 포인터

OCaml

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

슬라이드 1

11장 포인터

Microsoft PowerPoint - 08-Queue.ppt

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

Microsoft PowerPoint - chap-11.pptx

Microsoft PowerPoint - 05-chap03-ArrayAndPointer.ppt

Chap 6: Graphs

Microsoft PowerPoint - ch12 - Graph, Graph Algorithms

본 강의에 들어가기 전

Microsoft PowerPoint - 08-chap06-Queue.ppt

13주-14주proc.PDF

01_List

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

<4D F736F F F696E74202D2031C1D6C2F72D31C2F7BDC32028B0ADC0C7C0DAB7E D20C7C1B7CEB1D7B7A1B9D6BEF0BEEE20B0FAB8F1BCD2B

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

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

untitled

슬라이드 1

슬라이드 1

슬라이드 1

Transcription:

2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr)

연결리스트 (Linked List) 연결리스트연산 Stack Queue 응용 Outline 9-2

연결리스트 배열 (array) 장점 : 구현이간단하고빠르다 단점 : 크기가고정된다. 중간에서삽입, 삭제가어렵다. 0 1 2 3 4 5 6 7 8 9 연결리스트 (linked list) 각각의원소가포인터를사용하여다음원소의위치를가리킨다. A C D E B 메인메모리 9-3

연결리스트의장단점 중간에데이터를삽입, 삭제하는경우 N A C D E A C D E B B 데이터삽입 데이터삭제 데이터를저장할공간이필요할때마다동적으로공간을만들어서쉽게추가 구현이어렵고오류가나기쉽다. 중간에있는데이터를빠르게가져올수없다. 9-4

연결리스트의구조 노드 (node) = 데이터필드 (data field)+ 링크필드 (link field) 연결리스트의노드는데이터필드와링크필드로이루어집니다. data link 9-5

연결리스트의구조 헤드포인터 (head pointer): 첫번째노드를가리키는포인터 첫번째노드를가리키는포인터를헤드포인터라고하고맨마지막노드의링크필드는 NULL 입니다. plist 10 20 30 NULL NULL 40 NULL 50 NULL 9-6

노드생성 노드들은동적으로생성된다. 9-7

자기참조구조체 자기참조구조체 (self-referential structure) 는특별한구조체로서구성멤버중에같은타입의구조체를가리키는포인터가존재하는구조체 typedef struct NODE int data; struct NODE *link; NODE; 9-8

간단한연결리스트생성 NODE *p1; p1 = (NODE *)malloc(sizeof(node)); p1->data = 10; p1->link = NULL; NODE *p2; p2 = (NODE *)malloc(sizeof(node)); p2->data = 20; p1 p1 10 NULL p2->link = NULL; p1->link = p2; free(p1); free(p2); p1 10 20 NULL p1 10 20 NULL 9-9

연결리스트의응용 소장하고있는책의목록을관리하는프로그램을작성 연결리스트를사용하여서작성 9-10

연결리스트를이용한프로그램 9-11

9-12

9-13

9-14

실행결과 9-15

Linked List 에서의 Node 삽입 (1) NODE *insert_node(node *plist, NODE *pprev, DATA item); 1. 리스트의처음에삽입하는경우 pnew->link = plist; plist 10 20 30 NULL plist = pnew; pnew 5 2. 리스트의중간에삽입하는경우 pprev pnew->link = pprev->link;// 1 pprev->link = pnew;// 2 plist 10 20 30 NULL 2 1 pnew 5 9-16

Linked List 에서의 Node 삽입 (2) NODE *insert_node(node *plist, NODE *pprev, DATA item) NODE *pnew = NULL; if (!(pnew = (NODE *)malloc(sizeof(node))) ) printf(" 메모리동적할당오류 n"); exit(1); pnew->data = item; if( pprev == NULL ) // 연결리스트의처음에삽입 pnew->link = plist; plist = pnew; else // 연결리스트의중간에삽입 pnew->link = pprev->link; pprev->link = pnew; return plist; 9-17

Linked List 에서의노드삭제 (1) NODE *delete_node(node *plist, NODE *pprev, NODE *pcurr); 1. 리스트의처음노드를삭제하는경우 plist = pcurr->link; free(pcurr); plist 10 20 30 NULL pcurr 2. 리스트의중간노드를삭제하는경우 pprev->link = pcurr->link; plist 10 20 30 40 NULL free(pcurr); pprev pcurr 9-18

Linked List 에서의노드삭제 (2) NODE *delete_node(node *plist, NODE *pprev, NODE *pcurr) if( pprev == NULL ) // First node plist = pcurr->link; else pprev->link = pcurr->link; free(pcurr); return plist; 9-19

Print, Count, Sum Nodes in Linked List void print_list(node *plist) NODE *p; int count = 0; int sum = 0; p = plist; plist while( p!= NULL ) printf("%d, ", p->data); count++; sum += p->data; p = p->link; printf( n ); printf( Length of list: %d n, count); printf( Sum of list: %d n, sum); p 10 20 30... 90 NULL p p p 9-20

Header Files Doubly-Linked List 를이용한 Galaxy of Stars 구성 typedef struct Star char name[16]; int id; double distance; double luminosity; double mass; double radius; int age; Star; typedef struct ListNode Star *ps; ListNode *pprev; ListNode *pnext; ListNode; typedef struct Galaxy ListNode *pfirst; ListNode *plast; int num_star; Galaxy; 9-21

Galaxy pglx numstars pfirst plast ListNode pprev pprev pprev pprev pprev pprev pnext pnext pnext pnext pnext pnext pstar pstar pstar pstar pstar pstar Star[ ] Star[0] -name -id... Star[1] -name -id... Star[2] -name -id... Star[i] -name -id... Star[ j] -name -id... Star[k] -name -id... Star[N-1] -name -id... 9-22

Star* genstar(int starid) Star *pnew; int name_len; pnew = (Star *)malloc(sizeof(star)); name_len = rand() % 6 + 5; pnew->name[0] = rand() % 26 + 'A'; for (int i = 1; i<name_len; i++) pnew->name[i] = rand() % 26 + 'a'; pnew->name[name_len] = ' 0'; pnew->id = starid; pnew->distance = (double)(rand() % 10000 + 10.0); pnew->luminosity = (double)(rand() % 10000 + 10.0); pnew->mass = (double)(rand() % 10000 + 10.0); pnew->radius = (double)(rand() % 10000 + 10.0); pnew->age = rand() % 10000 + 10; return pnew; 9-23

void insertnodeattail(galaxy *pglx, Star *pstar) ListNode *pnew; pnew = (ListNode *)malloc(sizeof(listnode)); pnew->pnext = pnew->pprev = NULL; pnew->ps = pstar; if (pglx->num_star == 0) pglx->pfirst = pglx->plast = pnew; pglx->num_star++; else if (pglx->num_star < NUM_STARS) pnew->pprev = pglx->plast; pglx->plast->pnext = pnew; pglx->plast = pnew; pnew->pnext = NULL; pglx->num_star++; else printf("error in excessive number of stars (NUM_STARS: %d) n", NUM_STARS); 9-24

void insertnodeinorder(galaxy *pglx, Star *pstar) ListNode *pnew, *pln; pnew = (ListNode *)malloc(sizeof(listnode)); pnew->pnext = pnew->pprev = NULL; pnew->ps = pstar; if (pglx->num_star == 0) pglx->pfirst = pglx->plast = pnew; pnew->pnext = NULL; pnew->pprev = NULL; pglx->num_star++; else if (pglx->num_star < NUM_STARS) for (pln = pglx->pfirst; pln!= NULL;) if (pnew->ps->id < pln->ps->id) pnew->pnext = pln; pnew->pprev = pln->pprev; if (pln!= pglx->pfirst) if (pln->pprev!= NULL) pln->pprev->pnext = pnew; pln->pprev = pnew; 9-25

else // ps == pglx->pfirst pglx->pfirst = pnew; pnew->pprev = NULL; pln->pprev = pnew; pglx->num_star++; break; else if ((pln == pglx->plast) && (pnew->ps->id >= pln->ps->id)) pnew->pprev = pln; pln->pnext = pnew; pglx->plast = pnew; pnew->pnext = NULL; pglx->num_star++; break; else if (pln!= pglx->plast) pln = pln->pnext; else break; // end if-else // end for else printf("error in excessive number of stars (NUM_STARS: %d) n", NUM_STARS); 9-26

Star * removefromhead(galaxy *pglx) ListNode *pln; Star *ps; if (pglx->num_star > 0) pln = pglx->pfirst; ps = pln->ps; pglx->pfirst = pglx->pfirst->pnext; if (pglx->pfirst!= NULL) pglx->pfirst->pprev = NULL; pglx->num_star--; free(pln); return ps; else printf("error in removefromhead: Linked List is empty n"); return NULL; 9-27

Star * getfromhead(galaxy *pglx) if (pglx->num_star > 0) return pglx->pfirst->ps; else return NULL; void printgalaxy(galaxy *pglx) ListNode *pln; int count; printf(" Number of stars: %d n", pglx->num_star); pln = pglx->pfirst; count = 0; while ((pln!= NULL) && (count <NUM_STARS)) printf(" Star_ID (%3d), Name (%s) n", pln->ps->id, pln->ps->name); pln = pln->pnext; count++; 9-28

void main() Galaxy *pglx; Star *ps; int *starid, i; pglx = (Galaxy *)malloc(sizeof Galaxy); pglx->pfirst = NULL; pglx->plast = NULL; pglx->num_star = 0; starid = new int[num_stars]; genbigrandarray(starid, NUM_STARS); printf("inserting Stars into Galaxy using insertnodeinorder()... n"); for (i = 0; i<num_stars; i++) ps = genstar(starid[i]); insertnodeinorder(pglx, ps); printf(" Galaxy after insertnodeinorder(%d) n", ps->id); printgalaxy(pglx); 9-29

printf(" ndeleting Stars from Galaxy using removefromhead()... n"); for (i = 0; i<num_stars; i++) ps = removefromhead(pglx); if (ps!= NULL) printf(" Galaxy after node (id: %d) remove from head of the linked list: n", ps->id); printgalaxy(pglx); free(ps); ps = getfromhead(pglx); if (ps!= NULL) printf(" New head in list of Galaxy: %d n", ps->id); free(pglx); 9-30

실행결과 9-31