Chapter 4. LISTS

Similar documents
<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

chap 5: Trees

슬라이드 1

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

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

Chapter 4. LISTS

Chapter 4. LISTS

06장.리스트

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

Algorithms

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

11장 포인터

중간고사 (자료 구조)

슬라이드 1

<4D F736F F F696E74202D FBFACB0E120C0DAB7E1B1B8C1B6205BC8A3C8AF20B8F0B5E55D>

C 언어 강의노트

chap01_time_complexity.key

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

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

슬라이드 1

Chap 6: Graphs

1장. 리스트

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

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

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

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

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

슬라이드 1

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

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

Microsoft PowerPoint - 자료구조2008Chap06

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

슬라이드 1

Microsoft PowerPoint - chap4_list

untitled


Microsoft PowerPoint - 06-List.ppt

4장

슬라이드 1

03장.스택.key

Chap 6: Graphs

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

슬라이드 1

슬라이드 1

Microsoft PowerPoint - 08-Queue.ppt

K&R2 Reference Manual 번역본

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

Microsoft PowerPoint - Chap2 [호환 모드]

Microsoft PowerPoint - 08-chap06-Queue.ppt

슬라이드 1

03_queue

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

, ( ),, ( ), 3, int kor[5]; int eng[5]; int Microsoft Windows 4 (ANSI C2 ) int kor[5] 20 # define #define SIZE 20 int a[10]; char c[10]; float

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

슬라이드 1

슬라이드 1

Chapter #01 Subject

PowerPoint 프레젠테이션

ABC 10장

슬라이드 제목 없음

Microsoft PowerPoint - 제3장-배열.pptx

chap8.PDF

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

Chap 6: Graphs

Let G = (V, E) be a connected, undirected graph with a real-valued weight function w defined on E. Let A be a set of E, possibly empty, that is includ

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

4.18.국가직 9급_전산직_컴퓨터일반_손경희_ver.1.hwp

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>


chap x: G입력

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

untitled

untitled

untitled

untitled

Microsoft PowerPoint - ch08_큐 [호환 모드]

UI TASK & KEY EVENT

Microsoft PowerPoint - Chap5 [호환 모드]

USER GUIDE

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - Chapter_09.pptx

PowerPoint 프레젠테이션


<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

02장.배열과 클래스

슬라이드 1

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

Microsoft Word - FunctionCall

Line (A) å j a k= i k #define max(a, b) (((a) >= (b))? (a) : (b)) long MaxSubseqSum0(int A[], unsigned Left, unsigned Right) { int Center, i; long Max

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

BMP 파일 처리

chap7.key

10주차.key

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

Microsoft PowerPoint - chap-11.pptx

Columns 8 through while expression {commands} 예제 1.2 (While 반복문의이용 ) >> num=0

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

Microsoft PowerPoint - ch07 - 포인터 pm0415

슬라이드 1

C++-¿Ïº®Çؼ³10Àå

Transcription:

연결리스트의응용 류관희 충북대학교 1

체인연산 체인을역순으로만드는 (inverting) 연산 3 개의포인터를적절히이용하여제자리 (in place) 에서문제를해결 typedef struct listnode *listpointer; typedef struct listnode { char data; listpointer link; ; 2

체인연산 체인을역순으로만드는 (inverting) 연산 연산시간 O(length) listpointer invert(listpointer lead) { /* lead 가가리키고있는리스트를역순으로만든다. */ listpointer middle, trail; middle = NULL; while (lead) { trail = middle; middle = lead; lead = lead->link; middle->link = trail; return middle; 단순연결리스트를역순으로만드는함수 3

체인연산 두개의체인 ptr1 과 ptr2 를연결 (concatenation) 하는연산 listpointer concatenate(listpointer ptr1, listpointer ptr2) { /* 리스트 ptr1 뒤에리스트 ptr2 가연결된새로운리스트를생성한다. ptr1 이가리키는리스트는영구히바뀐다. */ listpointer temp; /* check for empty lists */ if(!ptr1) return ptr2; if(!ptr2) return ptr1; /* neither list is empty, find end of first list */ for(temp = ptr1; temp->link; temp = temp->link) ; /* link end of first to start of second */ temp->link = ptr2; 단순연결리스트의연결 4

원형연결리스트연산 리스트의마지막노드에대한포인터 last 를유지함으로써앞이나뒤양쪽에쉽게원소를삽입가능 리스트의앞에삽입 5 void insertfront(listpointer *last, listpointer node) { /* 리스트의마지막노드가 last 인원형리스트의앞에노드를삽입한다. */ if (IS_EMPTY(*first)) { /* 리스트가공백일경우, last 이새로운항목을가리키도록변경시킨다. */ *last = node; node->link = node; else { /* 리스트가공백이아닌경우, 리스트의앞에새로운항목을삽입시킨다. */ node->link = (*last)->link; (*last)->link = node;

원형연결리스트연산 원형리스트의길이계산 int length(listpointer last) {/* 원형리스트 last 의길이를계산한다. */ listpointer temp; int count = 0; if (last) { temp = last; do { count++; temp = temp->link; while (temp!= last); return count; 6

Sparse Matrices 0 12 0 0 0 0 4 0 11 0 0 0 0 0 0 15 inadequacies of sequential schemes (1) # of nonzero terms will vary after some matrix computation (2) matrix just represents intermediate results new scheme Each column (row): a circular linked list with a head node 7

Revisit Sparse Matrices # of head nodes = max{# of rows, # of columns head node down head right next entry node down entry row col value right aij entry i j aij 8

Linked Representation for Matrix 4 4 0 2 11 1 0 12 1 1 5 2 1-4 Circular linked list 3 3-15 9

#define MAX_SIZE 50 /* size of largest matrix */ typedef enum {head, entry tagfield; typedef struct matrix_node *matrix_pointer; typedef struct entry_node { int row; int col; int value; ; typedef struct matrix_node { matrix_pointer down; matrix_pointer right; tagfield tag; union { matrix_pointer next; entry_node entry; u; ; matrix_pointer hdnode[max_size]; 10

Sample input for sparse matrix [0] [1] [2] [3] [4] [0] [1] [2] 4 4 4 0 2 11 1 0 12 2 1-4 3 3-15 11

Read in a Matrix matrix_pointer mread(void) { /* read in a matrix and set up its linked list. An global array hdnode is used */ int num_rows, num_cols, num_terms; int num_heads, i; int row, col, value, current_row; matrix_pointer temp, last, node; printf( Enter the number of rows, columns and number of nonzero terms: ); 12

scanf( %d%d%d, &num_rows, &num_cols, &num_terms); num_heads = (num_cols>num_rows)? num_cols : num_rows; /* set up head node for the list of head nodes */ node = new_node(); node->tag = entry; node->u.entry.row = num_rows; node->u.entry.col = num_cols; if (!num_heads) node->right = node; else { /* initialize the head nodes */ for (i=0; i<num_heads; i++) { term= new_node(); O(max(n,m)) hdnode[i] = temp; hdnode[i]->tag = head; hdnode[i]->right = temp; hdnode[i]->u.next = temp; 13

current_row= 0; last= hdnode[0]; for (i=0; i<num_terms; i++) { printf( Enter row, column and value: ); scanf( %d%d%d, &row, &col, &value); if (row>current_row) { last->right= hdnode[current_row]; current_row= row; last=hdnode[row]; temp = new_node(); temp->tag=entry; temp->u.entry.row=row; temp->u.entry.col = col; temp->u.entry.value = value; last->right = temp;/*link to row list */ last= temp; /* link to column list */ hdnode[col]->u.next->down = temp; hdnode[col]=>u.next = temp; 14

/*close last row */ last->right = hdnode[current_row]; /* close all column lists */ for (i=0; i<num_cols; i++) hdnode[i]->u.next->down = hdnode[i]; /* link all head nodes together */ for (i=0; i<num_heads-1; i++) hdnode[i]->u.next = hdnode[i+1]; hdnode[num_heads-1]->u.next= node; node->right = hdnode[0]; return node; O(max{#_rows, #_cols+#_terms) 15

void mwrite(matrix_pointer node) { /* print out the matrix in row major form */ int i; matrix_pointer temp, head = node->right; Write out a Matrix printf( \n num_rows = %d, num_cols= %d\n, node->u.entry.row,node->u.entry.col); printf( The matrix by row, column, and value:\n\n ); for (i=0; i<node->u.entry.row; i++) { for (temp=head->right;temp!=head;temp=temp->right) printf( %5d%5d%5d\n, temp->u.entry.row, temp->u.entry.col, temp->u.entry.value); head= head->u.next; /* next row */ 16

Erase a Matrix void merase(matrix_pointer *node) { int i, num_heads; matrix_pointer x, y, head = (*node)->right; for(i=0; i<(*node)->u.entry.row; i++) { y=head->right; while (y!=head) { x = y; y = y->right; free(x); x= head; head= head->u.next; free(x); y = head; while (y!=*node) { x = y; y = y->u.next; free(x); free(*node); *node = NULL; O(#_rows+#_cols+#_terms) 17

Doubly Linked Lists We can move easily only in the direction of the links in singly linked list. To move in either direction, it is useful to have doubly linked lists. typedef struct node *node_pointer; typedef struct node { node_pointer llink; element item; node_pointer rlink; ptr = ptr->llink->rlink = ptr->rlink->llink 18

(ex) Doubly linked circular list Head Node llink item rlink ptr 19

(ex) Insertion node node new node void dinsert(nodepointer node, nodepointer newnode) { /* newnode 를 node 의오른쪽에삽입 */ newnode->llink = node; newnode->rlink = node->rlink; node->rlink->llink = newnode; node->rlink = newnode; 20

(ex) Deletion node node deleted void ddelete(nodepointer node, nodepointer deleted) { /* 이중연결리스트에서삭제 */ if (node == deleted) printf("deletion of head node not permitted.\n"); else { deleted->llink->rlink = deleted->rlink; deleted->rlink->llink = deleted->link; free(deleted); 21