쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.

Slides:



Advertisements
Similar presentations
구조체 : Structure 와 포인터 2. 집합적 변수 생성 가능 structure_declaration ::= struct_specifier declarator_list ; struct_specifier ::= struct tag_name | struct tag_name.
Advertisements

스택 스택 추상자료형 스택 스택의 구현 스택의 응용 한빛미디어(주).
Linux/UNIX Programming APUE (The Environment of a UNIX Process)
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
Power C++ 제6장 포인터와 문자열.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
Internet Computing KUT Youn-Hee Han
제 8 장  파서 생성기 YACC 사용하기.
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2011
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2005
제 2 장 배열과 스트링.
5장. 리스트 리스트 학습목표 목록이나 도표처럼 여러 데이터를 관리할 수 있는 자료형을 추상화
Internet Computing KUT Youn-Hee Han
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express Slide 1 (of 26)
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
Chapter 03 배열, 구조체, 포인터.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
C언어: 배열 (Arrays).
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
CHAP 3:배열, 구조체, 포인터.
제 4 장 L i s t.
head data link data link data link NULL a b c
자료 구조: Chapter 3 (2)구조체, 포인터
Chapter 9 – 구조형과 리스트 처리 Outline 9.1 자신 참조 구조형 9.2 선형 연결 리스트 9.3 리스트 연산
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
10장 메모리 관리.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
25장. 메모리 관리와 동적 할당.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
[INA240] Data Structures and Practice
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
Dynamic Memory and Linked List
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
12장 파일처리와 매크로 파일 입출력 함수 문자 입출력 함수 라인 입출력 함수 불록 입출력 함수 매크로.
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
14주차.
제 3 장 상수와 변수
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
배열과 연결리스트 연결리스트 배열 메모리 할당이 연속적이어서 인덱스 사용시 검색이 빠르다.
Chapter 04 리스트.
함수와 변수 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제어문 & 반복문 C스터디 2주차.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
4장 자료형.
Chapter 05. 입출력 함수.
#1 배열 활용 #include int main(void) { int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; for(i=0;i.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
-Part1- 제7장 반복문이란 무엇인가.
자료구조 (Data Structure).
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
토론을 위한 질문 배열의 이름에는 무엇이 저장되는가? C언어에서 배열 추상데이터의 store는 어떻게 구현 되는가?
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
제 8 장 포인터.
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
어서와 C언어는 처음이지 제23장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
어서와 C언어는 처음이지 제22장.
개정판 누구나 즐기는 C언어 콘서트 제12장 파일 입출력 출처: pixabay.
배열, 포인터, 함수 Review & 과제 1, 2.
3b장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
Presentation transcript:

쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express

동적 할당 메모리의 개념 프로그램이 메모리를 할당받는 방법 정적(static) 동적(dynamic) 정적 메모리 할당 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당받는 것 메모리의 크기는 프로그램이 시작하기 전에 결정 int i, j; int buffer[80]; char name[] = “data structure"; 처음에 결정된 크기보다 더 큰 입력이 들어온다면 처리하지 못함 더 작은 입력이 들어온다면 남은 메모리 공간은 낭비

동적 메모리 동적 메모리 실행 도중에 동적으로 메모리를 할당받는 것 사용이 끝나면 시스템에 메모리를 반납 필요한 만큼만 할당을 받고 메모리를 매우 효율적으로 사용 malloc() 계열의 라이브러리 함수를 사용

동적 메모리 할당의 과정 #include <stdio.h> #include <stdlib.h> int main(void) { int *pi; // 동적 메모리를 가리키는 포인터 pi = (int *)malloc(sizeof(int)); // ① 동적 메모리 할당 if( pi == NULL ) // 반환값이 NULL인지 검사 printf("동적 메모리 할당 오류\n"); exit(1); } *pi = 100; // ② 동적 메모리 사용 printf("%d\n", *pi); free(pi); // ③ 동적 메모리 반납 return 0;

malloc()과 free() void *malloc(size_t size); malloc()은 바이트 단위로 메모리를 할당 만약 요청한 메모리 공간을 할당할 수 없는 경우에는 NULL값을 반환 void free(void *ptr); free()는 동적으로 할당되었던 메모리 블록을 시스템에 반납 ptr은 malloc()을 이용하여 동적 할당된 메모리를 가리키는 포인터

malloc1.c #include <stdio.h> #include <stdlib.h> int main( void ) { char *pc = NULL; pc = (char *)malloc( sizeof(char) ); if( pc == NULL ) printf( "메모리 할당 오류\n" ); exit(1); } *pc = 'm'; printf( "*pc = %c\n", *pc ); free( pc ); return 0; 1000 바이트가 할당되었습니다. 메모리를 반납하였습니다.

malloc2.c // 메모리 동적 할당 #include <stdio.h> #include <stdlib.h> int main(void) { char *pc = NULL; int i = 0; pc = (char *)malloc(100*sizeof(char)); if( pc == NULL ) printf("메모리 할당 오류\n"); exit(1); } for(i=0;i<26;i++) *(pc+i) = 'a'+i; // 알파벳 소문자를 순서대로 대입 *(pc+i) = 0; // NULL 문자 추가 printf("%s\n", pc); free(pc); return 0; abcdefghijklmnopqrstuvwxyz

malloc3.c #include <stdio.h> #include <stdlib.h> int main(void) { int *pi; pi = (int *)malloc(5 * sizeof(int)); if(pi == NULL){ printf("메모리 할당 오류\n") ; exit(1); } pi[0] = 100; // *(pi+0) = 100;와 같다. pi[1] = 200; // *(pi+1) = 200;와 같다. pi[2] = 300; // *(pi+2) = 300;와 같다. pi[3] = 400; // *(pi+3) = 400;와 같다. pi[4] = 500; // *(pi+4) = 500;와 같다. free(pi); return 0;

malloc4.c #include <stdio.h> #include <stdlib.h> #include <string.h> struct Book { int number; char title[10]; }; int main(void) { struct Book *p; p = (struct Book *)malloc(2 * sizeof(struct Book)); if(p == NULL){ printf("메모리 할당 오류\n") ; exit(1); } p->number = 1; strcpy(p->title,"C Programming"); (p+1)->number = 2; strcpy((p+1)->title,"Data Structure"); free(p); return 0;

calloc()과 realloc() void *calloc(size_t n, size_t size); calloc()은 malloc()과는 다르게 0으로 초기화된 메모리 할당 항목 단위로 메모리를 할당 (예) int *p; p = (int *)calloc(5, sizeof(int)); void *realloc(void *memblock, size_t size); realloc() 함수는 할당하였던 메모리 블록의 크기를 변경 (예) int *p; p = (int *)malloc(5 * sizeof(int))); p = realloc(p, 7 * sizeof(int)));

연결 리스트 배열(array) 장점: 구현이 간단하고 빠르다 단점: 크기가 고정된다. 중간에서 삽입, 삭제가 어렵다. 연결 리스트(linked list) 각각의 원소가 포인터를 사용하여 다음 원소의 위치를 가리킨다.

연결 리스트의 장단점 중간에 데이터를 삽입, 삭제하는 경우 데이터를 저장할 공간이 필요할 때마다 동적으로 공간을 만들어서 쉽게 추가 구현이 어렵고 오류가 나기 쉽다.

연결 리스트의 구조 노드(node) = 데이터 필드(data field)+ 링크 필드(link field) 헤드 포인터(head pointer): 첫번째 노드를 가리키는 포인터

자기 참조 구조체 자기 참조 구조체(self-referential structure)는 특별한 구조체로서 구성 멤버 중에 같은 타입의 구조체를 가리키는 포인터가 존재하는 구조체 // 데이터의 정의 typedef struct data { int id; char name[20]; char phone[12]; } DATA; // 노드의 정의 typedef struct NODE { DATA data; struct NODE *link; } NODE;

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

연결 리스트의 삽입 연산 리스트의 처음에 삽입하는 경우 리스트의 중간에 삽입하는 경우 pnew->link = plist; NODE *insert_NODE(NODE *plist, NODE *pprev, DATA item); 리스트의 처음에 삽입하는 경우 pnew->link = plist; plist = pnew; 리스트의 중간에 삽입하는 경우 pnew->link = pprev->link;// ① pprev->link = pnew;// ②

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

연결 리스트의 삭제 연산 리스트의 처음을 삭제하는 경우 리스트의 중간에 삽입하는 경우 NODE *delete_node(NODE *plist, NODE *pprev, NODE *pcurr); 리스트의 처음을 삭제하는 경우 plist = pcurr->link; free(pcurr); 리스트의 중간에 삽입하는 경우 pprev->link = pcurr->link;

연결 리스트의 삭제 연산 NODE *delete_node(NODE *plist, NODE *pprev, NODE *pcurr) { if( pprev == NULL ) plist = pcurr->link; else pprev->link = pcurr->link; free(pcurr); return plist; }

연결 리스트의 순회 연산 void print_list(NODE *plist) { NODE *p; p = plist; printf("( "); while( p ) printf("%d ", p->data); p = p->link; } printf(")\n");

노드의 개수 세기 int get_length(NODE *plist) { NODE *p; int length = 0; p = plist; while( p ) length++; p = p->link; } printf("리스트의 길이는 %d\n", length); return length;

합계 구하기 int get_sum(NODE *plist) { NODE *p; int sum = 0; p = plist; while( p ) sum += p->data; p = p->link; } printf("리스트의 합계는 %d\n", sum); return sum;

Q & A